From 4d5a8b979651cbb9cc978a4d77bb4efea7fc8899 Mon Sep 17 00:00:00 2001 From: Angelos Chatzimparmpas Date: Fri, 3 Jul 2020 12:20:30 +0200 Subject: [PATCH] first commit --- backend/requirements.txt | 9 + backend/venv/.Python | 1 + backend/venv/bin/activate | 78 + backend/venv/bin/activate.csh | 55 + backend/venv/bin/activate.fish | 101 + backend/venv/bin/activate.ps1 | 72 + backend/venv/bin/activate.xsh | 46 + backend/venv/bin/activate_this.py | 46 + backend/venv/bin/easy_install | 10 + backend/venv/bin/easy_install-3.7 | 10 + backend/venv/bin/flask | 10 + backend/venv/bin/pip | 10 + backend/venv/bin/pip3 | 10 + backend/venv/bin/pip3.7 | 10 + backend/venv/bin/python | 1 + backend/venv/bin/python-config | 78 + backend/venv/bin/python3 | Bin 0 -> 8632 bytes backend/venv/bin/python3.7 | 1 + backend/venv/bin/wheel | 10 + backend/venv/include/python3.7m | 1 + backend/venv/lib/python3.7/LICENSE.txt | 1 + backend/venv/lib/python3.7/__future__.py | 1 + .../__pycache__/__future__.cpython-37.pyc | Bin 0 -> 4180 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 0 -> 1304 bytes .../_collections_abc.cpython-37.pyc | Bin 0 -> 28997 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 0 -> 7510 bytes .../python3.7/__pycache__/abc.cpython-37.pyc | Bin 0 -> 6506 bytes .../__pycache__/base64.cpython-37.pyc | Bin 0 -> 17107 bytes .../__pycache__/bisect.cpython-37.pyc | Bin 0 -> 2746 bytes .../__pycache__/codecs.cpython-37.pyc | Bin 0 -> 33953 bytes .../python3.7/__pycache__/copy.cpython-37.pyc | Bin 0 -> 7149 bytes .../__pycache__/copyreg.cpython-37.pyc | Bin 0 -> 4292 bytes .../python3.7/__pycache__/enum.cpython-37.pyc | Bin 0 -> 23795 bytes .../__pycache__/fnmatch.cpython-37.pyc | Bin 0 -> 3385 bytes .../__pycache__/functools.cpython-37.pyc | Bin 0 -> 23862 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 0 -> 3803 bytes .../__pycache__/hashlib.cpython-37.pyc | Bin 0 -> 6583 bytes .../__pycache__/heapq.cpython-37.pyc | Bin 0 -> 14410 bytes .../python3.7/__pycache__/hmac.cpython-37.pyc | Bin 0 -> 6161 bytes .../python3.7/__pycache__/io.cpython-37.pyc | Bin 0 -> 3464 bytes .../__pycache__/keyword.cpython-37.pyc | Bin 0 -> 1857 bytes .../__pycache__/linecache.cpython-37.pyc | Bin 0 -> 3837 bytes .../__pycache__/locale.cpython-37.pyc | Bin 0 -> 34603 bytes .../__pycache__/ntpath.cpython-37.pyc | Bin 0 -> 12967 bytes .../__pycache__/operator.cpython-37.pyc | Bin 0 -> 13948 bytes .../python3.7/__pycache__/os.cpython-37.pyc | Bin 0 -> 29748 bytes .../__pycache__/posixpath.cpython-37.pyc | Bin 0 -> 10451 bytes .../__pycache__/random.cpython-37.pyc | Bin 0 -> 19404 bytes .../python3.7/__pycache__/re.cpython-37.pyc | Bin 0 -> 13852 bytes .../__pycache__/reprlib.cpython-37.pyc | Bin 0 -> 5398 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 30593 bytes .../python3.7/__pycache__/site.cpython-37.pyc | Bin 0 -> 21829 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 0 -> 15251 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 0 -> 6339 bytes .../__pycache__/sre_parse.cpython-37.pyc | Bin 0 -> 21405 bytes .../python3.7/__pycache__/stat.cpython-37.pyc | Bin 0 -> 3928 bytes .../__pycache__/struct.cpython-37.pyc | Bin 0 -> 382 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 61833 bytes .../__pycache__/tempfile.cpython-37.pyc | Bin 0 -> 22193 bytes .../__pycache__/token.cpython-37.pyc | Bin 0 -> 3647 bytes .../__pycache__/tokenize.cpython-37.pyc | Bin 0 -> 17778 bytes .../__pycache__/types.cpython-37.pyc | Bin 0 -> 9022 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 0 -> 13814 bytes .../__pycache__/weakref.cpython-37.pyc | Bin 0 -> 19158 bytes backend/venv/lib/python3.7/_bootlocale.py | 1 + .../venv/lib/python3.7/_collections_abc.py | 1 + backend/venv/lib/python3.7/_dummy_thread.py | 1 + backend/venv/lib/python3.7/_weakrefset.py | 1 + backend/venv/lib/python3.7/abc.py | 1 + backend/venv/lib/python3.7/base64.py | 1 + backend/venv/lib/python3.7/bisect.py | 1 + backend/venv/lib/python3.7/codecs.py | 1 + backend/venv/lib/python3.7/collections | 1 + backend/venv/lib/python3.7/config-3.7m-darwin | 1 + backend/venv/lib/python3.7/copy.py | 1 + backend/venv/lib/python3.7/copyreg.py | 1 + .../venv/lib/python3.7/distutils/__init__.py | 134 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3196 bytes .../lib/python3.7/distutils/distutils.cfg | 6 + backend/venv/lib/python3.7/encodings | 1 + backend/venv/lib/python3.7/enum.py | 1 + backend/venv/lib/python3.7/fnmatch.py | 1 + backend/venv/lib/python3.7/functools.py | 1 + backend/venv/lib/python3.7/genericpath.py | 1 + backend/venv/lib/python3.7/hashlib.py | 1 + backend/venv/lib/python3.7/heapq.py | 1 + backend/venv/lib/python3.7/hmac.py | 1 + backend/venv/lib/python3.7/imp.py | 1 + backend/venv/lib/python3.7/importlib | 1 + backend/venv/lib/python3.7/io.py | 1 + backend/venv/lib/python3.7/keyword.py | 1 + backend/venv/lib/python3.7/lib-dynload | 1 + backend/venv/lib/python3.7/linecache.py | 1 + backend/venv/lib/python3.7/locale.py | 1 + .../lib/python3.7/no-global-site-packages.txt | 0 backend/venv/lib/python3.7/ntpath.py | 1 + backend/venv/lib/python3.7/operator.py | 1 + backend/venv/lib/python3.7/orig-prefix.txt | 1 + backend/venv/lib/python3.7/os.py | 1 + backend/venv/lib/python3.7/posixpath.py | 1 + backend/venv/lib/python3.7/random.py | 1 + backend/venv/lib/python3.7/re.py | 1 + backend/venv/lib/python3.7/readline.so | 1 + backend/venv/lib/python3.7/reprlib.py | 1 + backend/venv/lib/python3.7/rlcompleter.py | 1 + backend/venv/lib/python3.7/shutil.py | 1 + .../Flask-1.0.3.dist-info/INSTALLER | 1 + .../Flask-1.0.3.dist-info/LICENSE | 31 + .../Flask-1.0.3.dist-info/METADATA | 124 + .../Flask-1.0.3.dist-info/RECORD | 48 + .../site-packages/Flask-1.0.3.dist-info/WHEEL | 6 + .../Flask-1.0.3.dist-info/entry_points.txt | 3 + .../Flask-1.0.3.dist-info/top_level.txt | 1 + .../DESCRIPTION.rst | 134 + .../Flask_Cors-3.0.3.dist-info/INSTALLER | 1 + .../Flask_Cors-3.0.3.dist-info/METADATA | 158 + .../Flask_Cors-3.0.3.dist-info/RECORD | 17 + .../Flask_Cors-3.0.3.dist-info/WHEEL | 6 + .../Flask_Cors-3.0.3.dist-info/metadata.json | 1 + .../Flask_Cors-3.0.3.dist-info/top_level.txt | 1 + .../Flask_PyMongo-2.3.0.dist-info/INSTALLER | 1 + .../Flask_PyMongo-2.3.0.dist-info/LICENSE | 24 + .../Flask_PyMongo-2.3.0.dist-info/METADATA | 43 + .../Flask_PyMongo-2.3.0.dist-info/RECORD | 25 + .../Flask_PyMongo-2.3.0.dist-info/WHEEL | 6 + .../Flask_PyMongo-2.3.0.dist-info/pbr.json | 1 + .../top_level.txt | 1 + .../Jinja2-2.10.1.dist-info/INSTALLER | 1 + .../Jinja2-2.10.1.dist-info/LICENSE | 31 + .../Jinja2-2.10.1.dist-info/METADATA | 67 + .../Jinja2-2.10.1.dist-info/RECORD | 61 + .../Jinja2-2.10.1.dist-info/WHEEL | 6 + .../Jinja2-2.10.1.dist-info/entry_points.txt | 4 + .../Jinja2-2.10.1.dist-info/top_level.txt | 1 + .../MarkupSafe-1.0.dist-info/INSTALLER | 1 + .../MarkupSafe-1.0.dist-info/LICENSE | 33 + .../MarkupSafe-1.0.dist-info/METADATA | 135 + .../MarkupSafe-1.0.dist-info/RECORD | 16 + .../MarkupSafe-1.0.dist-info/WHEEL | 5 + .../MarkupSafe-1.0.dist-info/top_level.txt | 1 + .../Werkzeug-0.15.4.dist-info/INSTALLER | 1 + .../Werkzeug-0.15.4.dist-info/LICENSE.rst | 28 + .../Werkzeug-0.15.4.dist-info/METADATA | 133 + .../Werkzeug-0.15.4.dist-info/RECORD | 119 + .../Werkzeug-0.15.4.dist-info/WHEEL | 6 + .../Werkzeug-0.15.4.dist-info/top_level.txt | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 333 bytes .../__pycache__/itsdangerous.cpython-37.pyc | Bin 0 -> 29348 bytes .../__pycache__/six.cpython-37.pyc | Bin 0 -> 24991 bytes .../python3.7/site-packages/bson/__init__.py | 1170 + .../bson/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 32798 bytes .../bson/__pycache__/binary.cpython-37.pyc | Bin 0 -> 5272 bytes .../bson/__pycache__/code.cpython-37.pyc | Bin 0 -> 2918 bytes .../__pycache__/codec_options.cpython-37.pyc | Bin 0 -> 11935 bytes .../bson/__pycache__/dbref.cpython-37.pyc | Bin 0 -> 4368 bytes .../__pycache__/decimal128.cpython-37.pyc | Bin 0 -> 9684 bytes .../bson/__pycache__/errors.cpython-37.pyc | Bin 0 -> 1316 bytes .../bson/__pycache__/int64.cpython-37.pyc | Bin 0 -> 816 bytes .../bson/__pycache__/json_util.cpython-37.pyc | Bin 0 -> 22881 bytes .../bson/__pycache__/max_key.cpython-37.pyc | Bin 0 -> 1561 bytes .../bson/__pycache__/min_key.cpython-37.pyc | Bin 0 -> 1561 bytes .../bson/__pycache__/objectid.cpython-37.pyc | Bin 0 -> 9116 bytes .../bson/__pycache__/py3compat.cpython-37.pyc | Bin 0 -> 2621 bytes .../bson/__pycache__/raw_bson.cpython-37.pyc | Bin 0 -> 4211 bytes .../bson/__pycache__/regex.cpython-37.pyc | Bin 0 -> 4074 bytes .../bson/__pycache__/son.cpython-37.pyc | Bin 0 -> 6377 bytes .../bson/__pycache__/timestamp.cpython-37.pyc | Bin 0 -> 3959 bytes .../bson/__pycache__/tz_util.cpython-37.pyc | Bin 0 -> 1515 bytes .../bson/_cbson.cpython-37m-darwin.so | Bin 0 -> 55768 bytes .../python3.7/site-packages/bson/binary.py | 242 + .../lib/python3.7/site-packages/bson/code.py | 99 + .../site-packages/bson/codec_options.py | 334 + .../lib/python3.7/site-packages/bson/dbref.py | 135 + .../site-packages/bson/decimal128.py | 335 + .../python3.7/site-packages/bson/errors.py | 40 + .../lib/python3.7/site-packages/bson/int64.py | 34 + .../python3.7/site-packages/bson/json_util.py | 829 + .../python3.7/site-packages/bson/max_key.py | 50 + .../python3.7/site-packages/bson/min_key.py | 50 + .../python3.7/site-packages/bson/objectid.py | 299 + .../python3.7/site-packages/bson/py3compat.py | 107 + .../python3.7/site-packages/bson/raw_bson.py | 124 + .../lib/python3.7/site-packages/bson/regex.py | 128 + .../lib/python3.7/site-packages/bson/son.py | 200 + .../python3.7/site-packages/bson/timestamp.py | 120 + .../python3.7/site-packages/bson/tz_util.py | 52 + .../click-6.7.dist-info/DESCRIPTION.rst | 3 + .../click-6.7.dist-info/INSTALLER | 1 + .../click-6.7.dist-info/METADATA | 16 + .../site-packages/click-6.7.dist-info/RECORD | 41 + .../site-packages/click-6.7.dist-info/WHEEL | 6 + .../click-6.7.dist-info/metadata.json | 1 + .../click-6.7.dist-info/top_level.txt | 1 + .../python3.7/site-packages/click/__init__.py | 98 + .../click/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2741 bytes .../__pycache__/_bashcomplete.cpython-37.pyc | Bin 0 -> 2391 bytes .../click/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 15450 bytes .../__pycache__/_termui_impl.cpython-37.pyc | Bin 0 -> 12923 bytes .../__pycache__/_textwrap.cpython-37.pyc | Bin 0 -> 1350 bytes .../__pycache__/_unicodefun.cpython-37.pyc | Bin 0 -> 3226 bytes .../__pycache__/_winconsole.cpython-37.pyc | Bin 0 -> 7456 bytes .../click/__pycache__/core.cpython-37.pyc | Bin 0 -> 56579 bytes .../__pycache__/decorators.cpython-37.pyc | Bin 0 -> 11496 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 7752 bytes .../__pycache__/formatting.cpython-37.pyc | Bin 0 -> 8566 bytes .../click/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1898 bytes .../click/__pycache__/parser.cpython-37.pyc | Bin 0 -> 11485 bytes .../click/__pycache__/termui.cpython-37.pyc | Bin 0 -> 18863 bytes .../click/__pycache__/testing.cpython-37.pyc | Bin 0 -> 10257 bytes .../click/__pycache__/types.cpython-37.pyc | Bin 0 -> 17506 bytes .../click/__pycache__/utils.cpython-37.pyc | Bin 0 -> 14119 bytes .../site-packages/click/_bashcomplete.py | 83 + .../python3.7/site-packages/click/_compat.py | 648 + .../site-packages/click/_termui_impl.py | 547 + .../site-packages/click/_textwrap.py | 38 + .../site-packages/click/_unicodefun.py | 118 + .../site-packages/click/_winconsole.py | 273 + .../lib/python3.7/site-packages/click/core.py | 1744 + .../site-packages/click/decorators.py | 304 + .../site-packages/click/exceptions.py | 201 + .../site-packages/click/formatting.py | 256 + .../python3.7/site-packages/click/globals.py | 48 + .../python3.7/site-packages/click/parser.py | 426 + .../python3.7/site-packages/click/termui.py | 539 + .../python3.7/site-packages/click/testing.py | 322 + .../python3.7/site-packages/click/types.py | 550 + .../python3.7/site-packages/click/utils.py | 415 + .../python3.7/site-packages/easy_install.py | 5 + .../python3.7/site-packages/flask/__init__.py | 49 + .../python3.7/site-packages/flask/__main__.py | 14 + .../flask/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1850 bytes .../flask/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 477 bytes .../flask/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 3330 bytes .../flask/__pycache__/app.cpython-37.pyc | Bin 0 -> 71414 bytes .../__pycache__/blueprints.cpython-37.pyc | Bin 0 -> 20472 bytes .../flask/__pycache__/cli.cpython-37.pyc | Bin 0 -> 25067 bytes .../flask/__pycache__/config.cpython-37.pyc | Bin 0 -> 10210 bytes .../flask/__pycache__/ctx.cpython-37.pyc | Bin 0 -> 13986 bytes .../__pycache__/debughelpers.cpython-37.pyc | Bin 0 -> 6625 bytes .../flask/__pycache__/globals.cpython-37.pyc | Bin 0 -> 1777 bytes .../flask/__pycache__/helpers.cpython-37.pyc | Bin 0 -> 33264 bytes .../flask/__pycache__/logging.cpython-37.pyc | Bin 0 -> 2406 bytes .../flask/__pycache__/sessions.cpython-37.pyc | Bin 0 -> 12272 bytes .../flask/__pycache__/signals.cpython-37.pyc | Bin 0 -> 2438 bytes .../__pycache__/templating.cpython-37.pyc | Bin 0 -> 4987 bytes .../flask/__pycache__/testing.cpython-37.pyc | Bin 0 -> 7860 bytes .../flask/__pycache__/views.cpython-37.pyc | Bin 0 -> 4800 bytes .../flask/__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 6794 bytes .../python3.7/site-packages/flask/_compat.py | 101 + .../lib/python3.7/site-packages/flask/app.py | 2334 ++ .../site-packages/flask/blueprints.py | 447 + .../lib/python3.7/site-packages/flask/cli.py | 910 + .../python3.7/site-packages/flask/config.py | 269 + .../lib/python3.7/site-packages/flask/ctx.py | 457 + .../site-packages/flask/debughelpers.py | 168 + .../python3.7/site-packages/flask/globals.py | 61 + .../python3.7/site-packages/flask/helpers.py | 1051 + .../site-packages/flask/json/__init__.py | 357 + .../json/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 11443 bytes .../flask/json/__pycache__/tag.cpython-37.pyc | Bin 0 -> 11106 bytes .../python3.7/site-packages/flask/json/tag.py | 300 + .../python3.7/site-packages/flask/logging.py | 78 + .../python3.7/site-packages/flask/sessions.py | 385 + .../python3.7/site-packages/flask/signals.py | 57 + .../site-packages/flask/templating.py | 150 + .../python3.7/site-packages/flask/testing.py | 246 + .../python3.7/site-packages/flask/views.py | 158 + .../python3.7/site-packages/flask/wrappers.py | 216 + .../site-packages/flask_cors/__init__.py | 32 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1122 bytes .../__pycache__/core.cpython-37.pyc | Bin 0 -> 10310 bytes .../__pycache__/decorator.cpython-37.pyc | Bin 0 -> 4716 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 7025 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 218 bytes .../site-packages/flask_cors/core.py | 378 + .../site-packages/flask_cors/decorator.py | 135 + .../site-packages/flask_cors/extension.py | 186 + .../site-packages/flask_cors/version.py | 1 + .../site-packages/flask_pymongo/__init__.py | 241 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 7363 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 270 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 3428 bytes .../site-packages/flask_pymongo/_version.py | 5 + .../flask_pymongo/tests/__init__.py | 0 .../tests/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../__pycache__/test_config.cpython-37.pyc | Bin 0 -> 4544 bytes .../__pycache__/test_gridfs.cpython-37.pyc | Bin 0 -> 4930 bytes .../test_url_converter.cpython-37.pyc | Bin 0 -> 942 bytes .../__pycache__/test_wrappers.cpython-37.pyc | Bin 0 -> 1184 bytes .../tests/__pycache__/util.cpython-37.pyc | Bin 0 -> 2016 bytes .../flask_pymongo/tests/test_config.py | 108 + .../flask_pymongo/tests/test_gridfs.py | 100 + .../flask_pymongo/tests/test_url_converter.py | 17 + .../flask_pymongo/tests/test_wrappers.py | 33 + .../site-packages/flask_pymongo/tests/util.py | 48 + .../site-packages/flask_pymongo/wrappers.py | 117 + .../site-packages/gridfs/__init__.py | 930 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 34102 bytes .../gridfs/__pycache__/errors.cpython-37.pyc | Bin 0 -> 1110 bytes .../__pycache__/grid_file.cpython-37.pyc | Bin 0 -> 26461 bytes .../python3.7/site-packages/gridfs/errors.py | 33 + .../site-packages/gridfs/grid_file.py | 840 + .../itsdangerous-0.24.dist-info/INSTALLER | 1 + .../itsdangerous-0.24.dist-info/LICENSE | 31 + .../itsdangerous-0.24.dist-info/METADATA | 16 + .../itsdangerous-0.24.dist-info/RECORD | 8 + .../itsdangerous-0.24.dist-info/WHEEL | 5 + .../itsdangerous-0.24.dist-info/top_level.txt | 1 + .../python3.7/site-packages/itsdangerous.py | 872 + .../site-packages/jinja2/__init__.py | 83 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2556 bytes .../jinja2/__pycache__/_compat.cpython-37.pyc | Bin 0 -> 3369 bytes .../__pycache__/_identifier.cpython-37.pyc | Bin 0 -> 1867 bytes .../__pycache__/asyncfilters.cpython-37.pyc | Bin 0 -> 4799 bytes .../__pycache__/asyncsupport.cpython-37.pyc | Bin 0 -> 8147 bytes .../jinja2/__pycache__/bccache.cpython-37.pyc | Bin 0 -> 12736 bytes .../__pycache__/compiler.cpython-37.pyc | Bin 0 -> 46865 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 1730 bytes .../jinja2/__pycache__/debug.cpython-37.pyc | Bin 0 -> 9346 bytes .../__pycache__/defaults.cpython-37.pyc | Bin 0 -> 1480 bytes .../__pycache__/environment.cpython-37.pyc | Bin 0 -> 43275 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5044 bytes .../jinja2/__pycache__/ext.cpython-37.pyc | Bin 0 -> 20065 bytes .../jinja2/__pycache__/filters.cpython-37.pyc | Bin 0 -> 34410 bytes .../__pycache__/idtracking.cpython-37.pyc | Bin 0 -> 9980 bytes .../jinja2/__pycache__/lexer.cpython-37.pyc | Bin 0 -> 18537 bytes .../jinja2/__pycache__/loaders.cpython-37.pyc | Bin 0 -> 16600 bytes .../jinja2/__pycache__/meta.cpython-37.pyc | Bin 0 -> 3693 bytes .../__pycache__/nativetypes.cpython-37.pyc | Bin 0 -> 5149 bytes .../jinja2/__pycache__/nodes.cpython-37.pyc | Bin 0 -> 36109 bytes .../__pycache__/optimizer.cpython-37.pyc | Bin 0 -> 2060 bytes .../jinja2/__pycache__/parser.cpython-37.pyc | Bin 0 -> 25204 bytes .../jinja2/__pycache__/runtime.cpython-37.pyc | Bin 0 -> 24612 bytes .../jinja2/__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 14214 bytes .../jinja2/__pycache__/tests.cpython-37.pyc | Bin 0 -> 4436 bytes .../jinja2/__pycache__/utils.cpython-37.pyc | Bin 0 -> 20813 bytes .../jinja2/__pycache__/visitor.cpython-37.pyc | Bin 0 -> 3376 bytes .../python3.7/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.7/site-packages/jinja2/bccache.py | 362 + .../site-packages/jinja2/compiler.py | 1721 + .../site-packages/jinja2/constants.py | 32 + .../python3.7/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.7/site-packages/jinja2/ext.py | 627 + .../python3.7/site-packages/jinja2/filters.py | 1190 + .../site-packages/jinja2/idtracking.py | 286 + .../python3.7/site-packages/jinja2/lexer.py | 739 + .../python3.7/site-packages/jinja2/loaders.py | 481 + .../python3.7/site-packages/jinja2/meta.py | 106 + .../site-packages/jinja2/nativetypes.py | 220 + .../python3.7/site-packages/jinja2/nodes.py | 999 + .../site-packages/jinja2/optimizer.py | 49 + .../python3.7/site-packages/jinja2/parser.py | 903 + .../python3.7/site-packages/jinja2/runtime.py | 813 + .../python3.7/site-packages/jinja2/sandbox.py | 486 + .../python3.7/site-packages/jinja2/tests.py | 175 + .../python3.7/site-packages/jinja2/utils.py | 647 + .../python3.7/site-packages/jinja2/visitor.py | 87 + .../site-packages/markupsafe/__init__.py | 305 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 11335 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 820 bytes .../__pycache__/_constants.cpython-37.pyc | Bin 0 -> 4388 bytes .../__pycache__/_native.cpython-37.pyc | Bin 0 -> 1453 bytes .../site-packages/markupsafe/_compat.py | 26 + .../site-packages/markupsafe/_constants.py | 267 + .../site-packages/markupsafe/_native.py | 46 + .../site-packages/markupsafe/_speedups.c | 239 + .../_speedups.cpython-37m-darwin.so | Bin 0 -> 10584 bytes .../pip-19.1.1.dist-info/INSTALLER | 1 + .../pip-19.1.1.dist-info/LICENSE.txt | 20 + .../pip-19.1.1.dist-info/METADATA | 75 + .../site-packages/pip-19.1.1.dist-info/RECORD | 618 + .../site-packages/pip-19.1.1.dist-info/WHEEL | 6 + .../pip-19.1.1.dist-info/entry_points.txt | 5 + .../pip-19.1.1.dist-info/top_level.txt | 1 + .../python3.7/site-packages/pip/__init__.py | 1 + .../python3.7/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 458 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1850 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 7447 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 7058 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 9752 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 20920 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 11750 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 28780 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4439 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 8169 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 3186 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 0 -> 9104 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 26080 bytes .../site-packages/pip/_internal/build_env.py | 215 + .../site-packages/pip/_internal/cache.py | 224 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 281 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 5094 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 7801 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 16865 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2367 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8945 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 410 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 340 + .../pip/_internal/cli/cmdoptions.py | 809 + .../pip/_internal/cli/main_parser.py | 104 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2509 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1334 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 3083 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6911 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4722 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2879 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 2073 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1249 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 12896 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8740 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4315 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 5896 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2705 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 5008 bytes .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 253 + .../pip/_internal/commands/download.py | 176 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 587 + .../pip/_internal/commands/list.py | 302 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 186 + .../pip/_internal/configuration.py | 384 + .../site-packages/pip/_internal/download.py | 979 + .../site-packages/pip/_internal/exceptions.py | 274 + .../site-packages/pip/_internal/index.py | 1108 + .../site-packages/pip/_internal/locations.py | 211 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 269 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1302 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2272 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1173 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 4992 bytes .../pip/_internal/models/candidate.py | 31 + .../pip/_internal/models/format_control.py | 73 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 163 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 205 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3635 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 5620 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 10549 bytes .../pip/_internal/operations/check.py | 155 + .../pip/_internal/operations/freeze.py | 247 + .../pip/_internal/operations/prepare.py | 426 + .../site-packages/pip/_internal/pep425tags.py | 381 + .../site-packages/pip/_internal/pyproject.py | 171 + .../pip/_internal/req/__init__.py | 78 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1716 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 7619 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 9232 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 24994 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5677 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 3228 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 17291 bytes .../pip/_internal/req/constructors.py | 340 + .../pip/_internal/req/req_file.py | 383 + .../pip/_internal/req/req_install.py | 1028 + .../pip/_internal/req/req_set.py | 193 + .../pip/_internal/req/req_tracker.py | 96 + .../pip/_internal/req/req_uninstall.py | 633 + .../site-packages/pip/_internal/resolve.py | 393 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 8031 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 6148 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2609 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1284 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 669 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1688 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 3607 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 9031 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 25027 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1949 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 0 -> 3950 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2621 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 395 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 4922 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1330 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 11760 bytes .../pip/_internal/utils/appdirs.py | 268 + .../pip/_internal/utils/compat.py | 264 + .../pip/_internal/utils/deprecation.py | 93 + .../pip/_internal/utils/encoding.py | 39 + .../pip/_internal/utils/filesystem.py | 30 + .../pip/_internal/utils/glibc.py | 93 + .../pip/_internal/utils/hashes.py | 115 + .../pip/_internal/utils/logging.py | 371 + .../site-packages/pip/_internal/utils/misc.py | 1011 + .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 162 + .../pip/_internal/utils/packaging.py | 85 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 155 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 424 + .../pip/_internal/vcs/__init__.py | 604 + .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 17040 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3441 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9085 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 3703 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 6732 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 103 + .../site-packages/pip/_internal/vcs/git.py | 362 + .../pip/_internal/vcs/mercurial.py | 105 + .../pip/_internal/vcs/subversion.py | 234 + .../site-packages/pip/_internal/wheel.py | 1098 + .../site-packages/pip/_vendor/__init__.py | 109 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2867 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20617 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 0 -> 36330 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 0 -> 66460 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 221818 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 0 -> 8098 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 26422 bytes .../site-packages/pip/_vendor/appdirs.py | 604 + .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 558 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 0 -> 1561 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 0 -> 3044 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 1774 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 765 bytes .../__pycache__/controller.cpython-37.pyc | Bin 0 -> 7644 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 0 -> 2162 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 0 -> 4682 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 0 -> 4246 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 0 -> 666 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 302 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 0 -> 3236 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1558 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 265 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 268 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 477 bytes .../pip/_vendor/certifi/cacert.pem | 4658 +++ .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 852 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 0 -> 27187 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 0 -> 1128 bytes .../chardistribution.cpython-37.pyc | Bin 0 -> 6314 bytes .../charsetgroupprober.cpython-37.pyc | Bin 0 -> 2235 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 0 -> 3445 bytes .../codingstatemachine.cpython-37.pyc | Bin 0 -> 2892 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 0 -> 363 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 0 -> 1135 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 0 -> 2626 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 0 -> 2613 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 0 -> 7074 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 0 -> 2421 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 0 -> 12071 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 0 -> 27191 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 0 -> 19115 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 0 -> 1144 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 0 -> 2978 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 0 -> 22143 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 0 -> 38022 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 0 -> 23636 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 0 -> 29092 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 0 -> 23594 bytes .../langhebrewmodel.cpython-37.pyc | Bin 0 -> 22223 bytes .../langhungarianmodel.cpython-37.pyc | Bin 0 -> 23625 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 0 -> 22202 bytes .../langturkishmodel.cpython-37.pyc | Bin 0 -> 22225 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 0 -> 2935 bytes .../mbcharsetprober.cpython-37.pyc | Bin 0 -> 2240 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 0 -> 1131 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 0 -> 15686 bytes .../sbcharsetprober.cpython-37.pyc | Bin 0 -> 2993 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 0 -> 2447 bytes .../universaldetector.cpython-37.pyc | Bin 0 -> 5837 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 0 -> 1978 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 447 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 204 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 0 -> 2693 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 + .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 452 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3350 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7606 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1671 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3865 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4613 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1050 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 0 -> 32060 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 42581 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 0 -> 17346 bytes .../__pycache__/locators.cpython-37.pyc | Bin 0 -> 38732 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 10298 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 4484 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 0 -> 27694 bytes .../__pycache__/resources.cpython-37.pyc | Bin 0 -> 10894 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 0 -> 11084 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 47962 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 20434 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25370 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 492 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 0 -> 1089 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 21405 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 0 -> 15870 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 62735 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 + .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 + .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++ .../pip/_vendor/distlib/compat.py | 1120 + .../pip/_vendor/distlib/database.py | 1339 + .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1295 + .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1094 + .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 417 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../site-packages/pip/_vendor/distlib/util.py | 1756 + .../pip/_vendor/distlib/version.py | 736 + .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 988 + .../site-packages/pip/_vendor/distro.py | 1216 + .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1321 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 0 -> 13768 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 0 -> 22659 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 0 -> 41560 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 0 -> 3313 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 66225 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 0 -> 97822 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 10838 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 + .../pip/_vendor/html5lib/_tokenizer.py | 1721 + .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 434 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 0 -> 1517 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 0 -> 2036 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 0 -> 2239 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 0 -> 1325 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 0 -> 859 bytes .../inject_meta_charset.cpython-37.pyc | Bin 0 -> 1879 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 0 -> 2643 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 0 -> 2770 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 0 -> 16445 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 0 -> 1363 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 + .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 948 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1545 bytes .../__pycache__/sax.cpython-37.pyc | Bin 0 -> 1495 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3329 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 11252 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 9282 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 11861 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 11801 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4006 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 7002 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 1731 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 3538 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 6647 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1905 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 266 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 0 -> 3073 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 0 -> 626 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 9069 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 21440 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 0 -> 1806 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 220 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 176100 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 396 + .../pip/_vendor/idna/idnadata.py | 1979 ++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8205 +++++ .../site-packages/pip/_vendor/ipaddress.py | 2419 ++ .../pip/_vendor/lockfile/__init__.py | 347 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9916 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 0 -> 2297 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 0 -> 4859 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 0 -> 3758 bytes .../symlinklockfile.cpython-37.pyc | Bin 0 -> 2182 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2078 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 227 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 2183 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 0 -> 24555 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 + .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 740 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 578 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1018 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2870 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8873 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3991 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19768 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1456 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11960 bytes .../pip/_vendor/packaging/_compat.py | 31 + .../pip/_vendor/packaging/_structures.py | 68 + .../pip/_vendor/packaging/markers.py | 296 + .../pip/_vendor/packaging/requirements.py | 138 + .../pip/_vendor/packaging/specifiers.py | 749 + .../pip/_vendor/packaging/utils.py | 57 + .../pip/_vendor/packaging/version.py | 420 + .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 291 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 5634 bytes .../pep517/__pycache__/build.cpython-37.pyc | Bin 0 -> 2769 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4817 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2923 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 1027 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4211 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 5492 bytes .../pip/_vendor/pep517/_in_process.py | 207 + .../site-packages/pip/_vendor/pep517/build.py | 108 + .../site-packages/pip/_vendor/pep517/check.py | 202 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 158 + .../pip/_vendor/pep517/wrappers.py | 163 + .../pip/_vendor/pkg_resources/__init__.py | 3286 ++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99587 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 651 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5567 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1471 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1436 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 6493 ++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 385 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 0 -> 948 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 0 -> 10065 bytes .../pytoml/__pycache__/test.cpython-37.pyc | Bin 0 -> 1248 bytes .../pytoml/__pycache__/utils.cpython-37.pyc | Bin 0 -> 2147 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 0 -> 3582 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 341 + .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 106 + .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3496 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 559 bytes .../_internal_utils.cpython-37.pyc | Bin 0 -> 1317 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 0 -> 16894 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 0 -> 6500 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 0 -> 8351 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 0 -> 642 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 0 -> 18796 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5514 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 0 -> 2695 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 989 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 24117 bytes .../__pycache__/packages.cpython-37.pyc | Bin 0 -> 519 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 19437 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 4175 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4388 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 22048 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 + .../site-packages/pip/_vendor/requests/api.py | 158 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 74 + .../pip/_vendor/requests/cookies.py | 549 + .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 953 + .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 770 + .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 977 + .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 952 + .../pip/_vendor/urllib3/__init__.py | 92 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2124 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 0 -> 10688 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 10157 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 0 -> 23662 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10409 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 0 -> 5877 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2769 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 0 -> 12729 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 5591 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 18756 bytes .../pip/_vendor/urllib3/_collections.py | 329 + .../pip/_vendor/urllib3/connection.py | 391 + .../pip/_vendor/urllib3/connectionpool.py | 896 + .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../_appengine_environ.cpython-37.pyc | Bin 0 -> 1104 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 0 -> 8323 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 0 -> 3250 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14486 bytes .../securetransport.cpython-37.pyc | Bin 0 -> 17905 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 0 -> 4914 bytes .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 0 -> 10320 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 0 -> 7501 bytes .../contrib/_securetransport/bindings.py | 593 + .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 289 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 + .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 322 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 0 -> 1313 bytes .../urllib3/packages/backports/makefile.py | 53 + .../pip/_vendor/urllib3/packages/six.py | 868 + .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 563 bytes .../_implementation.cpython-37.pyc | Bin 0 -> 3322 bytes .../ssl_match_hostname/_implementation.py | 156 + .../pip/_vendor/urllib3/poolmanager.py | 450 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 705 + .../pip/_vendor/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1000 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 3175 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 0 -> 1049 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 0 -> 3230 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 0 -> 1978 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 0 -> 12664 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 9556 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 0 -> 8779 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 0 -> 5189 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 3141 bytes .../pip/_vendor/urllib3/util/connection.py | 134 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 87 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 381 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 150 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9684 bytes .../__pycache__/labels.cpython-37.pyc | Bin 0 -> 4098 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 0 -> 1920 bytes .../__pycache__/tests.cpython-37.pyc | Bin 0 -> 5061 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 0 -> 2673 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3286 ++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99636 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 646 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20697 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203052 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../pkg_resources/_vendor/appdirs.py | 608 + .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 745 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 583 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1035 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2887 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8895 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3900 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19813 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 514 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10580 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 + .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++ .../pkg_resources/_vendor/six.py | 868 + .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2428 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../pymongo-3.8.0.dist-info/INSTALLER | 1 + .../pymongo-3.8.0.dist-info/METADATA | 243 + .../pymongo-3.8.0.dist-info/RECORD | 145 + .../pymongo-3.8.0.dist-info/WHEEL | 5 + .../pymongo-3.8.0.dist-info/top_level.txt | 3 + .../site-packages/pymongo/__init__.py | 99 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1579 bytes .../pymongo/__pycache__/auth.cpython-37.pyc | Bin 0 -> 13164 bytes .../pymongo/__pycache__/bulk.cpython-37.pyc | Bin 0 -> 19199 bytes .../__pycache__/change_stream.cpython-37.pyc | Bin 0 -> 10520 bytes .../__pycache__/client_options.cpython-37.pyc | Bin 0 -> 7951 bytes .../__pycache__/client_session.cpython-37.pyc | Bin 0 -> 20005 bytes .../__pycache__/collation.cpython-37.pyc | Bin 0 -> 6501 bytes .../__pycache__/collection.cpython-37.pyc | Bin 0 -> 117932 bytes .../__pycache__/command_cursor.cpython-37.pyc | Bin 0 -> 9927 bytes .../pymongo/__pycache__/common.cpython-37.pyc | Bin 0 -> 19152 bytes .../compression_support.cpython-37.pyc | Bin 0 -> 3349 bytes .../pymongo/__pycache__/cursor.cpython-37.pyc | Bin 0 -> 37047 bytes .../__pycache__/cursor_manager.cpython-37.pyc | Bin 0 -> 1954 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 54085 bytes .../__pycache__/driver_info.cpython-37.pyc | Bin 0 -> 1380 bytes .../pymongo/__pycache__/errors.cpython-37.pyc | Bin 0 -> 10105 bytes .../__pycache__/helpers.cpython-37.pyc | Bin 0 -> 6138 bytes .../__pycache__/ismaster.cpython-37.pyc | Bin 0 -> 5102 bytes .../max_staleness_selectors.cpython-37.pyc | Bin 0 -> 2466 bytes .../__pycache__/message.cpython-37.pyc | Bin 0 -> 36820 bytes .../__pycache__/mongo_client.cpython-37.pyc | Bin 0 -> 72783 bytes .../mongo_replica_set_client.cpython-37.pyc | Bin 0 -> 1876 bytes .../__pycache__/monitor.cpython-37.pyc | Bin 0 -> 4764 bytes .../__pycache__/monitoring.cpython-37.pyc | Bin 0 -> 34278 bytes .../__pycache__/monotonic.cpython-37.pyc | Bin 0 -> 509 bytes .../__pycache__/network.cpython-37.pyc | Bin 0 -> 7363 bytes .../__pycache__/operations.cpython-37.pyc | Bin 0 -> 13893 bytes .../periodic_executor.cpython-37.pyc | Bin 0 -> 3719 bytes .../pymongo/__pycache__/pool.cpython-37.pyc | Bin 0 -> 29191 bytes .../__pycache__/read_concern.cpython-37.pyc | Bin 0 -> 2303 bytes .../read_preferences.cpython-37.pyc | Bin 0 -> 16361 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 3330 bytes .../__pycache__/results.cpython-37.pyc | Bin 0 -> 8754 bytes .../__pycache__/saslprep.cpython-37.pyc | Bin 0 -> 2444 bytes .../pymongo/__pycache__/server.cpython-37.pyc | Bin 0 -> 4643 bytes .../server_description.cpython-37.pyc | Bin 0 -> 6261 bytes .../server_selectors.cpython-37.pyc | Bin 0 -> 5714 bytes .../__pycache__/server_type.cpython-37.pyc | Bin 0 -> 450 bytes .../__pycache__/settings.cpython-37.pyc | Bin 0 -> 4187 bytes .../son_manipulator.cpython-37.pyc | Bin 0 -> 7510 bytes .../__pycache__/ssl_context.cpython-37.pyc | Bin 0 -> 3381 bytes .../ssl_match_hostname.cpython-37.pyc | Bin 0 -> 3019 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 3818 bytes .../__pycache__/thread_util.cpython-37.pyc | Bin 0 -> 4192 bytes .../__pycache__/topology.cpython-37.pyc | Bin 0 -> 17465 bytes .../topology_description.cpython-37.pyc | Bin 0 -> 13513 bytes .../__pycache__/uri_parser.cpython-37.pyc | Bin 0 -> 11207 bytes .../__pycache__/write_concern.cpython-37.pyc | Bin 0 -> 4584 bytes .../pymongo/_cmessage.cpython-37m-darwin.so | Bin 0 -> 31272 bytes .../python3.7/site-packages/pymongo/auth.py | 570 + .../python3.7/site-packages/pymongo/bulk.py | 702 + .../site-packages/pymongo/change_stream.py | 334 + .../site-packages/pymongo/client_options.py | 237 + .../site-packages/pymongo/client_session.py | 655 + .../site-packages/pymongo/collation.py | 225 + .../site-packages/pymongo/collection.py | 3356 ++ .../site-packages/pymongo/command_cursor.py | 345 + .../python3.7/site-packages/pymongo/common.py | 733 + .../pymongo/compression_support.py | 124 + .../python3.7/site-packages/pymongo/cursor.py | 1327 + .../site-packages/pymongo/cursor_manager.py | 65 + .../site-packages/pymongo/database.py | 1465 + .../site-packages/pymongo/driver_info.py | 39 + .../python3.7/site-packages/pymongo/errors.py | 249 + .../site-packages/pymongo/helpers.py | 272 + .../site-packages/pymongo/ismaster.py | 158 + .../pymongo/max_staleness_selectors.py | 116 + .../site-packages/pymongo/message.py | 1555 + .../site-packages/pymongo/mongo_client.py | 1950 ++ .../pymongo/mongo_replica_set_client.py | 48 + .../site-packages/pymongo/monitor.py | 184 + .../site-packages/pymongo/monitoring.py | 931 + .../site-packages/pymongo/monotonic.py | 38 + .../site-packages/pymongo/network.py | 305 + .../site-packages/pymongo/operations.py | 370 + .../pymongo/periodic_executor.py | 174 + .../python3.7/site-packages/pymongo/pool.py | 1113 + .../site-packages/pymongo/read_concern.py | 76 + .../site-packages/pymongo/read_preferences.py | 471 + .../site-packages/pymongo/response.py | 101 + .../site-packages/pymongo/results.py | 226 + .../site-packages/pymongo/saslprep.py | 108 + .../python3.7/site-packages/pymongo/server.py | 169 + .../pymongo/server_description.py | 202 + .../site-packages/pymongo/server_selectors.py | 156 + .../site-packages/pymongo/server_type.py | 23 + .../site-packages/pymongo/settings.py | 123 + .../site-packages/pymongo/son_manipulator.py | 191 + .../site-packages/pymongo/ssl_context.py | 96 + .../pymongo/ssl_match_hostname.py | 135 + .../site-packages/pymongo/ssl_support.py | 191 + .../site-packages/pymongo/thread_util.py | 131 + .../site-packages/pymongo/topology.py | 633 + .../pymongo/topology_description.py | 545 + .../site-packages/pymongo/uri_parser.py | 429 + .../site-packages/pymongo/write_concern.py | 126 + .../setuptools-41.0.1.dist-info/INSTALLER | 1 + .../setuptools-41.0.1.dist-info/LICENSE | 19 + .../setuptools-41.0.1.dist-info/METADATA | 77 + .../setuptools-41.0.1.dist-info/RECORD | 186 + .../setuptools-41.0.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-41.0.1.dist-info/top_level.txt | 3 + .../setuptools-41.0.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 7710 bytes .../_deprecation_warning.cpython-37.pyc | Bin 0 -> 564 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5145 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 8303 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 17707 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 0 -> 871 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5280 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 42103 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1991 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1556 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3766 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 870 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2449 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 4650 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 34447 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3628 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32714 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7218 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 827 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1225 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1436 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15552 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1518 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6808 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1185 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 344 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 6997 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 1027 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203049 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24407 bytes .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 742 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 580 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1032 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2884 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8889 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3891 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19810 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 511 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10577 bytes .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 + .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../setuptools/_vendor/pyparsing.py | 5742 ++++ .../site-packages/setuptools/_vendor/six.py | 868 + .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 254 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 18 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 752 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2420 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 14208 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1799 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 990 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 0 -> 2469 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 9723 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8599 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6480 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 0 -> 1395 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 64851 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21697 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 4027 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2428 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 4104 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2307 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4640 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 797 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2546 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 941 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 6799 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4539 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 8192 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 5205 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6150 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 321 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2342 ++ .../setuptools/command/egg_info.py | 717 + .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 221 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 271 + .../setuptools/command/upload.py | 196 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 656 + .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 1278 + .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2429 bytes .../site-packages/setuptools/glibc.py | 86 + .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1301 + .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 + .../site-packages/setuptools/pep425tags.py | 319 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 55 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 211 + .../setuptools/windows_support.py | 29 + .../six-1.11.0.dist-info/DESCRIPTION.rst | 27 + .../six-1.11.0.dist-info/INSTALLER | 1 + .../six-1.11.0.dist-info/METADATA | 43 + .../site-packages/six-1.11.0.dist-info/RECORD | 9 + .../site-packages/six-1.11.0.dist-info/WHEEL | 6 + .../six-1.11.0.dist-info/metadata.json | 1 + .../six-1.11.0.dist-info/top_level.txt | 1 + .../venv/lib/python3.7/site-packages/six.py | 891 + .../site-packages/werkzeug/__init__.py | 233 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4787 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 7199 bytes .../__pycache__/_internal.cpython-37.pyc | Bin 0 -> 13284 bytes .../__pycache__/_reloader.cpython-37.pyc | Bin 0 -> 9800 bytes .../__pycache__/datastructures.cpython-37.pyc | Bin 0 -> 100837 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 25812 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 2181 bytes .../__pycache__/formparser.cpython-37.pyc | Bin 0 -> 16128 bytes .../werkzeug/__pycache__/http.cpython-37.pyc | Bin 0 -> 36004 bytes .../werkzeug/__pycache__/local.cpython-37.pyc | Bin 0 -> 18622 bytes .../__pycache__/posixemulation.cpython-37.pyc | Bin 0 -> 2753 bytes .../__pycache__/routing.cpython-37.pyc | Bin 0 -> 64437 bytes .../__pycache__/security.cpython-37.pyc | Bin 0 -> 7766 bytes .../__pycache__/serving.cpython-37.pyc | Bin 0 -> 28580 bytes .../werkzeug/__pycache__/test.cpython-37.pyc | Bin 0 -> 33590 bytes .../__pycache__/testapp.cpython-37.pyc | Bin 0 -> 9369 bytes .../werkzeug/__pycache__/urls.cpython-37.pyc | Bin 0 -> 35805 bytes .../__pycache__/useragents.cpython-37.pyc | Bin 0 -> 5992 bytes .../werkzeug/__pycache__/utils.cpython-37.pyc | Bin 0 -> 25256 bytes .../werkzeug/__pycache__/wsgi.cpython-37.pyc | Bin 0 -> 33356 bytes .../site-packages/werkzeug/_compat.py | 219 + .../site-packages/werkzeug/_internal.py | 484 + .../site-packages/werkzeug/_reloader.py | 334 + .../werkzeug/contrib/__init__.py | 16 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 739 bytes .../contrib/__pycache__/atom.cpython-37.pyc | Bin 0 -> 14199 bytes .../contrib/__pycache__/cache.cpython-37.pyc | Bin 0 -> 32599 bytes .../contrib/__pycache__/fixers.cpython-37.pyc | Bin 0 -> 9540 bytes .../contrib/__pycache__/iterio.cpython-37.pyc | Bin 0 -> 11106 bytes .../contrib/__pycache__/lint.cpython-37.pyc | Bin 0 -> 466 bytes .../__pycache__/profiler.cpython-37.pyc | Bin 0 -> 1583 bytes .../__pycache__/securecookie.cpython-37.pyc | Bin 0 -> 10807 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 13187 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 12424 bytes .../site-packages/werkzeug/contrib/atom.py | 362 + .../site-packages/werkzeug/contrib/cache.py | 933 + .../site-packages/werkzeug/contrib/fixers.py | 262 + .../site-packages/werkzeug/contrib/iterio.py | 358 + .../site-packages/werkzeug/contrib/lint.py | 11 + .../werkzeug/contrib/profiler.py | 42 + .../werkzeug/contrib/securecookie.py | 362 + .../werkzeug/contrib/sessions.py | 389 + .../werkzeug/contrib/wrappers.py | 385 + .../site-packages/werkzeug/datastructures.py | 2852 ++ .../site-packages/werkzeug/debug/__init__.py | 524 + .../debug/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 13199 bytes .../debug/__pycache__/console.cpython-37.pyc | Bin 0 -> 7305 bytes .../debug/__pycache__/repr.cpython-37.pyc | Bin 0 -> 8617 bytes .../debug/__pycache__/tbtools.cpython-37.pyc | Bin 0 -> 18460 bytes .../site-packages/werkzeug/debug/console.py | 216 + .../site-packages/werkzeug/debug/repr.py | 297 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 210 + .../werkzeug/debug/shared/jquery.js | 2 + .../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 | 154 + .../werkzeug/debug/shared/ubuntu.ttf | Bin 0 -> 70220 bytes .../site-packages/werkzeug/debug/tbtools.py | 629 + .../site-packages/werkzeug/exceptions.py | 774 + .../site-packages/werkzeug/filesystem.py | 64 + .../site-packages/werkzeug/formparser.py | 586 + .../python3.7/site-packages/werkzeug/http.py | 1303 + .../python3.7/site-packages/werkzeug/local.py | 421 + .../werkzeug/middleware/__init__.py | 25 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 762 bytes .../__pycache__/dispatcher.cpython-37.pyc | Bin 0 -> 2451 bytes .../__pycache__/http_proxy.cpython-37.pyc | Bin 0 -> 6366 bytes .../__pycache__/lint.cpython-37.pyc | Bin 0 -> 11674 bytes .../__pycache__/profiler.cpython-37.pyc | Bin 0 -> 4628 bytes .../__pycache__/proxy_fix.cpython-37.pyc | Bin 0 -> 7679 bytes .../__pycache__/shared_data.cpython-37.pyc | Bin 0 -> 8338 bytes .../werkzeug/middleware/dispatcher.py | 66 + .../werkzeug/middleware/http_proxy.py | 219 + .../site-packages/werkzeug/middleware/lint.py | 408 + .../werkzeug/middleware/profiler.py | 132 + .../werkzeug/middleware/proxy_fix.py | 228 + .../werkzeug/middleware/shared_data.py | 260 + .../site-packages/werkzeug/posixemulation.py | 117 + .../site-packages/werkzeug/routing.py | 2026 ++ .../site-packages/werkzeug/security.py | 241 + .../site-packages/werkzeug/serving.py | 1074 + .../python3.7/site-packages/werkzeug/test.py | 1146 + .../site-packages/werkzeug/testapp.py | 241 + .../python3.7/site-packages/werkzeug/urls.py | 1134 + .../site-packages/werkzeug/useragents.py | 220 + .../python3.7/site-packages/werkzeug/utils.py | 836 + .../werkzeug/wrappers/__init__.py | 36 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1690 bytes .../__pycache__/accept.cpython-37.pyc | Bin 0 -> 2219 bytes .../wrappers/__pycache__/auth.cpython-37.pyc | Bin 0 -> 1706 bytes .../__pycache__/base_request.cpython-37.pyc | Bin 0 -> 22675 bytes .../__pycache__/base_response.cpython-37.pyc | Bin 0 -> 23323 bytes .../common_descriptors.cpython-37.pyc | Bin 0 -> 12205 bytes .../wrappers/__pycache__/etag.cpython-37.pyc | Bin 0 -> 11731 bytes .../wrappers/__pycache__/json.cpython-37.pyc | Bin 0 -> 4321 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 1825 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 3336 bytes .../__pycache__/user_agent.cpython-37.pyc | Bin 0 -> 853 bytes .../site-packages/werkzeug/wrappers/accept.py | 50 + .../site-packages/werkzeug/wrappers/auth.py | 33 + .../werkzeug/wrappers/base_request.py | 693 + .../werkzeug/wrappers/base_response.py | 702 + .../werkzeug/wrappers/common_descriptors.py | 322 + .../site-packages/werkzeug/wrappers/etag.py | 304 + .../site-packages/werkzeug/wrappers/json.py | 145 + .../werkzeug/wrappers/request.py | 44 + .../werkzeug/wrappers/response.py | 78 + .../werkzeug/wrappers/user_agent.py | 15 + .../python3.7/site-packages/werkzeug/wsgi.py | 1067 + .../wheel-0.33.4.dist-info/INSTALLER | 1 + .../wheel-0.33.4.dist-info/LICENSE.txt | 22 + .../wheel-0.33.4.dist-info/METADATA | 60 + .../wheel-0.33.4.dist-info/RECORD | 32 + .../wheel-0.33.4.dist-info/WHEEL | 6 + .../wheel-0.33.4.dist-info/entry_points.txt | 6 + .../wheel-0.33.4.dist-info/top_level.txt | 1 + .../python3.7/site-packages/wheel/__init__.py | 2 + .../python3.7/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 603 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 0 -> 10095 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 3786 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 4721 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 0 -> 1581 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 0 -> 1326 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 0 -> 5481 bytes .../site-packages/wheel/bdist_wheel.py | 372 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3052 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 0 -> 6221 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 0 -> 2510 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 0 -> 955 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.7/site-packages/wheel/cli/pack.py | 58 + .../site-packages/wheel/cli/unpack.py | 25 + .../python3.7/site-packages/wheel/metadata.py | 141 + .../site-packages/wheel/pep425tags.py | 185 + .../python3.7/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.7/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + backend/venv/lib/python3.7/site.py | 821 + backend/venv/lib/python3.7/sre_compile.py | 1 + backend/venv/lib/python3.7/sre_constants.py | 1 + backend/venv/lib/python3.7/sre_parse.py | 1 + backend/venv/lib/python3.7/stat.py | 1 + backend/venv/lib/python3.7/struct.py | 1 + backend/venv/lib/python3.7/tarfile.py | 1 + backend/venv/lib/python3.7/tempfile.py | 1 + backend/venv/lib/python3.7/token.py | 1 + backend/venv/lib/python3.7/tokenize.py | 1 + backend/venv/lib/python3.7/types.py | 1 + backend/venv/lib/python3.7/warnings.py | 1 + backend/venv/lib/python3.7/weakref.py | 1 + backend/venv/venv/.Python | 1 + backend/venv/venv/bin/activate | 78 + backend/venv/venv/bin/activate.csh | 55 + backend/venv/venv/bin/activate.fish | 101 + backend/venv/venv/bin/activate.ps1 | 72 + backend/venv/venv/bin/activate.xsh | 46 + backend/venv/venv/bin/activate_this.py | 46 + backend/venv/venv/bin/easy_install | 10 + backend/venv/venv/bin/easy_install-3.7 | 10 + backend/venv/venv/bin/pip | 10 + backend/venv/venv/bin/pip3 | 10 + backend/venv/venv/bin/pip3.7 | 10 + backend/venv/venv/bin/python | 1 + backend/venv/venv/bin/python-config | 78 + backend/venv/venv/bin/python3 | Bin 0 -> 8632 bytes backend/venv/venv/bin/python3.7 | 1 + backend/venv/venv/bin/wheel | 10 + backend/venv/venv/include/python3.7m | 1 + backend/venv/venv/lib/python3.7/LICENSE.txt | 1 + backend/venv/venv/lib/python3.7/__future__.py | 1 + .../__pycache__/__future__.cpython-37.pyc | Bin 0 -> 4185 bytes .../__pycache__/_bootlocale.cpython-37.pyc | Bin 0 -> 1309 bytes .../_collections_abc.cpython-37.pyc | Bin 0 -> 29002 bytes .../__pycache__/_weakrefset.cpython-37.pyc | Bin 0 -> 7515 bytes .../python3.7/__pycache__/abc.cpython-37.pyc | Bin 0 -> 6511 bytes .../__pycache__/base64.cpython-37.pyc | Bin 0 -> 17112 bytes .../__pycache__/bisect.cpython-37.pyc | Bin 0 -> 2751 bytes .../__pycache__/codecs.cpython-37.pyc | Bin 0 -> 33958 bytes .../python3.7/__pycache__/copy.cpython-37.pyc | Bin 0 -> 7154 bytes .../__pycache__/copyreg.cpython-37.pyc | Bin 0 -> 4297 bytes .../python3.7/__pycache__/enum.cpython-37.pyc | Bin 0 -> 23800 bytes .../__pycache__/fnmatch.cpython-37.pyc | Bin 0 -> 3390 bytes .../__pycache__/functools.cpython-37.pyc | Bin 0 -> 23867 bytes .../__pycache__/genericpath.cpython-37.pyc | Bin 0 -> 3808 bytes .../__pycache__/hashlib.cpython-37.pyc | Bin 0 -> 6588 bytes .../__pycache__/heapq.cpython-37.pyc | Bin 0 -> 14415 bytes .../python3.7/__pycache__/hmac.cpython-37.pyc | Bin 0 -> 6166 bytes .../python3.7/__pycache__/io.cpython-37.pyc | Bin 0 -> 3469 bytes .../__pycache__/keyword.cpython-37.pyc | Bin 0 -> 1862 bytes .../__pycache__/linecache.cpython-37.pyc | Bin 0 -> 3842 bytes .../__pycache__/locale.cpython-37.pyc | Bin 0 -> 34608 bytes .../__pycache__/ntpath.cpython-37.pyc | Bin 0 -> 12972 bytes .../__pycache__/operator.cpython-37.pyc | Bin 0 -> 13953 bytes .../python3.7/__pycache__/os.cpython-37.pyc | Bin 0 -> 29753 bytes .../__pycache__/posixpath.cpython-37.pyc | Bin 0 -> 10456 bytes .../__pycache__/random.cpython-37.pyc | Bin 0 -> 19409 bytes .../python3.7/__pycache__/re.cpython-37.pyc | Bin 0 -> 13857 bytes .../__pycache__/reprlib.cpython-37.pyc | Bin 0 -> 5403 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 30598 bytes .../python3.7/__pycache__/site.cpython-37.pyc | Bin 0 -> 21834 bytes .../__pycache__/sre_compile.cpython-37.pyc | Bin 0 -> 15256 bytes .../__pycache__/sre_constants.cpython-37.pyc | Bin 0 -> 6344 bytes .../__pycache__/sre_parse.cpython-37.pyc | Bin 0 -> 21410 bytes .../python3.7/__pycache__/stat.cpython-37.pyc | Bin 0 -> 3933 bytes .../__pycache__/struct.cpython-37.pyc | Bin 0 -> 387 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 61838 bytes .../__pycache__/tempfile.cpython-37.pyc | Bin 0 -> 22198 bytes .../__pycache__/token.cpython-37.pyc | Bin 0 -> 3652 bytes .../__pycache__/tokenize.cpython-37.pyc | Bin 0 -> 17783 bytes .../__pycache__/types.cpython-37.pyc | Bin 0 -> 9027 bytes .../__pycache__/warnings.cpython-37.pyc | Bin 0 -> 13819 bytes .../__pycache__/weakref.cpython-37.pyc | Bin 0 -> 19163 bytes .../venv/venv/lib/python3.7/_bootlocale.py | 1 + .../venv/lib/python3.7/_collections_abc.py | 1 + .../venv/venv/lib/python3.7/_dummy_thread.py | 1 + .../venv/venv/lib/python3.7/_weakrefset.py | 1 + backend/venv/venv/lib/python3.7/abc.py | 1 + backend/venv/venv/lib/python3.7/base64.py | 1 + backend/venv/venv/lib/python3.7/bisect.py | 1 + backend/venv/venv/lib/python3.7/codecs.py | 1 + backend/venv/venv/lib/python3.7/collections | 1 + .../venv/lib/python3.7/config-3.7m-darwin | 1 + backend/venv/venv/lib/python3.7/copy.py | 1 + backend/venv/venv/lib/python3.7/copyreg.py | 1 + .../venv/lib/python3.7/distutils/__init__.py | 134 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3201 bytes .../lib/python3.7/distutils/distutils.cfg | 6 + backend/venv/venv/lib/python3.7/encodings | 1 + backend/venv/venv/lib/python3.7/enum.py | 1 + backend/venv/venv/lib/python3.7/fnmatch.py | 1 + backend/venv/venv/lib/python3.7/functools.py | 1 + .../venv/venv/lib/python3.7/genericpath.py | 1 + backend/venv/venv/lib/python3.7/hashlib.py | 1 + backend/venv/venv/lib/python3.7/heapq.py | 1 + backend/venv/venv/lib/python3.7/hmac.py | 1 + backend/venv/venv/lib/python3.7/imp.py | 1 + backend/venv/venv/lib/python3.7/importlib | 1 + backend/venv/venv/lib/python3.7/io.py | 1 + backend/venv/venv/lib/python3.7/keyword.py | 1 + backend/venv/venv/lib/python3.7/lib-dynload | 1 + backend/venv/venv/lib/python3.7/linecache.py | 1 + backend/venv/venv/lib/python3.7/locale.py | 1 + .../lib/python3.7/no-global-site-packages.txt | 0 backend/venv/venv/lib/python3.7/ntpath.py | 1 + backend/venv/venv/lib/python3.7/operator.py | 1 + .../venv/venv/lib/python3.7/orig-prefix.txt | 1 + backend/venv/venv/lib/python3.7/os.py | 1 + backend/venv/venv/lib/python3.7/posixpath.py | 1 + backend/venv/venv/lib/python3.7/random.py | 1 + backend/venv/venv/lib/python3.7/re.py | 1 + backend/venv/venv/lib/python3.7/readline.so | 1 + backend/venv/venv/lib/python3.7/reprlib.py | 1 + .../venv/venv/lib/python3.7/rlcompleter.py | 1 + backend/venv/venv/lib/python3.7/shutil.py | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 333 bytes .../python3.7/site-packages/easy_install.py | 5 + .../pip-19.1.1.dist-info/INSTALLER | 1 + .../pip-19.1.1.dist-info/LICENSE.txt | 20 + .../pip-19.1.1.dist-info/METADATA | 75 + .../site-packages/pip-19.1.1.dist-info/RECORD | 618 + .../site-packages/pip-19.1.1.dist-info/WHEEL | 6 + .../pip-19.1.1.dist-info/entry_points.txt | 5 + .../pip-19.1.1.dist-info/top_level.txt | 1 + .../python3.7/site-packages/pip/__init__.py | 1 + .../python3.7/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 458 bytes .../site-packages/pip/_internal/__init__.py | 78 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1850 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 7447 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 7058 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 9752 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 20920 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 11750 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 28780 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4439 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 8169 bytes .../__pycache__/pyproject.cpython-37.pyc | Bin 0 -> 3186 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 0 -> 9104 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 26080 bytes .../site-packages/pip/_internal/build_env.py | 215 + .../site-packages/pip/_internal/cache.py | 224 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 281 bytes .../__pycache__/autocompletion.cpython-37.pyc | Bin 0 -> 5094 bytes .../__pycache__/base_command.cpython-37.pyc | Bin 0 -> 7801 bytes .../cli/__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 16865 bytes .../__pycache__/main_parser.cpython-37.pyc | Bin 0 -> 2367 bytes .../cli/__pycache__/parser.cpython-37.pyc | Bin 0 -> 8945 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 410 bytes .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 340 + .../pip/_internal/cli/cmdoptions.py | 809 + .../pip/_internal/cli/main_parser.py | 104 + .../site-packages/pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2509 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1334 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 3083 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6911 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 4722 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2879 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 2073 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1249 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 12896 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 8740 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4315 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 5896 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2705 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 5008 bytes .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 253 + .../pip/_internal/commands/download.py | 176 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 587 + .../pip/_internal/commands/list.py | 302 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 186 + .../pip/_internal/configuration.py | 384 + .../site-packages/pip/_internal/download.py | 979 + .../site-packages/pip/_internal/exceptions.py | 274 + .../site-packages/pip/_internal/index.py | 1108 + .../site-packages/pip/_internal/locations.py | 211 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 269 bytes .../__pycache__/candidate.cpython-37.pyc | Bin 0 -> 1302 bytes .../__pycache__/format_control.cpython-37.pyc | Bin 0 -> 2272 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 1173 bytes .../models/__pycache__/link.cpython-37.pyc | Bin 0 -> 4992 bytes .../pip/_internal/models/candidate.py | 31 + .../pip/_internal/models/format_control.py | 73 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 163 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 205 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 3635 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 5620 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 10549 bytes .../pip/_internal/operations/check.py | 155 + .../pip/_internal/operations/freeze.py | 247 + .../pip/_internal/operations/prepare.py | 426 + .../site-packages/pip/_internal/pep425tags.py | 381 + .../site-packages/pip/_internal/pyproject.py | 171 + .../pip/_internal/req/__init__.py | 78 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1716 bytes .../__pycache__/constructors.cpython-37.pyc | Bin 0 -> 7619 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 9232 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 24994 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5677 bytes .../__pycache__/req_tracker.cpython-37.pyc | Bin 0 -> 3228 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 17291 bytes .../pip/_internal/req/constructors.py | 340 + .../pip/_internal/req/req_file.py | 383 + .../pip/_internal/req/req_install.py | 1028 + .../pip/_internal/req/req_set.py | 193 + .../pip/_internal/req/req_tracker.py | 96 + .../pip/_internal/req/req_uninstall.py | 633 + .../site-packages/pip/_internal/resolve.py | 393 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 8031 bytes .../utils/__pycache__/compat.cpython-37.pyc | Bin 0 -> 6148 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 2609 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1284 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 669 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1688 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 3607 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 9031 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 25027 bytes .../utils/__pycache__/models.cpython-37.pyc | Bin 0 -> 1949 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 0 -> 3950 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2621 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 395 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 4922 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1330 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 11760 bytes .../pip/_internal/utils/appdirs.py | 268 + .../pip/_internal/utils/compat.py | 264 + .../pip/_internal/utils/deprecation.py | 93 + .../pip/_internal/utils/encoding.py | 39 + .../pip/_internal/utils/filesystem.py | 30 + .../pip/_internal/utils/glibc.py | 93 + .../pip/_internal/utils/hashes.py | 115 + .../pip/_internal/utils/logging.py | 371 + .../site-packages/pip/_internal/utils/misc.py | 1011 + .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 162 + .../pip/_internal/utils/packaging.py | 85 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 155 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 424 + .../pip/_internal/vcs/__init__.py | 604 + .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 17040 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3441 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 9085 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 3703 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 6732 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 103 + .../site-packages/pip/_internal/vcs/git.py | 362 + .../pip/_internal/vcs/mercurial.py | 105 + .../pip/_internal/vcs/subversion.py | 234 + .../site-packages/pip/_internal/wheel.py | 1098 + .../site-packages/pip/_vendor/__init__.py | 109 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2867 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20617 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 0 -> 36330 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 0 -> 66460 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 221818 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 0 -> 8098 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 26422 bytes .../site-packages/pip/_vendor/appdirs.py | 604 + .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 558 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 0 -> 1561 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 0 -> 3044 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 1774 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 765 bytes .../__pycache__/controller.cpython-37.pyc | Bin 0 -> 7644 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 0 -> 2162 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 0 -> 4682 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 0 -> 4246 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 0 -> 666 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 302 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 0 -> 3236 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1558 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 265 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 268 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 477 bytes .../pip/_vendor/certifi/cacert.pem | 4658 +++ .../site-packages/pip/_vendor/certifi/core.py | 15 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 852 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 0 -> 27187 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 0 -> 1128 bytes .../chardistribution.cpython-37.pyc | Bin 0 -> 6314 bytes .../charsetgroupprober.cpython-37.pyc | Bin 0 -> 2235 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 0 -> 3445 bytes .../codingstatemachine.cpython-37.pyc | Bin 0 -> 2892 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 0 -> 363 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 0 -> 1135 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 0 -> 2626 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 0 -> 2613 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 0 -> 7074 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 0 -> 2421 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 0 -> 12071 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 0 -> 27191 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 0 -> 19115 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 0 -> 1144 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 0 -> 2978 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 0 -> 22143 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 0 -> 38022 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 0 -> 23636 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 0 -> 29092 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 0 -> 23594 bytes .../langhebrewmodel.cpython-37.pyc | Bin 0 -> 22223 bytes .../langhungarianmodel.cpython-37.pyc | Bin 0 -> 23625 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 0 -> 22202 bytes .../langturkishmodel.cpython-37.pyc | Bin 0 -> 22225 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 0 -> 2935 bytes .../mbcharsetprober.cpython-37.pyc | Bin 0 -> 2240 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 0 -> 1131 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 0 -> 15686 bytes .../sbcharsetprober.cpython-37.pyc | Bin 0 -> 2993 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 0 -> 2447 bytes .../universaldetector.cpython-37.pyc | Bin 0 -> 5837 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 0 -> 1978 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 447 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 204 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 0 -> 2693 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 + .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 452 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3350 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7606 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1671 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3865 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4613 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1050 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 0 -> 32060 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 42581 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 0 -> 17346 bytes .../__pycache__/locators.cpython-37.pyc | Bin 0 -> 38732 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 10298 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 4484 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 0 -> 27694 bytes .../__pycache__/resources.cpython-37.pyc | Bin 0 -> 10894 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 0 -> 11084 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 47962 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 20434 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25370 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 492 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 0 -> 1089 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 21405 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 0 -> 15870 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 62735 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 + .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 + .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++ .../pip/_vendor/distlib/compat.py | 1120 + .../pip/_vendor/distlib/database.py | 1339 + .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1295 + .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1094 + .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 417 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../site-packages/pip/_vendor/distlib/util.py | 1756 + .../pip/_vendor/distlib/version.py | 736 + .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 988 + .../site-packages/pip/_vendor/distro.py | 1216 + .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1321 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 0 -> 13768 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 0 -> 22659 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 0 -> 41560 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 0 -> 3313 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 66225 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 0 -> 97822 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 10838 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 + .../pip/_vendor/html5lib/_tokenizer.py | 1721 + .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 434 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 0 -> 1517 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 0 -> 2036 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 0 -> 2239 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 ++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 0 -> 1325 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 0 -> 859 bytes .../inject_meta_charset.cpython-37.pyc | Bin 0 -> 1879 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 0 -> 2643 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 0 -> 2770 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 0 -> 16445 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 0 -> 1363 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 + .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 948 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1545 bytes .../__pycache__/sax.cpython-37.pyc | Bin 0 -> 1495 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3329 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 11252 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 9282 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 11861 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 11801 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4006 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 7002 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 1731 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 3538 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 6647 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1905 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 266 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 0 -> 3073 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 0 -> 626 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 9069 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 21440 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 0 -> 1806 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 220 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 176100 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 396 + .../pip/_vendor/idna/idnadata.py | 1979 ++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8205 +++++ .../site-packages/pip/_vendor/ipaddress.py | 2419 ++ .../pip/_vendor/lockfile/__init__.py | 347 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9916 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 0 -> 2297 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 0 -> 4859 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 0 -> 3758 bytes .../symlinklockfile.cpython-37.pyc | Bin 0 -> 2182 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2078 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 227 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 2183 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 0 -> 24555 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 + .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 740 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 578 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1018 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2870 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8873 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3991 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19768 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1456 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11960 bytes .../pip/_vendor/packaging/_compat.py | 31 + .../pip/_vendor/packaging/_structures.py | 68 + .../pip/_vendor/packaging/markers.py | 296 + .../pip/_vendor/packaging/requirements.py | 138 + .../pip/_vendor/packaging/specifiers.py | 749 + .../pip/_vendor/packaging/utils.py | 57 + .../pip/_vendor/packaging/version.py | 420 + .../pip/_vendor/pep517/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 291 bytes .../__pycache__/_in_process.cpython-37.pyc | Bin 0 -> 5634 bytes .../pep517/__pycache__/build.cpython-37.pyc | Bin 0 -> 2769 bytes .../pep517/__pycache__/check.cpython-37.pyc | Bin 0 -> 4817 bytes .../__pycache__/colorlog.cpython-37.pyc | Bin 0 -> 2923 bytes .../pep517/__pycache__/compat.cpython-37.pyc | Bin 0 -> 1027 bytes .../__pycache__/envbuild.cpython-37.pyc | Bin 0 -> 4211 bytes .../__pycache__/wrappers.cpython-37.pyc | Bin 0 -> 5492 bytes .../pip/_vendor/pep517/_in_process.py | 207 + .../site-packages/pip/_vendor/pep517/build.py | 108 + .../site-packages/pip/_vendor/pep517/check.py | 202 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 158 + .../pip/_vendor/pep517/wrappers.py | 163 + .../pip/_vendor/pkg_resources/__init__.py | 3286 ++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99587 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 651 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 5567 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1471 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1436 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 6493 ++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 385 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 0 -> 948 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 0 -> 10065 bytes .../pytoml/__pycache__/test.cpython-37.pyc | Bin 0 -> 1248 bytes .../pytoml/__pycache__/utils.cpython-37.pyc | Bin 0 -> 2147 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 0 -> 3582 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 341 + .../site-packages/pip/_vendor/pytoml/test.py | 30 + .../site-packages/pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 106 + .../pip/_vendor/requests/__init__.py | 133 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3496 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 559 bytes .../_internal_utils.cpython-37.pyc | Bin 0 -> 1317 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 0 -> 16894 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 0 -> 6500 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 0 -> 8351 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 0 -> 642 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 0 -> 18796 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5514 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 0 -> 2695 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 989 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 24117 bytes .../__pycache__/packages.cpython-37.pyc | Bin 0 -> 519 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 19437 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 4175 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4388 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 22048 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 + .../site-packages/pip/_vendor/requests/api.py | 158 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 74 + .../pip/_vendor/requests/cookies.py | 549 + .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 953 + .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 770 + .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 977 + .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 952 + .../pip/_vendor/urllib3/__init__.py | 92 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2124 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 0 -> 10688 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 10157 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 0 -> 23662 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10409 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 0 -> 5877 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2769 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 0 -> 12729 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 5591 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 18756 bytes .../pip/_vendor/urllib3/_collections.py | 329 + .../pip/_vendor/urllib3/connection.py | 391 + .../pip/_vendor/urllib3/connectionpool.py | 896 + .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../_appengine_environ.cpython-37.pyc | Bin 0 -> 1104 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 0 -> 8323 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 0 -> 3250 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14486 bytes .../securetransport.cpython-37.pyc | Bin 0 -> 17905 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 0 -> 4914 bytes .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 0 -> 10320 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 0 -> 7501 bytes .../contrib/_securetransport/bindings.py | 593 + .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 289 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 + .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 322 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 0 -> 1313 bytes .../urllib3/packages/backports/makefile.py | 53 + .../pip/_vendor/urllib3/packages/six.py | 868 + .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 563 bytes .../_implementation.cpython-37.pyc | Bin 0 -> 3322 bytes .../ssl_match_hostname/_implementation.py | 156 + .../pip/_vendor/urllib3/poolmanager.py | 450 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 705 + .../pip/_vendor/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1000 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 3175 bytes .../util/__pycache__/queue.cpython-37.pyc | Bin 0 -> 1049 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 0 -> 3230 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 0 -> 1978 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 0 -> 12664 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 9556 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 0 -> 8779 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 0 -> 5189 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 3141 bytes .../pip/_vendor/urllib3/util/connection.py | 134 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 87 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 381 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 150 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9684 bytes .../__pycache__/labels.cpython-37.pyc | Bin 0 -> 4098 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 0 -> 1920 bytes .../__pycache__/tests.cpython-37.pyc | Bin 0 -> 5061 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 0 -> 2673 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3286 ++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 99636 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 646 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20697 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203052 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../pkg_resources/_vendor/appdirs.py | 608 + .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 745 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 583 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1035 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2887 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8895 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3900 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19813 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 514 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10580 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 + .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++ .../pkg_resources/_vendor/six.py | 868 + .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2428 bytes .../site-packages/pkg_resources/py31compat.py | 23 + .../setuptools-41.0.1.dist-info/INSTALLER | 1 + .../setuptools-41.0.1.dist-info/LICENSE | 19 + .../setuptools-41.0.1.dist-info/METADATA | 77 + .../setuptools-41.0.1.dist-info/RECORD | 186 + .../setuptools-41.0.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-41.0.1.dist-info/top_level.txt | 3 + .../setuptools-41.0.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 228 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 7710 bytes .../_deprecation_warning.cpython-37.pyc | Bin 0 -> 564 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5145 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 8303 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 17707 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 0 -> 871 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5280 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 42103 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1991 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1556 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3766 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 870 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2449 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 4650 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 34447 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3628 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32714 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7218 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 827 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1225 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1436 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15552 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1518 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6808 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1185 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 344 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 6997 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 1027 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 203049 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24407 bytes .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 742 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 580 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1032 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2884 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8889 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3891 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19810 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 511 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10577 bytes .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 + .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../setuptools/_vendor/pyparsing.py | 5742 ++++ .../site-packages/setuptools/_vendor/six.py | 868 + .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 254 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 18 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 752 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2420 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 14208 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1799 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 990 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 0 -> 2469 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 9723 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8599 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6480 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 0 -> 1395 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 64851 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21697 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 4027 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2428 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 4104 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2307 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4640 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 797 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2546 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 941 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 6799 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4539 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 8192 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 5205 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6150 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 321 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 221 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2342 ++ .../setuptools/command/egg_info.py | 717 + .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 221 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 271 + .../setuptools/command/upload.py | 196 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 656 + .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 1278 + .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2429 bytes .../site-packages/setuptools/glibc.py | 86 + .../site-packages/setuptools/glob.py | 174 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 179 + .../site-packages/setuptools/msvc.py | 1301 + .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1136 + .../site-packages/setuptools/pep425tags.py | 319 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 32 + .../site-packages/setuptools/py33compat.py | 55 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 6 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 211 + .../setuptools/windows_support.py | 29 + .../wheel-0.33.4.dist-info/INSTALLER | 1 + .../wheel-0.33.4.dist-info/LICENSE.txt | 22 + .../wheel-0.33.4.dist-info/METADATA | 60 + .../wheel-0.33.4.dist-info/RECORD | 32 + .../wheel-0.33.4.dist-info/WHEEL | 6 + .../wheel-0.33.4.dist-info/entry_points.txt | 6 + .../wheel-0.33.4.dist-info/top_level.txt | 1 + .../python3.7/site-packages/wheel/__init__.py | 2 + .../python3.7/site-packages/wheel/__main__.py | 19 + .../wheel/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 210 bytes .../wheel/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 603 bytes .../__pycache__/bdist_wheel.cpython-37.pyc | Bin 0 -> 10095 bytes .../wheel/__pycache__/metadata.cpython-37.pyc | Bin 0 -> 3786 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 4721 bytes .../wheel/__pycache__/pkginfo.cpython-37.pyc | Bin 0 -> 1581 bytes .../wheel/__pycache__/util.cpython-37.pyc | Bin 0 -> 1326 bytes .../__pycache__/wheelfile.cpython-37.pyc | Bin 0 -> 5481 bytes .../site-packages/wheel/bdist_wheel.py | 372 + .../site-packages/wheel/cli/__init__.py | 88 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3052 bytes .../cli/__pycache__/convert.cpython-37.pyc | Bin 0 -> 6221 bytes .../wheel/cli/__pycache__/pack.cpython-37.pyc | Bin 0 -> 2510 bytes .../cli/__pycache__/unpack.cpython-37.pyc | Bin 0 -> 955 bytes .../site-packages/wheel/cli/convert.py | 269 + .../python3.7/site-packages/wheel/cli/pack.py | 58 + .../site-packages/wheel/cli/unpack.py | 25 + .../python3.7/site-packages/wheel/metadata.py | 141 + .../site-packages/wheel/pep425tags.py | 185 + .../python3.7/site-packages/wheel/pkginfo.py | 43 + .../lib/python3.7/site-packages/wheel/util.py | 46 + .../site-packages/wheel/wheelfile.py | 169 + backend/venv/venv/lib/python3.7/site.py | 821 + .../venv/venv/lib/python3.7/sre_compile.py | 1 + .../venv/venv/lib/python3.7/sre_constants.py | 1 + backend/venv/venv/lib/python3.7/sre_parse.py | 1 + backend/venv/venv/lib/python3.7/stat.py | 1 + backend/venv/venv/lib/python3.7/struct.py | 1 + backend/venv/venv/lib/python3.7/tarfile.py | 1 + backend/venv/venv/lib/python3.7/tempfile.py | 1 + backend/venv/venv/lib/python3.7/token.py | 1 + backend/venv/venv/lib/python3.7/tokenize.py | 1 + backend/venv/venv/lib/python3.7/types.py | 1 + backend/venv/venv/lib/python3.7/warnings.py | 1 + backend/venv/venv/lib/python3.7/weakref.py | 1 + dist/datasets/breast-cancer-wisconsin.csv | 700 + dist/datasets/diabetes.csv | 769 + dist/datasets/iris.csv | 152 + dist/index.html | 1 + extra_data_sets/breast-cancer-wisconsin.csv | 700 + extra_data_sets/diabetes.csv | 769 + extra_data_sets/heart.csv | 304 + extra_data_sets/iris.csv | 152 + extra_data_sets/sonar.csv | 209 + extra_data_sets/stance.csv | 2096 ++ extra_data_sets/stancetest.csv | 2060 ++ frontend/.babelrc | 36 + frontend/.editorconfig | 9 + frontend/.eslintignore | 4 + frontend/.eslintrc.js | 29 + frontend/.gitignore | 14 + frontend/.postcssrc.js | 10 + frontend/README.md | 21 + frontend/build/build.js | 41 + frontend/build/check-versions.js | 54 + frontend/build/logo.png | Bin 0 -> 6849 bytes frontend/build/utils.js | 101 + frontend/build/vue-loader.conf.js | 22 + frontend/build/webpack.base.conf.js | 95 + frontend/build/webpack.dev.conf.js | 95 + frontend/build/webpack.prod.conf.js | 145 + frontend/config/dev.env.js | 7 + frontend/config/index.js | 75 + frontend/config/prod.env.js | 4 + frontend/index.html | 12 + frontend/package-lock.json | 27807 ++++++++++++++++ frontend/package.json | 156 + frontend/src/App.vue | 24 + frontend/src/assets/isovis.jpg | Bin 0 -> 5940 bytes frontend/src/assets/logo.svg | 1 + frontend/src/assets/w3.css | 229 + frontend/src/components/About.vue | 8 + .../src/components/AlgorithmHyperParam.vue | 351 + frontend/src/components/Algorithms.vue | 1113 + .../src/components/CrossoverMutationSpace.vue | 309 + .../src/components/DataSetExecController.vue | 86 + .../src/components/HyperParameterSpace.vue | 312 + frontend/src/components/Main.vue | 974 + frontend/src/components/NotFound.vue | 8 + frontend/src/components/Parameters.vue | 846 + .../src/components/PerformanceMetrics.vue | 148 + frontend/src/components/Predictions.vue | 454 + frontend/src/components/VotingResults.vue | 408 + frontend/src/main.js | 29 + frontend/src/router/index.js | 19 + frontend/static/.gitkeep | 0 frontend/vue.config.js | 10 + insertMongo.py | 25 + insertMongo.pyc | Bin 0 -> 961 bytes package-lock.json | 123 + run.py | 1362 + 2440 files changed, 418876 insertions(+) create mode 100644 backend/requirements.txt create mode 120000 backend/venv/.Python create mode 100644 backend/venv/bin/activate create mode 100644 backend/venv/bin/activate.csh create mode 100644 backend/venv/bin/activate.fish create mode 100644 backend/venv/bin/activate.ps1 create mode 100644 backend/venv/bin/activate.xsh create mode 100644 backend/venv/bin/activate_this.py create mode 100755 backend/venv/bin/easy_install create mode 100755 backend/venv/bin/easy_install-3.7 create mode 100755 backend/venv/bin/flask create mode 100755 backend/venv/bin/pip create mode 100755 backend/venv/bin/pip3 create mode 100755 backend/venv/bin/pip3.7 create mode 120000 backend/venv/bin/python create mode 100755 backend/venv/bin/python-config create mode 100755 backend/venv/bin/python3 create mode 120000 backend/venv/bin/python3.7 create mode 100755 backend/venv/bin/wheel create mode 120000 backend/venv/include/python3.7m create mode 120000 backend/venv/lib/python3.7/LICENSE.txt create mode 120000 backend/venv/lib/python3.7/__future__.py create mode 100644 backend/venv/lib/python3.7/__pycache__/__future__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/bisect.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/copyreg.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/genericpath.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/hashlib.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/io.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/keyword.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/locale.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/ntpath.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/os.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/random.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/re.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/reprlib.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/site.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/stat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/struct.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/tarfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/token.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/types.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc create mode 120000 backend/venv/lib/python3.7/_bootlocale.py create mode 120000 backend/venv/lib/python3.7/_collections_abc.py create mode 120000 backend/venv/lib/python3.7/_dummy_thread.py create mode 120000 backend/venv/lib/python3.7/_weakrefset.py create mode 120000 backend/venv/lib/python3.7/abc.py create mode 120000 backend/venv/lib/python3.7/base64.py create mode 120000 backend/venv/lib/python3.7/bisect.py create mode 120000 backend/venv/lib/python3.7/codecs.py create mode 120000 backend/venv/lib/python3.7/collections create mode 120000 backend/venv/lib/python3.7/config-3.7m-darwin create mode 120000 backend/venv/lib/python3.7/copy.py create mode 120000 backend/venv/lib/python3.7/copyreg.py create mode 100644 backend/venv/lib/python3.7/distutils/__init__.py create mode 100644 backend/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/distutils/distutils.cfg create mode 120000 backend/venv/lib/python3.7/encodings create mode 120000 backend/venv/lib/python3.7/enum.py create mode 120000 backend/venv/lib/python3.7/fnmatch.py create mode 120000 backend/venv/lib/python3.7/functools.py create mode 120000 backend/venv/lib/python3.7/genericpath.py create mode 120000 backend/venv/lib/python3.7/hashlib.py create mode 120000 backend/venv/lib/python3.7/heapq.py create mode 120000 backend/venv/lib/python3.7/hmac.py create mode 120000 backend/venv/lib/python3.7/imp.py create mode 120000 backend/venv/lib/python3.7/importlib create mode 120000 backend/venv/lib/python3.7/io.py create mode 120000 backend/venv/lib/python3.7/keyword.py create mode 120000 backend/venv/lib/python3.7/lib-dynload create mode 120000 backend/venv/lib/python3.7/linecache.py create mode 120000 backend/venv/lib/python3.7/locale.py create mode 100644 backend/venv/lib/python3.7/no-global-site-packages.txt create mode 120000 backend/venv/lib/python3.7/ntpath.py create mode 120000 backend/venv/lib/python3.7/operator.py create mode 100644 backend/venv/lib/python3.7/orig-prefix.txt create mode 120000 backend/venv/lib/python3.7/os.py create mode 120000 backend/venv/lib/python3.7/posixpath.py create mode 120000 backend/venv/lib/python3.7/random.py create mode 120000 backend/venv/lib/python3.7/re.py create mode 120000 backend/venv/lib/python3.7/readline.so create mode 120000 backend/venv/lib/python3.7/reprlib.py create mode 120000 backend/venv/lib/python3.7/rlcompleter.py create mode 120000 backend/venv/lib/python3.7/shutil.py create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/pbr.json create mode 100644 backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/LICENSE.rst create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/__pycache__/itsdangerous.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/binary.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/code.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/codec_options.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/dbref.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/decimal128.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/errors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/int64.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/json_util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/max_key.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/min_key.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/objectid.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/py3compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/raw_bson.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/regex.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/son.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/timestamp.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/bson/__pycache__/tz_util.cpython-37.pyc create mode 100755 backend/venv/lib/python3.7/site-packages/bson/_cbson.cpython-37m-darwin.so create mode 100644 backend/venv/lib/python3.7/site-packages/bson/binary.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/code.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/codec_options.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/dbref.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/decimal128.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/errors.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/int64.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/json_util.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/max_key.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/min_key.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/objectid.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/py3compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/raw_bson.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/regex.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/son.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/timestamp.py create mode 100644 backend/venv/lib/python3.7/site-packages/bson/tz_util.py create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json create mode 100644 backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/click/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_termui_impl.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_textwrap.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_unicodefun.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/formatting.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/termui.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/types.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_termui_impl.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_textwrap.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_unicodefun.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/_winconsole.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/core.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/decorators.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/formatting.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/globals.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/termui.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/testing.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/types.py create mode 100644 backend/venv/lib/python3.7/site-packages/click/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/easy_install.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__main__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/app.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/blueprints.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/ctx.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/globals.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/helpers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/logging.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/sessions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/signals.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/templating.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/testing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/views.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/app.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/blueprints.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/cli.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/config.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/ctx.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/debughelpers.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/globals.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/helpers.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/__pycache__/tag.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask/json/tag.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/logging.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/sessions.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/signals.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/templating.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/testing.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/views.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask/wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/decorator.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/extension.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/core.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/decorator.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/extension.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_cors/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/__pycache__/_version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/_version.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/__pycache__/test_config.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/__pycache__/test_gridfs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/__pycache__/test_url_converter.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/__pycache__/test_wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/__pycache__/util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/test_config.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/test_gridfs.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/test_url_converter.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/test_wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/tests/util.py create mode 100644 backend/venv/lib/python3.7/site-packages/flask_pymongo/wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/gridfs/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/gridfs/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/gridfs/__pycache__/errors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/gridfs/__pycache__/grid_file.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/gridfs/errors.py create mode 100644 backend/venv/lib/python3.7/site-packages/gridfs/grid_file.py create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous-0.24.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/itsdangerous.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/_identifier.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/asyncfilters.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/asyncsupport.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/bccache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/compiler.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/constants.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/debug.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/defaults.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/environment.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/ext.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/filters.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/idtracking.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/lexer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/loaders.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/meta.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/nativetypes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/nodes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/optimizer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/runtime.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/sandbox.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/tests.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/__pycache__/visitor.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/_identifier.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/asyncfilters.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/asyncsupport.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/bccache.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/compiler.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/constants.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/debug.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/defaults.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/environment.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/ext.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/filters.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/idtracking.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/lexer.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/loaders.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/meta.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/nativetypes.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/nodes.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/optimizer.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/runtime.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/sandbox.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/tests.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/jinja2/visitor.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/_constants.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/__pycache__/_native.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_constants.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_native.py create mode 100644 backend/venv/lib/python3.7/site-packages/markupsafe/_speedups.c create mode 100755 backend/venv/lib/python3.7/site-packages/markupsafe/_speedups.cpython-37m-darwin.so create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/pip/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/__main__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/build_env.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cache.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/configuration.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/download.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/index.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/locations.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/index.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/models/link.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/check.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/resolve.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_internal/wheel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/distro.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/six.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 backend/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo-3.8.0.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo-3.8.0.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo-3.8.0.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo-3.8.0.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo-3.8.0.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/auth.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/bulk.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/change_stream.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/client_options.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/client_session.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/collation.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/collection.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/command_cursor.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/common.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/compression_support.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/cursor.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/cursor_manager.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/database.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/driver_info.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/errors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/helpers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/ismaster.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/max_staleness_selectors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/message.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/mongo_client.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/mongo_replica_set_client.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/monitor.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/monitoring.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/monotonic.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/network.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/operations.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/periodic_executor.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/pool.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/read_concern.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/read_preferences.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/response.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/results.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/saslprep.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/server.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/server_description.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/server_selectors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/server_type.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/settings.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/son_manipulator.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/ssl_context.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/ssl_match_hostname.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/ssl_support.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/thread_util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/topology.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/topology_description.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/uri_parser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/__pycache__/write_concern.cpython-37.pyc create mode 100755 backend/venv/lib/python3.7/site-packages/pymongo/_cmessage.cpython-37m-darwin.so create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/auth.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/bulk.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/change_stream.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/client_options.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/client_session.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/collation.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/collection.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/command_cursor.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/common.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/compression_support.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/cursor.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/cursor_manager.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/database.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/driver_info.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/errors.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/helpers.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/ismaster.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/max_staleness_selectors.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/message.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/mongo_client.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/mongo_replica_set_client.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/monitor.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/monitoring.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/monotonic.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/network.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/operations.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/periodic_executor.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/pool.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/read_concern.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/read_preferences.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/response.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/results.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/saslprep.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/server.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/server_description.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/server_selectors.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/server_type.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/settings.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/son_manipulator.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/ssl_context.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/ssl_match_hostname.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/ssl_support.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/thread_util.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/topology.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/topology_description.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/uri_parser.py create mode 100644 backend/venv/lib/python3.7/site-packages/pymongo/write_concern.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/zip-safe create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/archive_util.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/build_meta.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/cli-32.exe create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/cli-64.exe create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/cli.exe create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/alias.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/build_py.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/develop.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/install.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/register.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/rotate.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/sdist.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/setopt.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/test.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/upload.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/config.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/dep_util.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/depends.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/dist.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/extension.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/glibc.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/glob.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/gui-32.exe create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/gui-64.exe create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/gui.exe create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/launch.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/monkey.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/msvc.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/namespaces.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/package_index.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/pep425tags.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/py27compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/py31compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/py33compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/sandbox.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/script.tmpl create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/site-patch.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/ssl_support.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/version.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/wheel.py create mode 100644 backend/venv/lib/python3.7/site-packages/setuptools/windows_support.py create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/DESCRIPTION.rst create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/metadata.json create mode 100644 backend/venv/lib/python3.7/site-packages/six-1.11.0.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/six.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/_internal.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/_reloader.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/datastructures.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/filesystem.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/formparser.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/http.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/local.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/posixemulation.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/routing.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/security.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/serving.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/test.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/testapp.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/urls.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/useragents.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/__pycache__/wsgi.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/_compat.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/_internal.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/_reloader.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/atom.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/cache.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/fixers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/iterio.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/lint.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/profiler.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/sessions.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/atom.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/cache.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/fixers.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/iterio.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/lint.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/profiler.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/securecookie.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/sessions.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/contrib/wrappers.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/datastructures.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/console.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/repr.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/console.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/repr.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/console.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/jquery.js create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/less.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/more.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/source.png create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/style.css create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/shared/ubuntu.ttf create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/debug/tbtools.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/exceptions.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/filesystem.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/formparser.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/http.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/local.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/lint.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/routing.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/security.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/serving.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/test.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/testapp.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/urls.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/useragents.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/utils.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/json.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/accept.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/auth.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_request.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py create mode 100644 backend/venv/lib/python3.7/site-packages/werkzeug/wsgi.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt create mode 100644 backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__main__.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/util.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__init__.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/convert.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/pack.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/cli/unpack.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/metadata.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/pep425tags.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/pkginfo.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/util.py create mode 100644 backend/venv/lib/python3.7/site-packages/wheel/wheelfile.py create mode 100644 backend/venv/lib/python3.7/site.py create mode 120000 backend/venv/lib/python3.7/sre_compile.py create mode 120000 backend/venv/lib/python3.7/sre_constants.py create mode 120000 backend/venv/lib/python3.7/sre_parse.py create mode 120000 backend/venv/lib/python3.7/stat.py create mode 120000 backend/venv/lib/python3.7/struct.py create mode 120000 backend/venv/lib/python3.7/tarfile.py create mode 120000 backend/venv/lib/python3.7/tempfile.py create mode 120000 backend/venv/lib/python3.7/token.py create mode 120000 backend/venv/lib/python3.7/tokenize.py create mode 120000 backend/venv/lib/python3.7/types.py create mode 120000 backend/venv/lib/python3.7/warnings.py create mode 120000 backend/venv/lib/python3.7/weakref.py create mode 120000 backend/venv/venv/.Python create mode 100644 backend/venv/venv/bin/activate create mode 100644 backend/venv/venv/bin/activate.csh create mode 100644 backend/venv/venv/bin/activate.fish create mode 100644 backend/venv/venv/bin/activate.ps1 create mode 100644 backend/venv/venv/bin/activate.xsh create mode 100644 backend/venv/venv/bin/activate_this.py create mode 100755 backend/venv/venv/bin/easy_install create mode 100755 backend/venv/venv/bin/easy_install-3.7 create mode 100755 backend/venv/venv/bin/pip create mode 100755 backend/venv/venv/bin/pip3 create mode 100755 backend/venv/venv/bin/pip3.7 create mode 120000 backend/venv/venv/bin/python create mode 100755 backend/venv/venv/bin/python-config create mode 100755 backend/venv/venv/bin/python3 create mode 120000 backend/venv/venv/bin/python3.7 create mode 100755 backend/venv/venv/bin/wheel create mode 120000 backend/venv/venv/include/python3.7m create mode 120000 backend/venv/venv/lib/python3.7/LICENSE.txt create mode 120000 backend/venv/venv/lib/python3.7/__future__.py create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/__future__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/bisect.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/copyreg.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/genericpath.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/hashlib.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/io.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/keyword.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/locale.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/ntpath.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/os.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/random.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/re.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/reprlib.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/site.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/stat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/struct.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/tarfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/token.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/types.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc create mode 120000 backend/venv/venv/lib/python3.7/_bootlocale.py create mode 120000 backend/venv/venv/lib/python3.7/_collections_abc.py create mode 120000 backend/venv/venv/lib/python3.7/_dummy_thread.py create mode 120000 backend/venv/venv/lib/python3.7/_weakrefset.py create mode 120000 backend/venv/venv/lib/python3.7/abc.py create mode 120000 backend/venv/venv/lib/python3.7/base64.py create mode 120000 backend/venv/venv/lib/python3.7/bisect.py create mode 120000 backend/venv/venv/lib/python3.7/codecs.py create mode 120000 backend/venv/venv/lib/python3.7/collections create mode 120000 backend/venv/venv/lib/python3.7/config-3.7m-darwin create mode 120000 backend/venv/venv/lib/python3.7/copy.py create mode 120000 backend/venv/venv/lib/python3.7/copyreg.py create mode 100644 backend/venv/venv/lib/python3.7/distutils/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/distutils/distutils.cfg create mode 120000 backend/venv/venv/lib/python3.7/encodings create mode 120000 backend/venv/venv/lib/python3.7/enum.py create mode 120000 backend/venv/venv/lib/python3.7/fnmatch.py create mode 120000 backend/venv/venv/lib/python3.7/functools.py create mode 120000 backend/venv/venv/lib/python3.7/genericpath.py create mode 120000 backend/venv/venv/lib/python3.7/hashlib.py create mode 120000 backend/venv/venv/lib/python3.7/heapq.py create mode 120000 backend/venv/venv/lib/python3.7/hmac.py create mode 120000 backend/venv/venv/lib/python3.7/imp.py create mode 120000 backend/venv/venv/lib/python3.7/importlib create mode 120000 backend/venv/venv/lib/python3.7/io.py create mode 120000 backend/venv/venv/lib/python3.7/keyword.py create mode 120000 backend/venv/venv/lib/python3.7/lib-dynload create mode 120000 backend/venv/venv/lib/python3.7/linecache.py create mode 120000 backend/venv/venv/lib/python3.7/locale.py create mode 100644 backend/venv/venv/lib/python3.7/no-global-site-packages.txt create mode 120000 backend/venv/venv/lib/python3.7/ntpath.py create mode 120000 backend/venv/venv/lib/python3.7/operator.py create mode 100644 backend/venv/venv/lib/python3.7/orig-prefix.txt create mode 120000 backend/venv/venv/lib/python3.7/os.py create mode 120000 backend/venv/venv/lib/python3.7/posixpath.py create mode 120000 backend/venv/venv/lib/python3.7/random.py create mode 120000 backend/venv/venv/lib/python3.7/re.py create mode 120000 backend/venv/venv/lib/python3.7/readline.so create mode 120000 backend/venv/venv/lib/python3.7/reprlib.py create mode 120000 backend/venv/venv/lib/python3.7/rlcompleter.py create mode 120000 backend/venv/venv/lib/python3.7/shutil.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/easy_install.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/INSTALLER create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/METADATA create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/RECORD create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/WHEEL create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/entry_points.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/top_level.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/__main__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pyproject.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/build_env.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cache.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/configuration.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/download.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/index.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/locations.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/index.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/link.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/check.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/constructors.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/resolve.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_internal/wheel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distro.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/six.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/LICENSE create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/METADATA create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/RECORD create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/WHEEL create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/zip-safe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/archive_util.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/build_meta.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/cli-32.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/cli-64.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/cli.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/alias.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_py.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/develop.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/register.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/rotate.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/sdist.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/setopt.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/test.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/config.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/dep_util.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/depends.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/dist.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/extension.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/glibc.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/glob.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/gui-32.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/gui-64.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/gui.exe create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/launch.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/monkey.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/msvc.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/namespaces.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/package_index.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/pep425tags.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/py27compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/py31compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/py33compat.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/sandbox.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/script.tmpl create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/site-patch.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/ssl_support.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/version.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/wheel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/setuptools/windows_support.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__main__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/__main__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/util.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/wheelfile.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__init__.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/pack.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/convert.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/pack.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/cli/unpack.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/metadata.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/pep425tags.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/pkginfo.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/util.py create mode 100644 backend/venv/venv/lib/python3.7/site-packages/wheel/wheelfile.py create mode 100644 backend/venv/venv/lib/python3.7/site.py create mode 120000 backend/venv/venv/lib/python3.7/sre_compile.py create mode 120000 backend/venv/venv/lib/python3.7/sre_constants.py create mode 120000 backend/venv/venv/lib/python3.7/sre_parse.py create mode 120000 backend/venv/venv/lib/python3.7/stat.py create mode 120000 backend/venv/venv/lib/python3.7/struct.py create mode 120000 backend/venv/venv/lib/python3.7/tarfile.py create mode 120000 backend/venv/venv/lib/python3.7/tempfile.py create mode 120000 backend/venv/venv/lib/python3.7/token.py create mode 120000 backend/venv/venv/lib/python3.7/tokenize.py create mode 120000 backend/venv/venv/lib/python3.7/types.py create mode 120000 backend/venv/venv/lib/python3.7/warnings.py create mode 120000 backend/venv/venv/lib/python3.7/weakref.py create mode 100644 dist/datasets/breast-cancer-wisconsin.csv create mode 100755 dist/datasets/diabetes.csv create mode 100755 dist/datasets/iris.csv create mode 100755 dist/index.html create mode 100644 extra_data_sets/breast-cancer-wisconsin.csv create mode 100755 extra_data_sets/diabetes.csv create mode 100644 extra_data_sets/heart.csv create mode 100755 extra_data_sets/iris.csv create mode 100644 extra_data_sets/sonar.csv create mode 100644 extra_data_sets/stance.csv create mode 100644 extra_data_sets/stancetest.csv create mode 100755 frontend/.babelrc create mode 100755 frontend/.editorconfig create mode 100755 frontend/.eslintignore create mode 100755 frontend/.eslintrc.js create mode 100755 frontend/.gitignore create mode 100755 frontend/.postcssrc.js create mode 100755 frontend/README.md create mode 100755 frontend/build/build.js create mode 100755 frontend/build/check-versions.js create mode 100755 frontend/build/logo.png create mode 100755 frontend/build/utils.js create mode 100755 frontend/build/vue-loader.conf.js create mode 100755 frontend/build/webpack.base.conf.js create mode 100755 frontend/build/webpack.dev.conf.js create mode 100755 frontend/build/webpack.prod.conf.js create mode 100755 frontend/config/dev.env.js create mode 100755 frontend/config/index.js create mode 100755 frontend/config/prod.env.js create mode 100755 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100755 frontend/package.json create mode 100755 frontend/src/App.vue create mode 100644 frontend/src/assets/isovis.jpg create mode 100644 frontend/src/assets/logo.svg create mode 100755 frontend/src/assets/w3.css create mode 100644 frontend/src/components/About.vue create mode 100644 frontend/src/components/AlgorithmHyperParam.vue create mode 100644 frontend/src/components/Algorithms.vue create mode 100644 frontend/src/components/CrossoverMutationSpace.vue create mode 100644 frontend/src/components/DataSetExecController.vue create mode 100644 frontend/src/components/HyperParameterSpace.vue create mode 100755 frontend/src/components/Main.vue create mode 100644 frontend/src/components/NotFound.vue create mode 100644 frontend/src/components/Parameters.vue create mode 100644 frontend/src/components/PerformanceMetrics.vue create mode 100644 frontend/src/components/Predictions.vue create mode 100644 frontend/src/components/VotingResults.vue create mode 100755 frontend/src/main.js create mode 100755 frontend/src/router/index.js create mode 100644 frontend/static/.gitkeep create mode 100644 frontend/vue.config.js create mode 100644 insertMongo.py create mode 100644 insertMongo.pyc create mode 100644 package-lock.json create mode 100644 run.py diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..4214829 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,9 @@ +click==6.7 +Flask>=0.12.3 +Flask-Cors==3.0.3 +itsdangerous==0.24 +Jinja2>=2.10.1 +MarkupSafe==1.0 +six==1.11.0 +Werkzeug==0.12.2 +flask_pymongo==2.3.0 \ No newline at end of file diff --git a/backend/venv/.Python b/backend/venv/.Python new file mode 120000 index 0000000..a7e44c6 --- /dev/null +++ b/backend/venv/.Python @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/Python \ No newline at end of file diff --git a/backend/venv/bin/activate b/backend/venv/bin/activate new file mode 100644 index 0000000..eb7bafb --- /dev/null +++ b/backend/venv/bin/activate @@ -0,0 +1,78 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/backend/venv/bin/activate.csh b/backend/venv/bin/activate.csh new file mode 100644 index 0000000..1181522 --- /dev/null +++ b/backend/venv/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # Could be in a non-interactive environment, + # in which case, $prompt is undefined and we wouldn't + # care about the prompt anyway. + if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/backend/venv/bin/activate.fish b/backend/venv/bin/activate.fish new file mode 100644 index 0000000..143e707 --- /dev/null +++ b/backend/venv/bin/activate.fish @@ -0,0 +1,101 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) + else + set -gx PATH $_OLD_VIRTUAL_PATH + end + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH $PATH +end +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/backend/venv/bin/activate.ps1 b/backend/venv/bin/activate.ps1 new file mode 100644 index 0000000..bb51e77 --- /dev/null +++ b/backend/venv/bin/activate.ps1 @@ -0,0 +1,72 @@ +# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1 + +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) +{ + if (test-path variable:_OLD_VIRTUAL_PATH) + { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + remove-variable "_OLD_VIRTUAL_PATH" -scope global + } + + if (test-path function:_old_virtual_prompt) + { + $function:prompt = $function:_old_virtual_prompt + remove-item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) + { + $old_env = split-path $env:VIRTUAL_ENV -leaf + remove-item env:VIRTUAL_ENV -erroraction silentlycontinue + } + + if (!$NonDestructive) + { + # Self destruct! + remove-item function:deactivate + remove-item function:pydoc + } +} + +function global:pydoc +{ + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +$global:_OLD_VIRTUAL_PATH = $env:PATH +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) +{ + function global:_old_virtual_prompt + { + "" + } + $function:_old_virtual_prompt = $function:prompt + if ("" -ne "") + { + function global:prompt + { + # Add the custom prefix to the existing prompt + write-host "" -nonewline + & $function:_old_virtual_prompt + } + } + else + { + function global:prompt + { + # Add a prefix to the current prompt, but don't discard it. + write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline + & $function:_old_virtual_prompt + } + } +} diff --git a/backend/venv/bin/activate.xsh b/backend/venv/bin/activate.xsh new file mode 100644 index 0000000..49f148a --- /dev/null +++ b/backend/venv/bin/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/backend/venv/bin/activate_this.py b/backend/venv/bin/activate_this.py new file mode 100644 index 0000000..59b5d72 --- /dev/null +++ b/backend/venv/bin/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}".format(sys.version[:3]), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/backend/venv/bin/easy_install b/backend/venv/bin/easy_install new file mode 100755 index 0000000..a640a13 --- /dev/null +++ b/backend/venv/bin/easy_install @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/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/backend/venv/bin/easy_install-3.7 b/backend/venv/bin/easy_install-3.7 new file mode 100755 index 0000000..a640a13 --- /dev/null +++ b/backend/venv/bin/easy_install-3.7 @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/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/backend/venv/bin/flask b/backend/venv/bin/flask new file mode 100755 index 0000000..099826a --- /dev/null +++ b/backend/venv/bin/flask @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/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/backend/venv/bin/pip b/backend/venv/bin/pip new file mode 100755 index 0000000..49812c1 --- /dev/null +++ b/backend/venv/bin/pip @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/backend/venv/bin/pip3 b/backend/venv/bin/pip3 new file mode 100755 index 0000000..49812c1 --- /dev/null +++ b/backend/venv/bin/pip3 @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/backend/venv/bin/pip3.7 b/backend/venv/bin/pip3.7 new file mode 100755 index 0000000..49812c1 --- /dev/null +++ b/backend/venv/bin/pip3.7 @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/backend/venv/bin/python b/backend/venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/backend/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/backend/venv/bin/python-config b/backend/venv/bin/python-config new file mode 100755 index 0000000..2eae023 --- /dev/null +++ b/backend/venv/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/backend/venv/bin/python3 b/backend/venv/bin/python3 new file mode 100755 index 0000000000000000000000000000000000000000..8e1f2b49fe2438795c05cacff8e2a132f794f570 GIT binary patch literal 8632 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

{>QmF23G>o-MzS~|bR;jR_j#c{-&d(Tw z^g{>2f9(woK{mH>LBofB$%3whh8Y8DtHAmsJjzR|yo%)p=Y+=U3AzKEXy-7z(>A6G z*8YK-3j7QfcinW?**&Rkxiaf2}Vjy-bv3rPs6bu>62 zhIKn)SkHxj4N2T z6W1TJSpudO?;bWch*ylZ5NUsah*4d81q9v#S{Mnc_Ndb}GuJDww=VrAn6oyMWxk3a zTyXs%TDb%yhWg}Sc$zTg2FAp1MnGblBVY-)oG9sXE!WXYaH22BG!I9l#$L4U+jlTQ zfKU(3<>!O>D>Pr2%c=k3Xe%29tpdwy3J}hC#(`)(TC7UxqQjdTb3{n zM4+cg$NUC-Bo{&FJ%wA`s@ENHZ5x*LH_p3`%BGH3r`Is%U4pc5HB%%>H_$jm*&t}d z5PdOax^*Z5(l(PV4#p+iV&7bc7a)1@i$RsC%tKq{R)9(rItMefffNUEDa_-(xr9wlFX~{MzHq)5jhOAR~@4>-;$*S zXoB2;Yo7~8Qec(GWcI2{bSgv+{AwKni~%QRxE9`&9BKcim@ps|Hb9XEwF-{=q)0`6 zV@lCE5R5d0`2rmUzOEVRtx$Gi?-oi;+?mE%$noId%|!i=XUB!*M@0P`b8cZzj;hIT zb@cAF#J3Ma z{_NW7YE|K2@&!j=5naN^X?Cqqkl$D3kkI1t7$D_6slxP=%R~sDK zv>BP5si_YN*K#1G$3*gPGb#1stYlQKgipG0^sgZ6CYj|?M68~EjDP)DBTnF#osRsS z!wtg>T-^1U;~M3r*Rl7J(@=s$dA??F=0lzVY{SU!D2tp7OA*2sD z#{-??MF2r8Nso8#dvKc?3bpzuxu6!#|$?ASHgm^ z%GN@vB;j-ElsJdC!-~F2*gDo_C@A&1jI6Yd z33L3V{5chvf6{?DsF#0MMa)C^(<)*f8WvAQ8wMi1AG9yn3z~BegWHa%M^LH2YiuQi zhv=Qc-Nj7A{v3`$LQTU)y4liVs$ai}g2LhakwA|#EczMjLsD^IACih4R1&F^+TQne zu5+tlsC#2=cEtKw3U2&Gf!c_OVPijlkk;=5hwwQM3sXE;8hQ;K0rrBSW=a?F0|Ri} z%=-U6>umQX#~%kzuDC{UQJuUJKMEkt1}e_5-m= zYteUz)>#Bwp)_*VveSm--xtg{$tNS^wU%odQ$^cicJE%b1y4L zCdAm@Z1H<+K!@2PoLU(=XuAdB=Y=m?TN&QOL+DJneu@57u6-1v3Dl)=ZMJH}hM|cJ zTd*%cTRCFIvz!;nkiku zzi0CZt_6p(t!$|?sWQ^r8pvT(8p!D$sS`0g>RItG&x+Oemh|*Maf7Wa%7*Atf!z_% zuh71rRk)F0F705Qy9V!ST3&)n`-@&T6D68>m+_}bjKz^NG+hdnGI&}-?+`7!RgCn^ z5I-UuyWmG=zyFcQ5!xrj*w}I@3=}8YZixzB{55pvm<+T)=FoBQmCzJ^m+Z{S~#;aXy?W6 zGDe8BWn-POUuEF52QnygsQ+~WB@TnJL@(_ba2QO$nvqH;;Wd~VeM8(7;mJN%Ql!52 zu(^#GH*!EL!jz1Y4F*E!rI zoON(A1z(F6Z4!P4)#2z0Ca_P1@AG}^B&}k<&1{46E)ZW~P7#jzoOBtJKR>Wstt_;^ zleP7H7DlF4wk-B)x1MscNMN3u@p^eRpG9C^VTCSenUBRe(;6Rkov;PIdWNuO1EVia z%vj&Z_nH&Dm)P~OP5T);z<_;Rw%s&)%~mIIG}XSHWE^qO6F)e;!Yu2IA2Z=7 zf@V@Mgn33yH8XJdud0o^a6%GgyqOeE5uLM{AgQ|XDgLaI{&O;y2)h5<2of>O@i5=x zANk=Qg`iCoPd#8^JBKv>%St$inIQK$A;;7bt1V##!NVE@4W{?SYv z;lcjr@Y~-%04rOV literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..157a96d5f3e34f0fba0ec9be8bfee8880b15cb3e GIT binary patch literal 7510 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..105a1cc6bb71bac8b96d8171d1bc9d2ddd1b3d82 GIT binary patch literal 6506 zcmdT|TaO$^74Gio+3B5~z1V9z4E-5b$b6A}^8n3;YItK|k=q6Yo6n#CNJM(>q>Y5~K)v)HPkVQ>W_O zzEjuN*V_i3e>JZB@^2Rn;~!Kh9|s?A;#Ge|!422oCbu3MuK8nwH@N-K;I^<%8g2vi zCSO5)McAk}QEzbvbw{kA-kR?6Ro;%A(W<*TYP;>xn!7gYxSi3uyFS`*H%6Q8=4i{^ zGL4@b@oTmr&fRazKbZ#oFmo+BKiYP;X*TK|vF%-W--yru!oWJ~d;{xjh>KWf8}&`T zh5DA*=I1_cxR?0(cZ}Zl?8>#FN~Is9?7FW6+lzdqgks%m*Y{M9`9Y9K9>xbOP1xIS zz0Iz?{`&X(fr(wyL;n`uJ-muei<@)9Gv)?JTmIkCeT{Je5`LOU7REdb{FJEq<)R~z z9wuD%+iiyDuJ~XQN-Uoq`Y8&*(C-Jt6AKjsPq$EKpv8p@j|6A?G8wTj?K5^wQ^?2a z>4&~zevQDXDJ7}EkK-g|L!oDfu}b|o4gD0PCvhaOt{+7#*~c3AT;iJfQn2JmNEvc2 z;=ZQwF1UVdAeO-zEC4a0tn?YgQzA^ej1xKXBRzdbO~yj*=%HXfIP~LCjmiUhPx%Mp zYJOOBVEK0Uy45kgQEaStRa2ue^t@Sel%MyhJ}&mzXzGRg68MfiBK&PA8 zcDaH+`Fy+nPoG24YvW5{z7vkZ$d_bVCDoi@VGaMauxo2RRpPaA-5^p=le(s}Q?gr| zxI+fY#aIfMxZr&TX|tVE1CGP=@bvtAyO;{Q6Fx7LDjaWDb-v4pS(imD!}pnM1bc4W zvRuZSD~!2f&R#iVoBfJ#ix!Ffk?_2%?RlewPa^v6c-{vSKPq}!p2w2_3lVpEjcmPG zJrGe;azH!nnUY*+&P@|vFXL4!D4Y%3vMot%0p98%zUlcq3Vfm56s#)^gU_MC^$A~^ z3fC8Xst(r&cAxCEPU~NN(%A}pdc>EY!IA{76{TlMf*EoZMX4L4Cku7Gf!ab{Up-5* zHGP$9G`T~?Iu#pKRB9((x3|{mc1!&z|U6 zCWvzB)Zd2=KMNxigF{hj-TwhwuXXhaAxNvg=hZ{IJjF?jsm^Q z)t2!6wK7{cBe5zF9w`suq?Akpk}Faj0Kx#~kwW=nN_r@}(I474kVllqCU|9<9C=fa zM$=u);gnRsiUP`6$ks;ThnK@R&lW)J{koZzQmQCTVksh>0R>46KEQ^S5oLt}5S$Gs zVU$+%1f_{svYJ*A0_S@Doug2ufJ6(n)egISnV7`h3wA>~ITZlrBLP$FIE?aqh>nOd zrzBP(GB{*U)#g>1K9yV0r+$5p4W~M*D*3D!3RO9`+hdfTkU!YPe)3#%napt#@1#r} zCdX_t21c#ufN`*U>+T)ah3t{PB5_qoG$C^Ajs%-MO6l|_NURu9%?(H6NKoRVoe@E1 z@^ZZ7d6|bIX(Zsvy2w;3I$9D(p^xK0B<=QkIe4by3dmmRAt*thkpjQ^I*QadG43Hn zpPO@Q-q^S2_V3LH&D5GVPfXL8H=)<&Z9r+7m;t)R;ur{(0(x)7wMWPeGMj*{+Z^Ju zK)I__QDZ+4*~l~+OH0bY$D4D*udn6u5ofB{kTI*-BrJ(@s}IK_>^ z+&r;}z1gqt7H$Q4y{uTI5QWJsa%4J^yCR*)nC=x8#9;tJ3cyhz^Jx8Mdv1L-9 zoi&zoD1tl9|N?adoYEv>n|)Z)yW^%lMgWp2-Q zZiwOJfE|hmMojuRmSLQGBgg?5i6W?+_GhgPs-9nsD}wCFMfoTgdrw69Tbj{k;g6QQA+GhtIlsScjkvD8j%9Q=#Y@v)8{3qk9ol z@W=4C%yz!-k`OK(K>HJn%Uyysd%5CvftTboANSlW?=D!*!O^oAe(A{!pIZn`jh~0d#d=!O^&Y9?vJinyaBfmifUA4(B6+J3mqv9!BPm zh-+vKYV$au<^KenO}9=eN>Ww7^T`#afepxSqxcMOjS ItgY|<2f@n1CjbBd literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2183fc572a446e5246959eaeea1940f97fa35267 GIT binary patch literal 17107 zcmds8TWlQHd7hb_-JM-7DT<<~i)CjdOCnbiuew;aW!cn)v22BQELn2amg(W1A-Uvo zmpn5ok(*sTNKP!LX)bM&qD7EW?gdDY7JVqvpy@*&gQDnD(T73Mm%fxJ`jnt3+&1p_ z|7T`)Nl~($v_Mf3bN0-cGw1rB|MLC+oa^k&YWVv_;`p2CS2gXQ=qCE>LFNTq-uHA( z6IwwNx-iOmLFZqiVDN9EkPr!Bilj)1w6H`*WJQO_iB8cawux@BUG#_@qIb5ZV7f^+ zHDeUgVyEbPS1VZJyx1ku@9Kq&xFGfj3%RV=E4JfVhj>i%;5X+c*E+>M@%VkC(8c-3 z#XjV>i6_JkJnt5t5xw}`F6=^&Fq|E@dc}T`LD^1mQ5+CiwAv@06dfqpB__l{kweLD z)Z2q=uQ*hAOdKxk6Q33RVgOGb7rQa9-T2Rc*Az#@ws(!f6MTPE9Q$rU42o`)d`1iv zY`ni8*8yBliWkMO=*0U6#fa!aUx&nK;jnvHjP2FL@m{UaFHVRA$_KpdrUklQurMdXT)>(9TI27^Y|SWFNkscj<}=Z+=B59UH+asd{@&o zVO-Jjm+BYJIi5Ru>X=Qx$H&y~sT20VYZK?~<0ns?&a0x+CvB%9>~XJHDj_c%-?80F zu_{WHS#O>8elkdLfg7ZRiwADdq3)+web);*RH3@bOrJUtR;FxNKQn!NEG|7h7MG5m zic3dN#igfD#-*oEMx{=x6xpz}$MZ3EM~bOdw;RgBdfRKV>^U=TTebEgRjUZ9=0Ezi zaGl5HtswEWhUV*c4LP=&ZD?zt^ZWW0&D8wFLROCGSaV(TO<~;C@91C9D#jb?jU?W9 zp`l&TR&#!;q21Nj()V$P_bj|8!}lzaXlV19`D`C*2^^t@a2?WzplRlOXuD^=ey;7_!bPGJ_o9?l z8Dy_H%`-TS^KZS?lx+rzJWn9VQ-G3PkL7pg^G0&n;=*K-|NoEt7(@txuV)@O>wGhD)e z`F403ziveg-*hWChs&ku;iXl7u39-h^b{U>?x_<)ORK@IDK*>~SzVk`v@k`--~c-J zb|caBtZv}y!hcpbkXK>{X+`KSfh&cJ$>stwzBaEnm`VPo(KH&mNGxRJ3qEq# zXmi2vhWvzY(j5^_!&poDskO97HuU=j5m_XZdQ=N-`*ZFVyXV<8Y|<O2vJ&lexXnY^tc|}{mi$t+;*@Qt>=Uhc5iP~UVTZ(4ow3VqW!9gw$Lw2krQ)3J zExE7a(oIlSd1=m>c71yW^h87LKibcu=^yTIqsk%MzB*Sz3*~b4 zR;!_0YuiEa=?2tX{R$S@$u8reMG&)l%yWXnjyNfoR=4irdwB8U8Xab~@ zuDG|#rHVVbPJ81~a&$Ov1=e(_!pAAdPLDZLiUNWJ<`{I1d!RAuT@j@z-6a`heCbrY zGKLT&L%Lmb7F;gPC*)_)a9~Bt7^D^35=^x!*^e5Mh~hXdk40;`OSkmhdXGL)B#NQG z4U{v30%ACK^`-`z(Lpoka1R=3>b}mjV}N!>e8W$~w4<$=esV2EG)A<8Hx2ogpI)@XbbRkS8uuU7VLP@y_0XvP64 zsu@Se#kR-oh+>AAEcgYd#J$dN>mC)Azy_rRBLxp$a)fY2*wv*O`=(Paftk2eZ^9{i zu024b6z+_J5kLmF#)siMJ~+Hd zc|}M_%y3DTs*)SS0i!|CSc!2I=iK4~j^(D|UX?ZX7*)ieE7i(i+-GaZ+?pCC2D?=A z|cRa%`-5u--R`F4Ymm z9A-!bDnCF=Ah0mPMBVoA?s%LvEdX%Y@2o> z(qkf)7A^IsC0X8&yv{5KKg6ImPl;wypn=kewd5z6g!6fbppZ@QJYo)U3v|k)^f40{ zkJT1B2cJL%AsL`VF^h}n#439GbxtjhmPs{gYm3us+vj5?3NJ*b5=v1>>+y7>jpD|( zIBqnL2aj5`O+;P~*{1DycoU%>==_Gi#{AO$6hMe zKm<@9F-PcM-kgnnMx_VkS$M#>wT<#jX(m@e>%RhRQGX#_nexCEbQRhOZFD6cahi9a z1+pYPB2lfwg7olgE+9xn|$Tf&%bu%>g(68zww2_*zpr5Pdyb= zA+=5K(qZ?`fyjIq77La00u>2C8M7R3!VfCe%tf4O1mW#>Z~0SKCF;(|5I|;al^WX2RE+=E}UE73t`$yNL_h zjcd(h1GL{rHj*N_OZ$?sM-$dvqnT_Rzk9BRk!Xuwj(Y28zQIb@D>JRdHgNh>}+#uWMxyNb-J$#}1bN1M2=&|Z;-GYejE zqYLUg<~0LF{+q_Kc|{3kFeB1h@D4;fU6$o1cR&@rcqOF#FTYv+7i^%I=I`z3EChL`_^q zQb>ng%2U*!UR3L)%V($tFAZscU&G~{K%%8AUHU5^*;O?#u2?Y zK{W_nP*+Zm4Z|GX&)_1bHZ=*v z09V-!9^rR^XC%QbQY&}-Z6X_uhPg$hnFg;&H`2mXyrOA|Y%{ZZU}ay!0zLLNvyF`C zIIA^MjVy7BW@h~W#B=Xwe3KfJMSCdBFW{y z0v9py#y?P-4YOB!8SS;|G*L$LM~!l$0|;*yaWC+(h}+ELx#Bio<>%WsJ%0($d-(ky z^79>=o*%*UUVi?!{Cwx8=h@co_}NC1IZ~ff0L5=I$iaG)5+k$6VaQMr3M7A!hJm_o_B$?e} zO_qEZy*0U1h2F;2Vr1LK7H_CRMz}LNVBm*PqH2UiEjmj}G@#IkR|emRJy3ULHQz4d z%dQW^$$rHisLsK9Ca~+{8yZFJic9VAj6&<0xPI8&C40bKMFk8gEV+!5az0c}<6%a4 zDmQ~MkBrh1Rv0gZy$W-=g^(!}BW#ZPQj;2O!EI41OVEv>ybW+us#WY3VX&&r*2^Qj zjpbX;s%O)Z@r&F{+hks$VQ;xVY>I@?1GN+mnM@SN=VnHDMMo71L8=(-6?$p6@jtCm z`blsU8omM$FsuhHGTN9D<2%p*m73VXBY5B~OaeFu5DP%$8^^p+Mw4LKAfrnxqu(-` z;Ep5}f4e24H%i2XK)f0|x;86s} z$nmI&kx>?RugD4Ni3F#7mfne>5wM0fXhc3oH9m`E{XZZdB}t9-UsCQOJ-9%(Y$BaQ zF5eTRNoGp-W{`0!K-39om6xdI0ZK?-GI%0KDfdvQC0PR*${-~PhFy{`QRUAe39Ogh zRRz0PepNy20B;m#8gZopKpGsPKra_8Xz#R%UXWI6CJLl=V0cod3SQX51&Ijs7Xr%F$CFr&dA}BLu6Eo^w~qrI}Uv z1>8NvgeCpzmozG(KP?e^Cg_%kokvVci9!hoUzWXO#YIcUCh-44I9&z*`QHYGAIZepao~`FF<*O-iFrigZ@vw zE83VrKCO;1k&7Hg5~P%~taYXfnOY^Js=T4F!W&fEj+6bA>p)^+=RML!wX8)ah))QU z*_qq?bNg(OO7^pBnQ;n270Rz-%q(bA9 z6ueNe6#8DRkIom=M<|@>_q6x)_l)-vGbT*k0YnUDyQxxA?#_Xe9q##zCQ~Wa)SfuV%YGrs{ zDd#OYMb}fC%KJ%{+W_q+&nH=bd@6FSZ)HoeJdx9QrzL=Xjyo-%dAOOC0$;8b{UCLP ze+#Kv1*2F9%=v1mf)}5r=3Gi^emP6Gb99>yahyVuCg=s2Sgo?4rjUnYE_$!^ z3QOT26Hnv`njV>c8d+Ti`D%0eKBGHn8AQ6>dY>Ve@D#179&br!saP$`MHIs2E~?Wm zZ#!{K+VV6mrsuyzCN#p1L`E1<;awwyTR^pdV-)y89y;Vf^$C%NuP*gIOcME`Z{EX} zzYl_tKk$<%xhAZNAu{)HM&8$nx@Qao%>cylb6sOZ>UUzIS?WE2kdd$ zZ6(EEfrQF!NDv%fA**FCwv_1QYRxBCR~UjZ=fL+JdYtWn>HfDW{rNU-&ck7+AnEue z*iLY>`Q!j+9ltV2CeAV2b>LnP8z$eieXCT4yU(@Zd|0f)mrAd2TZ>L*wXJzqw55^f*qxNjV#e=EnpzPbIIFC^QJ|%ON)4gLQs^i z-ciN~+Ko(4K0R9xqg_>KQ2^FqMk4G(V9szSow?0A(e1Oxc)H4rLLGMYVy|f=YR@(f zCG;o<|a<01Y*a`6hT4PYE` zi-&-5fZj4w=!jW+2+GORXh5-0n{u2`cZ|thZVmA&!)k0!#Dmx%!yr(U4C^IC5LOS^ zj6!DG5K3-86gj*wz$#NpRg%jO_J1|*UsnQy>=9W)!U8Ru&&nE=u!)e3=QhUt7?T}8 zee%lH@z<^fiA85cfp#e}bSpxZ@g9s8)VMf#A)iu9K>S;cgLt=;l#m-I8a8c#dd^Ek z`uZsv;sIo|UQ6%QyNn*7a-`PuKsNN^w->5E#rar zG@6u=8O=SONbmrH^s1AhC&jT>u3ppKE^QANF$|H=;HaO#5QUT zHE4v_P)~tw*SOwg)Y~4`>j~>+8;OM!>Wbz1avjfiG&pqbj=o&Ku8H2YE|PuCoY<-6 z2UxPR(TV!sYvd3O)2Z~nX0DNgJnVD6j1$pj(?pW5ol`wJcx5`27@K6F-I9RqkdT7g zh=oD!Z5D;0K$%ut7!Z=CwG&?~CIR?SNEH~N5|dxtFPnhnq!_V4uHGH> zL0*j+V0-IzD&Aek*u9c~WDVnhPY(Ju2zqW3HMI3ruDANAdN%&*k5SxC)JmH{`iy<3 z$Z~+~tNb=LPXi0{@ks2;2HKYtZ5gB#)dX4SXwp|tsdqU~$pTd|$()d1q-?TSCXWum zRY4M-8bo4|pvZT%$p@ASO|C&NUXoMD7rH{6X-dhLf(bNR7CI=6in4seJp}rSdS?MWgBj%NVZ%*R>1Uixbr(53(nM0OI7V^em@TnUm zSv;eZyhQYyHB6(MeMc$SF&^#p$f$A-pMLt`?qg@V2-=;UE6p#I7c14JWx#W_o3~b0 z>-(QPcah6XU{x$_W2jyo_gntjppqQU=c|@7Gq<`gys&cSvGA#e-nwPEesv~ zEITmCKkHs{d5{dypuzAQHKF-X5!c3Yicn8c$6_SQVNCihxsL`_O2<3YO zT$R*pFA7~nl?|#cpEanv6uTZOy=}@rk?^nS$$hj6`4>bWN(+M*_feL2tg|Js3BQu! zh~_`J;`rm%z+e`?k3Pw%dirGKR1LCp$L%R)4LTv)@vL{*sISfgAB7xl|AZQ}kkK+k z=v^%Ym2k>fQ!1cZNMa*GpT#F7y_%z~?DG-BM9$3{-4Q4ceG2aT<$c$~fSbtK2@EL# z3<HF#pw_hKYFGBxzz~yIX+_a|B6yTf*W@~M zKIN-mrT;bwr#2z<TZa~K!^pt@jY5FphDCLj48 zC`5ot$y;F{MZf@j5hM({^!3YlU!ju3lw(d!JR#=P@8D*o05bznD+t197+%k-+6uzN z$+z$83z|Hqo~n}F1f?bbm!5tV#M(%}XKpO_($QK&Yyh6&!-O?}O+=K-21rc@F&XvI zkgq!&jQ?!NhKYfP*abP~C}>))s&M_G$$TmRXy=F^`?>Kq&Rv?ka;b2!&AW6M0}qn7 z;74}z$soymJxHn6l()#Jc!5cn$Yy~{Z1i7fh5L}v4D#a8dUCi0e#wgyFBYjr#7Joc zy<VztR=LB}k0 zt-hE1JM+dob4&27#9cT#@6hJrziHgYhf9hpHS~FW&a{x0^Y}OkdG*$eL0ne7hwoMN z`6Rw#Nyx8J(Aa!(t2+DU|;h&Bass5=jwy;EA(v( zKq@}!u7aKrXh6oyA$$@-y8a=LL5})B{Lbj$1^$vPtS7?Ts5-y{LWkAyf1Gj@sU+`E z-)2RW7O_9I=3{F|G1fPE#C0p8!EB*qN!X8x*(?yG6N7ILK2_~73_JP=tj(;7kwGF|g*pNwB!*1i9?-W@LyDaf zu9LTTQi`FH8ZN&@2`T5w*F+~=an*2DQ%fb6d=kuEzd=v!IAPXFWW9qHlL;U3Q4}rJ z4LvztIXe0=@1xD*Z%;XraSi?!-w@{g1RxG51sqwEtUqztopp+0vc>srkRA?SwSP< zU6c!YE`+Th1o^spBx#+J*NH?2dEYah+yv>>ccL58Go$v?s?@rr;?v>03uZX#M@ z#-?1jdi`|F#@eW1)82xqKR_KrIG<~1RP8A7v4{AeX;TiOObZ_2G4$TP&5YJ#$c^6=-;s4r0*LVgEv?)wedG7j@g5?XTq;bTE%!-oi=+Q z`Z%lg(2pOIs-reMf}{G!%lsYHGgY9}fNMOsGWwa8>c*gpOW>;E@;}rE@nzC96x9Si zV+>NWt`CPW;4GrX^~G736G$q=<^q65w_@GU%;TMiLKksuz6oj?M~&G3o6PTYclIE*ovuGvdbxKGSaJZ8sj>2IY%C)jWw+xsurnW@4G%ra2m9mQ7r`&H)@-<3G z%u2FX3LVhVFJGFx$VxiPajc5QRHyhquPO;1wY0?Dc;9)Mlp1AISt}ul9$04@a5;e>?5dv+{-tED4aTjbb!boBu#$&VKFraxJf2pb0H9{skH8mV)pa+$C>Qz?s; z$r*o-@l>#hlv8jqlj&Rv#*HZwm5v!_%A6W|p2y(W8R63gW~e0>hZqQAs6}v=XDp8- z(`p>$EE}EOBpIZepGNt7ip#`f#`V~+IAhyFj(8F0?3!N>C{kypSf<d|X(G;WQ<$m=EW!vfaNsqL85jY&gPZDW7V(*c`&%Efc?0so zUo*fD)Xim|+W;S9`!Fmdc!4jUP5~Q(5fNK_Cm>L-8T$6zXOC4J*TGI_^DWZEN4bPI zbisLp_A(~ewY(^xYXn^*5Wb~Rcr+@I-_k4CMsd`jm_(z1>JAo2cT=oEtLipLHXL37 zOT%I31sq-i?=u{}3ZbiIu0)BvcP4R-1szf-^kCqso6QUZ!H^A%DioOGyhu`?!m)5J*%3vU}a4@L9q8cTvrdVSP za5g!s&Q3CgSD^Vva2sPEe-ps?lw#J}S<7boR+5P#mbWo~Et!txz3E-{HoYqre6-i8 HYdiEWb(qLk literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/codecs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..552bedef527927c7fa96f6e0b816f2435cbe3c72 GIT binary patch literal 33953 zcmeHwZHyepncnnF&+P1Qce$h}e(1ABisG(JE~#&dk|mN$(xy$VcqAoSBiZBGsb21I zXJ=O3vm|#iyh}tSaeODAFLyyc&Jo1RkHh^jaKIry>;OLCaLA7YNPr72LF0ZTcR+H+ z9TFgRkiY@#JkMLz)!nnRD@vkdACO&4^;dP(TUBqp-&K8be7usw-;WDVz4?Rpa=E|Y zMf`UVC&%#%eIsa!Ru9F=c5RY#8bYJP1DXN6YbQtooDJ>%wlcc~K0Ik{@l$@M1v zl5+jx&fG2M9p`dRVEZrdQd&29#)=uMD11k)T3&@dQ2TqQ)*g0u0E#@szYi<9acxK z9ITG0C#q%jq?@abRx9c$9Jf@*)YH{*^-Oib&tKiDo?XfZ|JkqL$z*k#KVIG59`nb{ z)kJl>U#Z^Xk5zZz$-VwWb>|my>N&OR-JIIx@48i}?#A^|wHw#FZ{@3daP_>}gR4FM zeRz65u8*k~aQ%XRKdv9Z^^590T;C_pAH?fAHwy^>H%Co;P1ip!?-@K z?#K20a_!;zgnAIy52Ch5aCK5WgsX>ewO75R&Zv=ho$5aIRrLi`#@VCli|XNbbJhLo ztnzStOnpf`g5v@8WwjT_DRoZm!*N=@q8`QZarHGdrw-uF VvRZZdSpgOO93C|9x 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 bxC6&sTtgiHqh30!%zwpYt!1}Tm@NE1w?f_{ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0c54f9ac561daebb881e07f4e712b363abeae8e GIT binary patch literal 7149 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/enum.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d82d470510f1ce3824ee12c00592f71d94a4fb9a GIT binary patch literal 23795 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 OGuv~|BG;7r$o~OZ!D>zb literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8209d5bdf01dcdd61cb33da956255012c189c051 GIT binary patch literal 3385 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

  • %hTy>n6U|(*u5YC5yl?5ypM&-h{NY%Mf!Fn?Yy91rh!- zv#S#ZF1cK>Z*6YgX*##+_EyWO-@4`8+-%i1m{YIcbl7da&bRK|+*ofqTX%2Qx3-$> z&Ru@@<~rX1f3=w;2dySL_*hR0DK}|dzb$LTFj*sjCB^Kd8UtZc!VGyzjUmiR`)FPY z(abXN(o<>-;)JT{Ne)3hxjb=JoSh=c!bJD!5t3B;%`R(gSe>5jILIaCkFrZ7I?4ll z;V;n}DI+yjkJVT?QAb*=F{N7;S7U8g`C1*W#>hUq1@Vxf-_u69IJcM6l~`rDdsOQ8 zfaUAJ$^)w-vGkE1>w9^LRghT4dy4-Ja7w`Wt;8ve@^OBzC~?XX$3U6iE6JXU?3u!> z-(%J^X8nhpRUQ@M!k!^xOp?BZMU?B(z8nA!PWlG*LiP;==$%o)E53A)#f0 z2%)BlBEe)cXV5kc39=Dcz#!@x-sfwj+&&)CB0thu|9?R0T2K_iT>A+b!G zYfaSLXKT0(JX=GMTxUnrP*hzt)DlV^Wl3F> z<$^5d)t75Sol*_01pM)TMy;v^jas@UYM^!+Zpd)S5M;Qah2V4)P^uB2BXw69E=Ovl zF-mb&!CO|0AkIZOI);i|f>rscuYnVs9f1hgB4cT7oh(btYHP zbah@8tLXcd1{`9Keq@mJeS}ZWNhOKZmKtlnhO9O9@HgY@(O_ui z5+{#2GDjq7;|s@+&7e;y1Ts&`GqOt}Fl3TS7d`X(e#dn>W^WKily=L!5*G+cIBKd? zWi6MgNGJTHklt#~YpY~g{hHdFdP2Qs>H6|thd$e}WGIwga)S`G3B8yon zq}`=T6*sA4oeByF6Xs`F(r!tmzr;vLK~&L8`6}#fN}b7zO~PM5v4ee@NBxrLkb= zSHvAuFF@&US@ibAqN0w5pq_K<$`$^I{%l2u!Z`g%gA~ml;0u2N4#<2W^+*fnBNz>x zsOVAC0D|5dfbwK8N9u@1w9}FI<%lLnw5ULHNBOKSM8!DI@X~ga8x^Ax&5w&+UBonw zmUdh|k=YZ=#o73>vVapEYR(@UIQJ{j)QNhcBA^wr_H@?H$Ay;0be4avBJaqtLRS(0 z9?ir#;yu<`v0D=ViQHzEvMD+G-x$?pu2344Sz%;E)xEh<<=_yUmBE?bMJ^_yxD;!# zaXin;%s9atA>^5gs>gHj6tzdw2REWiwB9mC@Sb*UG=mvagcVQ66~a2wc9hXH-pRJU zP-24>?kFQ8F2~cy^T^O!uK9Z1e73QAvzFd$DA>qL++%r$ojr=l*QcgR5 zrNavhUPf>yr6(upxkL)>PjMRT?tZ)ynzUTqdi?H358vOg9({8Efr&R9T<_=_Mb~Fy z8h2Vevh)UsgW1~^k)a>q;^NspLrp^?jWvv>7dTxjbPxH9cVLd+QdXuo_aG0R^|n`m z{DOqp5o;)4$b>4_blbIs#K0pCo&=GxASJ_1HYtCO>@CfW^78aZ%2e4x*u%u=@m?T? z&s@Hr#=bW|FUjFuKx_jNZ&R}z;qffQ>l#nWmV~X%+oxdtfee_9N-DWjcap=SY+|%T z(6iDtOHq(Pc@S&!+H9jt=e|WJVxu(P>4qNKUeqvLs4F$DMxJ$vop*?x`;r~Gt+cD+ zU9=lIgEcpFF9`bLCxoE)1%KAi1-cW}J*R0IivI+(kR~fdq*mGtMQn9SYJEz=3rL%) z+Dw`Dp`;e5L_>;MQXVMnQl`#73h}xZntl+W zZ{V|490s&!r`1mF8q#Bn1&(Dk<}J(i_U&P4oo3+JL>>vsX2cu{!bP@VS>h^nQAQ`T z8hMtdXU^$C*1#D>*(EWOIfse5uDQdXJO(55;RlhYl%0d8Z(k5T8=9L&X;; z8Wqc;Fd-)(d-H-OOi^xqQuKm$8#zx>P9LYR(1h0I!6{R=(!KQcewz-I@DU1K*9)ZE wlCEo|H%qfd(OA%+SJJgEcLK?;rfF5|&my#4y-P4s+MJQounSe-F6#yL&+gC05C8xG literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/heapq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aea3a71e248203271deb68b844a5f6dc965ec57c GIT binary patch literal 14410 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03b534f5bf6ffe18d532cca0a0fb06113231eecd GIT binary patch literal 6161 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 HT&n&Xc1QuJ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/io.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/io.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93e3c9fe3fb4b706863f6153a53fe41432258274 GIT binary patch literal 3464 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..779a28a26e2cf181103063b958586c31518bdd5b GIT binary patch literal 3837 zcmZWs&u<(_6|U+ZGwt@+aek1ESJ`auN^CMxVjEVlC~_i}ghh+MEU`m^+11dVs<=LiFd3XB;*_-gdhkG9PJAd7ml2f_!l^!zQQF^xN*t_zE|C2d$T>$)vvp&URAyC zz3;vL&fHwcaQxSO|7U-@#Mr;+W_q{~zKv67Xaw72f(s|*o7`TVO~+o{P1jz%O;5PO z6aKcl>5FrsA>5~Yvyrg4DVoB2$~FVBAObOir!(Tb2!#(R6c@y-XhE74b7CI7TEbap z?TZJ0zZZ9RWRxbE)KO36gXoj7*~zm==OfjXQ7=iQUJApFokU0U&y3836p_gzC1Y`R zr!y?m63n^9t-{UlAJG|&5y$oI3z zU_q6xNXuAtccNizcFzT({)+*crm|S6tY@Lzy1g>p& z?FEO1lC_;Os28A1H6J6gfZ{ab3S$-n3C(CKFwLG*i zzQ6PV?lNf&urwSi2lJf6sRJ~Ohx{sUIbD*c2W`h%hI+uS;E&j+bFg@itZKor+9Iqh zQ8FDbt+jdS+h=wgXPSAaP-NIT8F$R-W|a1LSe zzB_#;95Oz@cK{ea1PC58Za-8%;EaC8J4CyUK98Ajv25?)m*11dF4|hUcA_u)c;)-# zd3Ga9VT9x1P{c-_*)seX?kaMrv+E}6=9!6;EQ&L-g&JGsh606fkK&X9WW1z&?Ck~Z zdadm%GQOg1m$M_Q-p*If{!k8bHU6$rxv~~(yK08I&Qe$3>VMs^O}zRlPJICl^8z05 z7SMEn>O607Men-=Cml2;DYVx93xoo|_5*d5%{0~ zqTu)0XHO=0S0m$EWSqXEzQ4CpIG=hGcj8U_Nu$6BX#M%#%6Q&*M}E;b=9A_lmR$u> z4IuTa8YyVH!}eEx$};CMLufU3n|)Uw6&|Djh_BFGci7&_qsjr@gNOGM-Hnx~5V9su zz&4f$VkM(|WTLzm5o8s7H>RXTY-4!fkqT0S@>jeiBXOCqyC^-+u!2I-0H- zUd2-#N!RG^4o>yWf*m=+Ip*p%Bv-g3QS20mz43xY4{s;#BletUjS9c#Ty0bcqL*iy zRUE2+j4xEP2yc-cvWXAGuV6%A8a)T7|FIeav{!+)FMRmOpJ*|%La4VgF_2b7yz>346r$UY_jmqv>k*UOvY2N0w3QQSX|Cqw@vq^4s}IvuGY& zIA)UoKI;FNJpk)q*2^b)epBhG_^1f5hQAg_&5LC1@R&d6+TQzMI}v^WLR>{8>|Vrq z$zhY3Nm$GjVG*3#q6olgvj=~ui77r43S-caKuR_vm4T!*60^4PV0o_!h>v?n>jMdj z%C@iTXkX>o_RVOhkkq3%8c40MMR% z5$UX*P!CZbx%N6vjq(TPEZAqQ339DqZ?NAvdmgsMOCH*QKqhsTRwy1b`C5d$3Rh`c z-Fz^-yGPncb%PzeeTGVxR?{4zt?xpZ_Eih$_u_vz)H{&cUpYg=A);Fuy`Pw!GC&Ho zlDdp;Rg7MNRL-RF!MJAXk8OEVaY3kuX=1Am&;(T}rJv|{3l)GKHGWaZ4pcqpsx z^B)?clC6=c?*o$~YZFO$`B0)OWef|LTBHTMNsFC5O$3Vas9jbWY{j~&Ej%z@TsB3b zY^mY&hL&s8RqFc|HN*>5V-xau+)}>PKS9I%fG;3hT;ZPMfm#;u^Slt!1^gOL;CdjT zH=UN(LXVbxehE(~%QVn81UV5gUA9`NoyVzYjuUQb;D#K)a?`IN)Z7$(ftwt4)s|Jr z+hC_}S$6Ue>8qBVe3B@q7hF9Pje@e&vw|Oaq6v<2;7SeD46gADm&)HmzE zAyrk&ZXx^YJ`_^TN=oZ$I?vK^w2zuNnwE;FsjVVPMiSL9rK)5wkRm}ELv2+}gTRFr z-suQ4TgwX#qEk3ZbutxR2Ssr((FT11RD&WtLPCuzWndEfAz<&UMPR+y?vnIi=bhRdL`AuX z1|u*POjdso(56mIKYdqGUA&db6GhWLH!bshc@&wFfT+r_iYj3ZT7%8`8y~5+;fpFl zQ-+;R1z@LB2AvK?5~T2Sv1>^3C$*cR1g);qKo?!?r$>y?Mg=g+x+c$2+Bb)wl_XBv zjnnuoz4~jw`ii1&kIfmHql)?0;`9by{~o8NsAqE&rxc?UsVzhwl>}7rh1}zc`nEYL z@#%lAY<4;#?{+%s4&JF-)L2&g8YFrNkHbr1&}w5YNmMf`id7rIR_z)3unQy(DTCDt bLu^@H|Lzaz>3`@?;q{wQ-aStGjrz5<(X%mdFGipvnRK08;@atjo#sxn%iLvlo4d`P<+}>Q<~8QEFU1O3^Ez`6 zIJc1_-`7{REySLURcBK%cVu)g8w_mpFW*SkZv^6ovi<7QmB+>96QHV>LNliwT2?^9-$PW$pkUG^flo_>ehm&VUb7 z#%Ilp86ck{?hf*N%B1i=Li`V!a{)EnG2&;<5b;Od_?2U~9yRB0$6ro(IZ}Pj%$YP# zj#n>jWZcK%>V?PYg~wNiNpUgg2lp**++4VsAm#+`{3UZSd`CI_ka;=?LG_X6V#NGq zb18^1^ZYHC%ltiKo;A;z=S_j|Tg?mRZD9Sq-8kk&QzX1de90J|xn{{Mn-$(Fn=8Dz zYAR;UR87s)!#u8j{Gq}V*AKc+x=-9XahrZS6?@ygFC+?+g_G{&ttsOf|283>o^mJM zleZIb>UH(!pN*M@{cDAn z%iK1fG~WwvehQBH0scPC-)HEx&+_~Sq0i?ml{TTOsP#io?}y9}o4;ay1pHU2*N>VX zGk?wexcLe5*Ue9wzhVFWruixJxA+S}f7=9qKW+Yw`5E)G=BLf)&EGXY2mX8J@0)*M ze%}0o`G@@dqWLBB%fPRY>pwF8*!-&bC+44;FPML3zG!~Uw9T)ZFPYyk|J?iw^PA?k zh}$&(()_mh9rLfuzb5o=2rF(L_+9g5^Lys^!T;9$JM-_&e=z^i{DJvH^PkKg5%ZtT ze=+~n{IU6O<`whb&Hpg})BG>Bu2kyoHM&Lf+e&9{O10n1MkN1T2>`j*X>H&c8gTR|ZEdN72 z5Y=oSaT7i8Fn&RAT;$(Rd;|wV|3UB};BW{>z>kD*6db{^9{;2G1;>HMfX7343s~?3 z@FZ{om;_D&Q@|-;I)u|;fx>zwI1|EI@C@)&2iF9 zObE|{1Jh-5734SZ^0`NBA?SKQkX#PHKkx?YP7(xkb0O4M62@94&P#S^WTMl6b zTn4U$unMk(um-LIHJ}b$1-uaZU_qk?n)t6tZh+TAxDK}QA>IJDfUoO;P5gozVca{w zUmwCd!S4dz4crXjCGdNI_X6(&-XG#`0Dr*pynK4{jlc(i4~6jI5PuU`@G|htA&$a| z`v~wYz(;{^1-=dVb^-F_--5p*gzp4@EQId@e;iQR@_#p=XR1e3pHGB-n-_kCqxXfs zCxlyI!ENA^A^u+Q_l5pXfxmwX`~cxk1D^@uvtYpwhVVJCK;gdx{1EV$fgc9`3h*N# z{8g~vM}Z#${u=P(A^r)l;IH?a4m1OGihJpT_u_<6A47l3~V{GzSzFX8)T>-!aaf`0`3V;lQpwl%+sU+_;} zPJDc}Fpck@0$%|B8Sq8m*MK(g>%fs z7qAw!EVz4Tt-jlg|?G*M}w(mbVcjsp(@Zw4L$_5l+iJPh6s z8~_dihX84iM*wMzM}cF&qrh?CG2n6FEx;4NlfVgJ5;zG=0jGdz;52XsI19`GPXXtE zS>QY{2V4Ly0#5^%fO%j6xC}f4JPSMrJP#Crw*oH!Zv);AIKYcQ5m*FDfB{@!30UsI zEBMR66<`&p0Bb-s#5HgoxC(fH4>W)#a1B@ot^*rD3-~%<6Sx7q1NeI2oxr<*cLO(p zmw@*G?*-lmydU@m-~+%n0v`lE1bi6yCg5e@n}Lr2-vWFzgl`3Z8}RMGcL3iBd<^(5 z;N!q|fBaVpqW33&?_m{i2F?8rtGVwAHTP}a?*y8App(19x707UZpY&>SG{w4HSzL@ zx8GGSee$MapSsC<%ROV=z^`ZD+w*Kf&rD)Iw)clwK^8wAkHuzdrDDa+`^|d2<~8zb zHPfuP6T`y`D{dIb*S*@cvT^-V`5{t5qu-`KIrhsGw?bjkMHu zc&%8cMJw)_3cFUUG;JQ`MsX4PD3f~8w^iEGYTs=H4c|MSUusrMjdHCzk)LS{7b|`( z->Hsqmx|3wg9epqhL-s@&m!#(E4rml^ud?4-k%$fx08OuYY#0)1+~ZUhWQ0Ww|5d# z_uM7d^IQ`Z(H@xgyc%zIs@TqYP%f-*dpLNxRI6TV4^l*_R;gIe^(Al3gF|BNRIyQ8 zvTnJZ4mz&AEx-iDdsMppT0CR)lTzZa(1?znL0ap$vHpyTuIf?Kj9=W1^8n) zo3YLKYRbB?-Ld)Dc)V4}hppHf)a{`Fjpz40K}R$uhV$XSDR`*}De{f=n%=Sf0aMpJ zbxp+A0eOPAJ`)>HwByBge9^m`!mabl+aJE{yPp4Wv07Rw79T!UD>cQR{==7`a?vZT zJY1e{6ich*>Co%$!(~4VKD5jESdyQT6H58)R?MT73{63}}C6>G=Z@rm&r z?aZ=QYt}U)Mxzno_#11BwMsi%b^P*j)v4F~YI|GVDfteAwZusE+uN#r!5kHEIysH- zqFZ+sHypoSEV=D%hT1U1$O(StU3am=-#c}0 zn3wlB?~KPi4FrTrrbKzmHE*LmU}v2kvT00tgE-FuzS751nRq7N86_GwNx+h0H=ai9 zX6#0+5%+d(#%?7Vaj6S|NSGT>wzFX+t;FBy)UGjIFthi@rkiy`eKcOp)|#l>DuAEC zi6zqURD3wz5k;zppal3AaZKz+{QBw57>2zkZX`Anjo50!+hY(=n~YohPtbX>)r@zr z!3b98T_4_zKZ88GdiYt=$hVoe5x+W&(NAIxa;w3uv2qnkl}$bxC*uiEjc*S>qiNet zdgDp&L81!VDn-BHhy^^}X=ftembSI;=nT3}V!uTO{w|!DTAIkjQ-J;wv^yR5rg?I@ z!mHsm+vsa5H8GmQc&U>APcQ z5Zb&z|HW^|ZVYV38i~z;n^5XKdOy86a3fYtnaqteFt{AMk-0wGNN%RA0rkXY5?b31-lY%_hA>Xf`0$IVc);oY&FG1Y%OJLesv<=#;_56e*}*k1ecpYZRMc;1ef z!tnkB2M--S^2pI+k9uz+$@riZ3hlI~si@vgR@|zkZ#!MA*O@5WgC3fv=ezCH6=dJ| zuy+rywKI{tZl}c5LBY1;Gd82TYYI6J6|@mZP`{9^xJ#Wt+H#QZol-6Pg;YBoaKs0A z-WJMd+8H;!zAeSy^M_H(HNrzL3WJsb2a@ee6)#q+$49yJ@$Ngyl3a*A4gS`d`}aP1{Dr-HpS<|^s=M*T#DhlyIGZU+ zxy|@ed^2@dY!_ptno(FjMnK$BDDAz&BsFSo#Z2mU{KnvB!n@RnZw?wL2#p3llz1Vb z(Bq7)M&c%M-rG&O{-POVv}G6x$<0CD8`w;HKio)df^Q}$Nn=(eWLAl{B_zC0lJ7v2 z=ZyhM?R#f)fSwqd^G;LuLON)u9U9&^F-!>OLEdpW2b3gf%FXeC_JCinlpB_t>=^N8 zl|nQgA8HTQU9W`7={=!HJJ^&makLs-SB=I4o`s<$5Z>nyG+_nUkwvbe_3wdfzWO+C*4YHB6DuW zZ=~=iO`H&vgr@Pvz!j+KRgq@t>tEPRF=HH~rv`5g-ez1t1w-5(eRp~=0AmuW!y@;p==)u zL8vWvG)43-Y03>24>AEnGjwN>RbH|cfXf;yJ*9Lqii&F`?)U9Tc_n_o9VCUJj@a<> zuvQ?(a_v-wMHQM&I1n7qEo7F;Rk+{vSU5Kq+rwqlHWpr06zDP5VU>z&7wNuJTr9N* z&qDxd?E|*1-c!n3%-kMmG%+}|2Q1;nhuiU`b`l+;JIV@~uu#7+P<7XxrNW>PX$mPl zX~)ZjAqr**2kEyAHE)zMei;ZRm%)*EE*xZI`0hza!_e>=W`O0GPBiQigzq7oNpwb< zv_q|<>RnDjjbi$8M#y?TQa~HR(Oo7&Pey z67(kgDQ%4Lg)|L$Jte+|YX@6zI^}Bdf|6(+5*LJQ8JYuFXZsDeXeMl@&9z=!SfNW< zIIYx7e!YyjW6{lf?i#u$ELY7Jv6-+6b@LHl)t2%X?NWFm&*D1&K)4zX#8Ozu-th;z z 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65601420ac0850074730f9708f80119d377ceac7 GIT binary patch literal 13948 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 D!0L1` literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/os.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/os.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7606f4e74c8170b6f996f2e47ecba9e857d1293 GIT binary patch literal 29748 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�GN)^(~52gw!+z$+<3%due!IK*~f7#Uk E1@kpEJOBUy literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..853fecf98a00707c6f1fa803b7661e19eff7c76b GIT binary patch literal 10451 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/random.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/random.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28109248c7060a0e0364ae279c17f414528f84d7 GIT binary patch literal 19404 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..954402f7ea64ac480653eae89b470981408ade9d GIT binary patch literal 30593 zcmd6QdvILWdEdQvpI9s&1R;u~DC!cT1VW-fnUW=$qGVEh=wS+^Nl=p4mKTdXcY!5< zUGUrs0$4AUL{w}#v1}#jq;9LaK$`J5O`4{Ok|u2?bu+FflRq-eB$Fn$X(o-Qooedo z^pW@vwRQUYedpf0yC5lBnam`>?AdeAJ@50K?|sfbGcZuF@b?#~M?U$)re%GL5Aoj~ zL{8x2|3ccblvT2nt(-->WXrcxa^yQzO38P+l$P&IDI?$6Qg(erV!2Z8lR1?tI4XI(ZLyf4NYE<2!cBwnnZna14Rd=a<>Tb1P-7~kRH1e#aTs8cLrG~wo*HfiY zJReZ^;Q1bJ6wi0yc}(rV^A35x3(xne5j>B`^PPA;sP4n_ee%2;&-bfwJdb;OP=2qv zt|nCO4ZC!gdO$t+hE>|9QtI&Awt7hA-*8HIM^BTg4^R8Odpuhmx$ay{py%{65r#VedQ27DSRgId0;+`@WBQ9EvNY!Vu$g0XdxRtG1ufmwsb_jp^mE| z)c3G=#Cy2>A@!7c8nqqu?ycGCqiPUu9#JRMNu)iho>8ap{b6-lox%5G>W9^{>N(_i zTzytOuU=wDYx;_YrmBxaB=DXQ_|N(?vY> zBhOysxr98^l6o1b14w-ssV^b*Wl4SIxTQX!M$z^$^*QxPbq88}QhiG8LdtP})3o>pZwgYS>3&#Q{sjW;LMtlEQ=ld7r|zMoN^s^R;Tnp5-mKCS9=ws#tR zdlB<|1@TkT&$L>2+bNxqv3yf4s--zca-FZGy)!Z%j^IyKLp7r})AA-B#d~U5U5(zn zEN?gxt$eh3R{e+y)L!)NS%I7tKu%g;@J2SDQ`fd^+wwA-&#P6nw&j#wQ0v|cS3Xv@ zR14qd@ckKlzliU)x`w)@8b`6N=hemn>v&zT#D&uB>UzzTQ9r7FKSg6zvL@ba{oTt!eX$;_yS0@@HK;cmzFTW*x7u7@uQ%r0 zN<+C7U7fFA<5R7^==qYS>e{OYO}*|0+VlL$LgAHHUU8@Ay{>xZJ?*)w*%%L`Iyb;u z?fK0WT}8I0UU1P+6RFx=@`8%01Qoa0a9^xcQQf;luv61#C+sjk=LO5FjmlCKpVNqk z{p=z;)SSH%=HmwwTWTuL#QdNVglWDFGYpTKWOh1CFEy`uVOB56Q|64;O&tzjTK1~- z%HmnnY*PBpta()vEiP3Syt0`OFWiZK#SdkSXQ>kS;hox>tNVecx4jAXtTb--YJ?T7 zG?pvXg`}QcN#>px;qI<#dfyC2k8$^g>T`{z_R7nZ0NrW$n1K1_Y9q|7&eyB+;SM&6 z7fbaDw&>}k{CL*C@vWW2v8Fg5^#TlWht{u<4|^;edcn>xU-IXc%j+d+ornz9v_ zi>ch@`m#51^Jw)LN9FbgGE(;TDSXUGoe#7iLnzmJuzREx3}R`C>rrj4EGp^ztmk^z ztt;sM2k96qKbdsw13^mIchRdTK@Y9_db&s0Ama4gYNf%MMdvi~evppci%y;HbWHR4 zgG^gEa8b~aUN=2_si%kN4sjKbcn3UI>%qJLwCOzdo5XOkg0n$PbNw^UPz@eho&#rP?Fe7;`W-?lcbwzFk#q}nNen;=B6)MuSo9AjO5F9jw_!=Ek5_NKpDj}WiU-Im}&Zi zb@d>oDZQC(r?2F;Y<)1uE2o{>WwEBK2VVyC_+JQ8SNb*!oIs8EW4zE3Un)O;>Fo1o&xbibAV1(~0*pSwm)W|{vEh}0 zkTB1!CrN1_qlV_5n#k!#SmIFzkFl6jYlIHq@(@!d7`RCwTQP&j8GL*aUn^Izhn+zK zpH4Pa#M7`n3WzP*`_1+wOlI+6If2PFL;x$t1M7-FBVZ+tW0N7C3V?3_ua6-|8lQ|~ zZKO8RS4-p^8vErvU`W4&cUgRL=6wSq-zBS!ZGPR}$h6aKJIHS4+nFnUTc`~}KDTeW z^``?jwKUB_Q62uFu_N59hnny-v;amCN){}W@B+(zzNT@V8GoOv@j#DW&p2< z0UqK?CIxb57OV5<6+wbER;~fwF$r-Kp6b|d=rdP6BGiZZyo>{ zfgTX4)HFqQ6g5r&)nUp7Dm0k`{SbmMvnYVXCDCM#^l7H%08%fWKYd0Y$J0c18+4TV zSf)%trc{v1C9a=gc{d3JPPpb9`1m6Tto%Np>|rM>VcN;tVc#MM;~G(C59;biW&xAm zKxBOc%WDHk0h7P!Y@~pe9s^o(fR>)Kt&Oy8wRQs?rGR$Q_+)C%LQX&Nx-7MFHqx)9 zU$Km)WUbLo0nODmGVAvfY*1%LYE1$80EF5$5s;*y)|aiT7ov9FiQ3s0wUbZUN};Wv zew}E_>9lqA!Ye4tG%~rZpBG^B)&j87fDU2{e;tTq$>qT7vtXkl2s8i!(kbu}EhUlK z`D>mQatXc*Ge*SIDch9~$ZuvF_7n6{t1S9n7sRfLxCqP^!)#X_6Sg3Msfj)VGUOr* zs>yg-H=1GY%+&emOP4Q{7&(1%`eccsqpV^n@5iysnG0twzIZck$q>=`p$);1u`qM3 zvbX}-l&wfWz=3E(1S@s^1fKo92&_KG9043ZQ06vF}_3+vQY7kq--N*-hL9v|&#{G6XccmB%n5P9i zU$Cxz`(;Zu0p?^Q_gXIAaG>bmE#el0e;jK4u55=2C@b*@XlkwL9!gL#$Z$|!0<12X zui9c|&Y!qFf+qcKE>lLVEV|5m>kS|xmlt$xfmw}D}pE;pLX@35$W!`3eD2Ts`J@x^8p+xh89W~s6X z{_&fw?8Ha32V{QR)(z`=N`N0-%wd-jYsj|7E+;RIuZ#FH%^yGvgrnJ9SXus8tS4%F z_swmaOiAm^n6yrwpws#WV3%z4LRRl34|l_CMhO3xkk7C)yCZ4XhhC>2%Y!``8Xsc`1}1%u5l=;u)h zSgvh!Qpn<2yb@{{_M;Yo&@xm#d=NP0!_KK@@ch#9qDSqDXJl2OvYH?u7*s#Un2ehk z3mEnhCM1kk2}~ZxFC!CzO6?hxY^l}x^)LnWD+?9R1lLQG)&HmX_>?%T+;DooopuH@ z#q2O9WW>$`P42P>`?Gj*?A?Mm_u5%!w1e6RsU*~=@bRBP&_P{#OyVglAyHdeq#|d- z4l=T_Ns)nc0#Z`jP*NK)0Gv~K1Q01ZT_i;cw#goM4~ zJ??kwej?H|jg8)|5n8IOlQplniH{bI>N(2W-LS5#{RxuBZ~9EO>?k3oj%E08b3{4B&sQcg`~ zT65vBmwMqypu_|MBitX~!pBI?#UddB{|V2P!n?nA2xz_AyZqZQzD(--LxIdr*P2g` z8GQS<4is*&Xu6C!)iVq#3}msmSHI_Ck<<7Ke9U4MlEp%j{1Ml3!C0A3y{d2$;6=b! z0M`o3`K7awnE`tWG!~jM?v)j4Su4J1C8>-*G~pWMwYyx=fGDV`BPhH8IzeT2Bqw`U zSG-0Qgtq3+EjDK#@`H6qys^exmPy*7KqHNSh4t2|iz|??gxyVaG$a!2_)d177;Dbj zaMt$Ufcov#U0{=(O^_|HP*giX5e3Cl;bkj8`gIP>h6XIm8csUQ)fzAbK*gR#6X-4U zDP91jFa=-z0)lYBj82KZ+z)e6hiTu4``+0k;c$7ICcgj-7Lk@TNXss}HL)#67cJiQ zM(PFinrCO~3|s_&6G@Owxf=-?Ho-ZuGQ~`lTabT4_#`6GpCL(XE_#dOb9Ag{BwxjU|QgpH1zXcf@ykw!>-*$=+aESgJrq)8c zxMlml*v{x*Ts0~EQq#W!rzrW+=k#@qxKV&yjugt{jYHC=$@$*<<%BqP4E*VU@TbSX zpALXO9c||~2ipTzhE!?~=0`L~f}!PbM3_TY89CfZGi zYAiMQ+Mp=~@$J~l7Ia~KBy2__)p!A|o4S4{s_TJZXL}GvX8Sr<1#_-{1O3^-GPkdt z+<2RL{{*@(aQ&~FJ)5cgU!aJKP^xPm%4{&8WV%2%67nV{z-WJN$AFzoODldL+OEnX zRXyuQV4Rda3d)FG=?S-d2uyXeiq=4z8m?$5x!DaZ0(pYEq5{1bD#NBnO+HMP9m3bc zb;l|U!+xWZK(82Kv!h)DCK38B{fNjWQ4p&3R~9J+^lIbc{5>R}1)cbj>UsXL5ICIwN7Y0)4>*8y_q+iJ3W`vXsx;;>#JNN}Y}N-8!S$hhv)){h9;{XxsG{lm&`c1`i*70D&7=#)wl2xi zFU&gB-GDLItJSFQZ<=u|FIEETD6#&eImRL#G4^iLpNwX(3xc=x82Yd|F-;n(10hFr zU$QK7*b|MzP_jyg(FMN61SfVBqdH0G*x|(DCUcYQ4=FzDQGs%;?!*3|2o{`OLlC)| z%AFA%#Y}G<(PoeuOlvX3p%4~Tcvw>(M$6o2_0YsI!?Qq%BYmbe?+{qu!(!dTCVc4W zhzLhy%4EM(=R$P)#VLt~43B^qM;w;H#S<07p7b!v++;Oa71yi4{+LXISt8aMLw*nq z0D5sLA8&n`3B1GN(#A&U0c4u-Z>!Fqr-4vPQ``o_5!K$|+L9IL$V6=zS$A)>@TQZo z4xW64)Qv8%v>6dMIRGSx#~x2o0v8dk0lf!8!_uPnQcD+GNk#@QG4crh{7Ls2Sh&1e z1*qw;w04xdk}u57VHX-Z)Ma$Lu|J3DY%IshB#Eus$8M}Zy7AmYVk2YM4^2#J|H#KZKus|T6*dazzgRq;q5Pu&)u0eam8L{uTvnZLcrkpSG z-ly>KFQBP)2)~B!`qJQr6F6i-seV>gY@2F40G=QPUE4XMYcpbUn-;Rn7Bnxyi=`sv z^EcWlFuA|Jk%kgE3l;P*ZD`aXz6rk0I0H&upN&kCNHrzfS^bCWqwVx&e#_Ed2~x0~ zfonjCxb@%eYCU@en!Zl^tJ9{Apa9jja57h?!Pi)u{cUI$MaeyF#sH24{1N|U6nNjM z1)S70c%o_Hi7aEy6J6t>q-Woi%;b61(!3UxoGda^6R!Ln%s?mvE|25?(x z5a7a$UP68d+Y}nYT+?j1un@IZt_NWbJcWh{KFlz(9_DK+i{fUZX~WtMrY)o`5KNyy z#1ep{tW9-w0pLcJ^&n!jTjv3$gZ8KZGC^|K-Y1|rY-`q%*y$+=5c&l!zq=hSQ-Djr z1Ff}Pa7j*?aQP{4s^GX=`=~!Ir`ry=ZR+DPn^^;&To;8ruVrGLEhL98x6>jye9@Ri z!1>#4z!fBh-1=d}3K7)i+j;#}JoiV>eL+89qwmT9q=v}BR(kRE1fnAcTj76yb$vH_ zGsv3pJw%)Eo2dzX#j7PQL-wKmUr=`U=u>o5O9?K(2lZ7G}V41Kf9^ zox^^`4qP8ao}Fw(T7b;a)54Xm7ItoH0dU)RV!enRm+swhXyd25%H^(%-dvLFfnMFg zUfHl@U#&?`cJ=n;YAxA8f8JH&uHO2t)>xi3LI}E|zsI#i!vQvQ7T;_35K=RRS)BB-Sf zGd1}diZ>p&9XhJptda&u7$z5+a7_CQ;uHO)Owe4$YiX7iL;V_qA7CIf;RhM}AqMOU zwyLg!vklOZI+e5a~>jdXtSwl}&Oy^xs_Kp58- zsFa7m?&v4P$U~u?f@X?BIpVZ#-Vcz-V)HI000FBeO65oZ2+|5FeR`>*6o4AG$O5(| z-8JHpUw!|QtuLbtw<>I=n*;51v~B2s0S#}oZP+JlN<$=MOB&%98;JivB`I#&POl81 zkqtAfGF=>xUjxg`iZ<-Hs)?VxK+J>=l1oQd4iD6 zF~Jtg=ZS3P8(6AtL0fr?P<`D_)P_tLu{V+Q1~w2P*I_q$q|VD^P)`~++f{foLR5h_ zpdly1Z^osJ*cx%?U}fh)*q}=jagWlWk!TW5)ICH7^RQGwHWkfA6pucI^!(*}vZk^4 zC0uSjwnG?aMCFma1O0k3sfb0`Xxx(F>>;=HGPKo-==0EP^p#F%PqKcgCGH4os<^=l zEFV2W5a{z{oaYdf{FJVHW-^`^QO!%YqX}b;Q;2U9t&!TJDz9>H^AGDOpIe*S>{}Vw zG;s{{IEjtxPQxH{G92VA!L4%~u{>cl8-`D}*O?q~z(s=O^$+|1bkVv7cq^a}0CXDXyCOUI}JZSiuLttwuzV-h_utFw9<}{AimFg>c8}t~C-~49;G6$p}2*a;0!6!<`nuyDd`kFhobZrb` zy0|IdWKHa;f812kCH?m*HM?FIyw>R%x>-rofWU@bs#&9lF{*|bt8s+lF<6HYgqSv| ziR0%loqEQgE1IuY#n`A~Bpa)TP$V)N*B{MqdUg~nYlkos_BLB=45IH~wW*45EqF@s; z+%+umqlRiq=o*!)Ro(OrOmsRQbvqt9S1VCm&Ge`~=)?C{P+hTykzxu^h1H3bTx3P& z#MKl4CQVT-Ib){n`_V~lBi}daqh!Lqf1T7xY(l^e&bMHR==~3+9u&KtOV(p@5=5Oj znhS8+0mLm`o2bdqc_S2DvJw~5*Hy~Ua&Oily0UnN>^BAD3Gp$0}jMz3m60V4{{ zFdy-{USz=2H^zs9!i(;x*(krjUCqEOz*$pP*Cc`PXM5gdLg^&Ld zf(~}yh~uC`Fc!mP$ah!3ar;NXkxTq>cx=M)zw_ptD0PqvZ=gIdl8Uj$b`ey~UPB?% zP(GEf`X~5U0Jow8Nx;;1X2ZoxGkh8Om+|;fj(iXiI`U96Vm_MhdZ>RM2{JUg(9lbG zA@73_@mr6Qh(cnAw>xwq)REzkZ(xHgK4HirtbBGvm|*dPCG`dPpF4Y~1wlzTYmOOT z6hiP^T^&XM!vi05b7fgj%H-6$oMDV7g|9IGG0&X(KmtW&0uW7F+g2CHws;Z@bw0;| zjv%K6*^-JN4wU-Lysf{2)W4CzHr$o&(E?ZNXt4SppidYZ$E@EragI~}Lk4aVa3P~X zqN?fl8RS1=&h%WXzFg&6@^1(q#yO+DOP0xz^&Es#ZN70jKtm!+z&_{sesY5P6^=ycph2?4z16M*?4Ig5C~!m zCvose!eWVkJ5{Yj#X{(C%m}nn$iX;yTIx;5BkVg4R!Zs^cZDed(jVh;jk$+dJ~E6< z9CpWMk$Q9tk+l{=&@zf`aV1m*BSY5_t`;2#6JxJ_P6RaG_;Ywb~8gDfkt2Nj4wB)4ar7EkEo@o#G3H1*^-2$p6?i6jdAm5zBh+V*NkGY?Dctb2vp*`73bF{5~VYA39-siVQ z1@!p935ymeL0te%k<@nLTikqZKvu@?8NC6_T()k2^px!zDM>qY142gGxd9QPjF=%T z=`aOU8D?NSgLNnci~?Uy#-a1fp+)Na;p_8N4nHGH8)js!_1BQpAuTu;3uR3i<%xQ~ zM66_JOdcXA%|8rV_m<_vG3uSgCh6z^y34lGtL^)I*e?_snAi~xl}qQIf2IsS_zUMR zPM9vpqM~#RNKH^m;+li3r#EP*6U@BgUvt3x_%Y`oqgx# z;5s#gp1|WifmHpAd|QlD$^hK37%j4RQ-%HU6FRKve;TGxhfI95F4BT&OV&gP#6ZtX z&u~3>$iy1vN)$UEi2Qjc4+05Z03nQhAeDs_c^xVfM*6bgcyJ8BDLDGypnR1&0se7y z6Qyhma7cyhA}k!#{sYHn<70rp@ws+RPsww-jni!Y6#U{HKlh=eg!QSSqc`zuYC$uk&XV1;@Vkw48h+YX~#AOOwAGw!rC!FcR93i zbIrfsUGvr7f7x1_ZWmFWI`(cHZW&NJc%Xc=}M(Vjeud=c8Kz)H9%A=y5y{;o_D!(k5f_HK0jOMp`&S-is- z_js5q)tAo#AB4ry^B2me&zwDXl88kPk5U8*vmk5SZ{y6JUac%Hgjrusk&CA(kNdHi zi9!7fpfJ$(W>tSokL_wL0LcQvuDkzXji8245x0Q1<<^s*%9U$9+A|1Rp#Uq=A$ z^H=dT)w%<^?r4^&Er__A=(W(o)-V~Bar5>e_8a7(g`BNC=2RdsOd&^H=BH3^YlqOz z-a@l16zBSB<{DgU^=4UPmMUJ!A5cw4>e`P7V+n$m&EA4{E5s3yzD&Id^ z?Ks+X2(Y2b@LLCGU{EcAj=U7eV0=?Z#4MblZx1vFJa`bpxsKhD{MdOHd{eBZKg4xC z4ED>fLg7gr+k|YCgnp9`Cq})5kG~JW96J5#=%?WNzd`3*M_GHUn)74M)imj~$Os1a zr$T4)VIv4Z+BN6i4Xn7RMiXG(D;%d8pDX$Fw+Jox!2P^6P5~(Wa{XIqCAPinDEmPN)-SgOH9UGupanWbF%{cp`iZjFxcP* zbOkFlce8)E)DnT0aGwxDXc=PXz+}egd$~dZrN`$gR{q7EGnlyxL}TG0?uQW|2*Hp~ zICL{7#)B_zDBcFrugI127GMU2XKeS1*z4BaBtQ2-D`hSVivyuAPh4y zk7BhCQ^4H%kB|x#ljt1alwz(G3Jaa~!v3z=gCC1Q5ZiYIH4*=nJ7N?Ot1k~ei&&XX zRRw!5@OOd~h~cHbcio0ri-}!bUQEK2f>CwT!%0ZmI-<)UQz&S1#oJ{e;Q?Qj#t<-am3c=kRyxJ z1R0c0y$vBBDj}Ti-2)LHDxoo`gm^&mjmT2c2UbtEva(-yBIQuO${=@fZ6Cz)>>i#@ z7zXki*cfaJvvu6M`ekles2fuH8(;$qDt{ab0DSiyw;;a51qz$lX&1g|Zw!GglG9OO zEx#L$=g(z41;g%1|G{pFa6g3E?62Gb3>@=LUArFi47bDJVi}My%8aB@vACT`0prxD z--HWTG}+lWUWsGm#3;CtO0dL3asy4RUX`5!Ao3a%RG)Om&HJR%UJP`MMsCuaG4zP? zEPBK*p}AwmZVfGgNu`i0M3YR~dC)bqZcIIfQb4DS!uoQZ+YElc^Wbsdq>Xv$YH8L(A0W6>w;}>=uNDG*?`TZo zsYX4K0n1qB(Tu1*yJ$CcFvkAQeson4<0_5C7&nJmBh`&e3kEGMMz)){+Vx%rx`&`7YmW}aV0Q~G57C=Y z61mYSnMZIR;MkJBc9}DzKPX|q_BOhk7%`9F8mq<}7sf0c%mU!k5)QX@*GgldfnLQe zMGz$nyD<9i5|QcOV~|L~tvixhdFd5*3K{(9+JrC*no(Va4nldeD|5y^d=wS%b_GnF z{w-EUge)3T{m&7b7&c6}Nc#DBS+?`!Ne6^Gr~lM7uZ))T1=ikgHiLLL;({FD_%H>c z5vD*|^>sGqCcy#5h)&6c`j0U(LY=Z_nzC3l|20JB8z8$Eb`4Gn?mgJ4XQ^y7&i&rQp** z##jew!~QA?2AS4_r{=xtf)8IMaDSK%o|7;a_eJa<3=eW6ACzD+-K_)Qxj?^SLtj^R zYzBAiK7XwBz%=oFr=FPkNwn3Kgio6Shx9)%0cJuEGWH)C{0V}IKH-)Oq4V{BV)~yU zDD8|d*`VGlex0m3&S66v)|b2rQ%nBbw)F|`C|5b~c=e6>*nfsAwhK*IskCuKgyoJL z7aS9@0X2_(CYmhDAe2dD5f39GXa9^G0^^*K7w8UXV(oM-P3OW$c5o^$0tzoilSJwf zO>{4TouRxSSA>uj+)8+uNd_9AaBrScO{C^Ou{(ogktvJ=A*bfj^wq z0~f{Z!!QQCxihBbV$mYZ8a$xaaUrB_dUk6Ggxl^4d%?!6j#R@(B%AhQhca`COXNr< z$7=mCU{A;iZKH=HIe!&%{o6@Y|MTMgvl?k)plR+!PG_TGG z?d=yK!t@mF)TpZgf#Cs^v{HExlp;R#v*b;Iji*K08k_y@uH*u61fwAA(`Rk zJcW<{3W6A5)(2yd5zq9oG?Zbu$|Z59;9;Z~jEv-rC8caG`$U!$p6$kL9bLV4GFm>2 z@d!RJgUT1|mh!#U!UaBCIfz%_b}|@{aP#0$#CToW#utEtUa1=d4~*li)%fF zuf>)gfldTEXz?b+k)TV~)qUXgaO6gGIL?%87qGbax60GOYOlsXyZz-A}DA6;r4fGhIj1Rm5gcFloO2xoitKsoNpU4$+dq9MNI-+xtzd;@)tI z*a^X5vt14oGiHGkMlNb4qR!t#D@4B$bU9KFeGsjX93trHwTvr5hjAx_D@12y{4p{C z366MqYEr8iD#o6NVn7MW(Uwo0{e?fNKd?I(rn*I7V zE1>4VI2WWRf?nCbJD|0Zt$yaMAXachul~4`-tgX>$NkHdu zIvqMJIm^)6d6_nW?TKf3OGIyCg8h0#q!Z{T(T1=x@Kd}3#Bn7x3Zo6aL6Ia5UQXhf z-Po>@l7_(r7nAVR6W9y8^#{f(2gvsq&}9rm?x_R&24`ruG7AH;z?E?fBzG5q1lQP< z#VCZ$Cj`W|c$@Pv=3b4?t&ig}GvkNdaqcbgl@fqvUE`c8yfRmZgS9lL* zHrP&oL8b!yt1zk0V6LH%VkR8iLqEba2e2K8vS{qv1R|jUS>w4nV&k&BAX!6FFn&(q zBfu7~VMjN!8z>%n2iysitkS>#>szJBh(&w~iBpa-{S7WtN)KbwN(1y3O{Sec`a&`+ zbB|Nna7Sh^#K6V8ncx6pobvB-%0)QH(u|X+g}7Z3W`VAz5w+bN(L0>SRq$8jjWoQ9 z33Sp><4Kj;Na3a)o*d@U#g~k-2YHOSy)ZD)m5`uLqk)Q?aU(0|O&f7rHXI$N zVUDyAZeT~?1}2shKBB%O;yfmr4=4~>x#-lPts;Im1`HI%O+46uxbOqcRJ=6As5f9d zpvnUx8TAiQ?XjNv?zkUEKtxO{u{R}L(%$_`{Iy1Ki;BMj>pkkDT80++bKfc{`%|2es8MoV7|t4gwVk?Bgui=KAD#wa{%2mK)xcPSTBIu} zY_(^j3wVe|BfFCu|KbNM-uQu=)rdr#1tiEtED`7itMGxv1(jlI1Nad}@lzXh-E4?2 z$2B-QQfGD8J$3%vy}8gEeI6%Olh^*Byclx zG1xB5MPMNkWGN$%0XMXrq)@~}yhcOdx?>>IcOhL)sPczw;&qqX{5;$;J$N!^lMH%$ zn6(V_w2g~gn~N(;{LLNQ=HdCc955fxrsgREeE=QEq0I};11MtPiooZs#07#s z{k8=;7pd@0g{P6ZRT@7A_eP#~cw7fP)?d3}&EYQmtG_AtMB+!{;&&UFM%KIw25^I5 z7Ji}hSUShM1aa9b?%P0}xZ|UpMf<0ys<^QaKcixPi%BZ#5-JiE9o5uilP?kK?nfYV51)D5HGU8*GZZ`EzZ}M~ zCgL1ZL}p%@*{yS4L`j@_7Az>bXDFdgB29maftv&e5DN#&CZn-s&2qP}3l{FmXzdfR zq+`zP$vPFLIdc5OOTF>PQG*k5OgZz)v~jk>wvj&$i!A9Q`1mdYxEb!=uy0tK))r+s zo8MdZOYoY!>cpN#4)%L<74sqi0K0Ey zv9)_!=aWnc{}NC4PE;bEQDQF!KfrB$r)4a}o%zBn{sD4o(+NF+;hC50gxG~&kDG^G zc+d9c6L-j-Gl{>%vUi~>oP~fkI0w)pWa#&hE|;0k^XU3DKIP-vAH)*@e!vazcLAIQ z8tZajnEnv!`eg<)2qyYX7iG~!sJIW!lz2hvJTx7+yal_1&Xk_lz%SI)bt%Umu#pII z@U77Xx~$ALmB~=|BH=QJO0Bvzkk3)+4DJ!?0v>jQXzy{IBa7j9fCXnvkguIdicE&S@4{&{(cyS?FCYKYN4X2E~P@ z(bO{hHV8OaFTHF|2jVBmK)&&lWF%ka5a~X~1{n-7xR=3~7#w7PxwFi#zHnQ}_0HxJ z@hLv?jxtS!siu8LljSz&OngcGtBk9FVR!S*Sy&Q3Ig)9F3`!w#{=ztG{}CT|FrW%tbMuHxiXLT5Y=<-k z>Rk-J!+>T8QH&cM7L~)IdeTdH5f(%!H;#`Kfq6q&B=(8`OkvjmB86s6!9}==Fiq?o zrir;VL9(+`JKHkM9|z*cujf6@nfAYnfMA;ZgBPH-3mPur3vL&e8-$Q|82`q`k`+Lw z8)Y^%%>T56nL<8a9K3t*4(QA7%%=t)8yp!N&KKdj@rnGs`6Ij{46g4^;i;^X&laD^ z_vMTEqGcCO6doE*@t6|cW3%8p3iE}+9r+Y;JeKdzkKp@`d^(@akL8DW{~hx)XD7_( a3WsPL;%39YQz+8^2hUEvzi?0Cq5lsAYI9Bi literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/site.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/site.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e735f0f6fa9ee7f316095f5b80f44846b637cf2a GIT binary patch literal 21829 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/sre_constants.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfc074ee11c1693782fe63a43e2db065b4b75a05 GIT binary patch literal 6339 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 C(ROJ7 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05f55119b5de0add0db8923e9bd5c2e2b19b478d GIT binary patch literal 21405 zcmcJ1eQaFUmEU`BzK6phMNt$*eT}Hkk@aQyTaj&15+%!#DXmCZHsg3Q;(e5cq-Mzb z9&Kv!#_^i=TFxd}ZrWzELF!7zB1jiTPy|7C8?@UX4chHC$Zm^t5xlmkn@zX%_5;BJ zEl{H9_V+t?zBrPcvgvL-EMD`(E0uvBEyQPIhW8&$DodoqT19Pc>Z3A__{C-F|=ox(fiM%}dA zb=^TcgLt=_b$i@icb(gJo%Plu-mlWj_Ov6hu4XLLjCD6-*=DS#8S8Dv)-k5~zM7oe z;10MO0dc?`lyDQm9=FdOns%iLk;8oh}x-k;r*z3NbOO3 z-?S$mQ~OjNDUYlD>H)l;P!Fqv>JV~{sl)0BQa+|0R7deXt`3Y_`A4eT&y{^wmy2^b zZ*hLUqW#>BidvjQ|0+7?Y4<}iL*5SU{ngB&mp<|7efj+lJpJ;npc=*d(_#9^gGV2F z_>o5+d;E#XWFtN~(1<<$MDgmBa;Ha5o;p2xX7XY4b?tg-W_IpIxiY_?J%90)SC?*9 zO^LJ5oO|};=bsz9aPikJjZa*D{>lq4PFCZ&RJyw>vuY<+?c}PR3GMW%-Mwn3R_(4; z`=xxc>bz9Ma~01to-!Vd$H(&uo|p1zgd=!Z;v^o0=QJJ<&p4h}@m#?(nNNmxDYVar z_Knc?LVGE+i=pj@_Tm)j(D=i2FcTw#h-*#S%EE-OK~N`5Jn!nO70(^ZN5W*GP%hqZ z3xzOUC>XjTo+%U-7K?Kx=kHs35I`hYEgrt?x!OBiEKgl877w4UOfBAU%f5H`lIyue zJ$3zXY1}VP&6dj73R4y39xi$H&%;-d?3UHxSKRU|hv!OH56|E9uUE8I`lf|R8&g>oR|&9ITqRWs zxe1k4U3e!|Ms?$zQZZ1ZCrn%{`sA@Gl8t|Sv-wkayln`S9asgcWFZ78ukp)K{E8@x zL><$tl8=V5>AB)HFHBw2mBo2gn)1UgiN0D={&g?xovT!4ue#SuWhKcT7&q#rH^ffhm z?Ra&z8aGJ&8nT4^mQ&3(S~FQ=Q=|+3qIhC>ghp2pK~q-EVS~3pn>)5GDSl)&s(1NO z1vK8U15j@^rC&y=*zGvK?l`qb04gGN0;Qb54xAt|9T~t7qCDZn0{gfXIOs%VtlHyO zD!CiQ^39w}&uMqs)j7YCD}rk7I3d_+@V=z|P)BS3;oH5rq*S6S3kZYM?hr`Y8dJZaNKWlwY;FpK%GZfOqHJt}aH zr}YLlOs>-#8RQUz$$5<~YX7Dgpgc1UFc2&cGuD*xCPpEohY&oA$KxuJbds@5B%Q%K zA~{n?Z2pm1PvG%Bg`g>vH!4R(Ab=xkP{mXnG3Z|^3DFxJQtMP7-f6X7_2b=TG?U4UEMl9&^!Vb{IxWW5a7mL{hk*#0wSc(;PD$#%YZOlq zC=}sFfE%`rgo*m#g;7=Xi(yP=RAbGWHEG>9(S z8=>E-=;s|s*r*>v*L**+j74i{e-JxueR5dp#HCIQW!vfn@nzInIDf@j7(m@P>VCIg z_n4muVk))?au+c614g124-)$QM%yaB5qW4ceme_8}nh0EIXG*≦qI5$2q9;QoPsSNF@3~})w8q0T? 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/token.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/token.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b223973209cecc48a4ffca9f5100974c012b01b2 GIT binary patch literal 3647 zcmcguOLN=E5gvfx3w+6X%a+%)WZ9x@iGIIUeo!JPaZQ0TNm_FmA4XKkdo^}=v*`XvcSOocd#up(C9&FQ~ zfr70D8Cb$LV=Te)w)|N#3r6OEp?tQ;65s7#EH$@{M!ec=SazjhTk+|)W^*S#VN>_q z)9pQShBbmTMKnr=~CGZjW z2?7K`0@?saA%ZYLgaEe!JBktX5u73DCm0|YBp4zXCKw?YB^V<(OK^^0oZvjcHv|_5 z;sh57CI}`8E)h%-Tqd|eFinskm?5}IaE)M=V2&V3aGl@=!A*i&1h)z95ZooWM{u9u z0l`B8%s;DAn&_bj{H~oy@CrU z38|d$2(@O_+y$%}!c%M5LdDfIZR=yr-ojyd?z&Li74&|n)OU@)Gjkd3{J4=^vkcQp zRvOiA(PV2EwvC&5GNj}N^4vCZSDGjt)-0*2%ILv0- zjDpiKzMx(z=QEk2R-$0{T*teRMOl+(7V)!)VA8K>_4c%y&rmoanK^8Ju924G1%AIx zqkQ70rl(g@g=bpf7xYr}zxzrrlI}zMmwo~_{(oT@Sm#)swY#my)!V0GM9%nXi^oboAbD~{(tYJ1mN!?#L({;s7|ydIjR$zXHKjgdjG`<_Gb1uedZS@1Z+EqZ6D1?eP^6A zC>dH|zNDed7mH8~cA6;jT-x+WQouMD(dG;xa zyF`Kh1KHgt$9a*>fBtG-27WOw!|qP;gRe8F8e4^95}&Rn&wRJ*jR9@21(@ZJAVeP+ils4G_w< zfo4fLW?Xn{4KVhE`hpIPp500d{XoHY%~~TdVis_=Nd?&T)#7TckwJSpUKe->9Xw`) z{I(@LuF^WL9ER31o0~k+OL5sWHqnyLO}xbeEz|f=#%;K?O8I0JQAI8+)2#lJSu*M)jiia@oJDRNIqE-_GIz=8K-u-CT-FoI z!e1^!vsx|_QK{F&C>%8LbJ zQY))yQ^{$?qVO*jv=m?)E*P?_PyJYOtezzlf;zUp2)RSJvsXN_{P_M(yVc%CwcUVqg z#xRF&{(Oa0p^#q}0WFuyt`@UJA?H_xs$plLlz*n_!cS{O$(8jSis_5_G%h_4=w)}j z=w4-nf3x0vQ>k0{%i6|{WzwZe_>4W9{s5nQ>9gFsl1bMalkOrXn~yGrxX-WKzDi(0mHrEB%!^O} literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/tokenize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4447970abb1e35f1f0aab36f97dced672d4398f GIT binary patch literal 17778 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 gtA^fL)F^6XD5g&HDn_MZ9;;a9T2d_0MLtcStR{ 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 PZW$-E2`WtHw&DC2Y+)v( literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc b/backend/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3a5327bc9092a295073a6422c05d4837cc79192 GIT binary patch literal 19158 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 NJs_R^cJ}9d_FriuSa1LU literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/distutils/distutils.cfg b/backend/venv/lib/python3.7/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/backend/venv/lib/python3.7/distutils/distutils.cfg @@ -0,0 +1,6 @@ +# This is a config file local to this virtualenv installation +# You may include options that will be used by all distutils commands, +# and by easy_install. For instance: +# +# [easy_install] +# find_links = http://mylocalsite diff --git a/backend/venv/lib/python3.7/encodings b/backend/venv/lib/python3.7/encodings new file mode 120000 index 0000000..8ab7b15 --- /dev/null +++ b/backend/venv/lib/python3.7/encodings @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings \ No newline at end of file diff --git a/backend/venv/lib/python3.7/enum.py b/backend/venv/lib/python3.7/enum.py new file mode 120000 index 0000000..ec26698 --- /dev/null +++ b/backend/venv/lib/python3.7/enum.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/enum.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/fnmatch.py b/backend/venv/lib/python3.7/fnmatch.py new file mode 120000 index 0000000..7d0781e --- /dev/null +++ b/backend/venv/lib/python3.7/fnmatch.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/fnmatch.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/functools.py b/backend/venv/lib/python3.7/functools.py new file mode 120000 index 0000000..2b4de2e --- /dev/null +++ b/backend/venv/lib/python3.7/functools.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/functools.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/genericpath.py b/backend/venv/lib/python3.7/genericpath.py new file mode 120000 index 0000000..2ac8a86 --- /dev/null +++ b/backend/venv/lib/python3.7/genericpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/genericpath.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/hashlib.py b/backend/venv/lib/python3.7/hashlib.py new file mode 120000 index 0000000..0cec56f --- /dev/null +++ b/backend/venv/lib/python3.7/hashlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hashlib.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/heapq.py b/backend/venv/lib/python3.7/heapq.py new file mode 120000 index 0000000..667ad79 --- /dev/null +++ b/backend/venv/lib/python3.7/heapq.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/heapq.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/hmac.py b/backend/venv/lib/python3.7/hmac.py new file mode 120000 index 0000000..1f49c56 --- /dev/null +++ b/backend/venv/lib/python3.7/hmac.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hmac.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/imp.py b/backend/venv/lib/python3.7/imp.py new file mode 120000 index 0000000..b468739 --- /dev/null +++ b/backend/venv/lib/python3.7/imp.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/imp.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/importlib b/backend/venv/lib/python3.7/importlib new file mode 120000 index 0000000..0c6a88f --- /dev/null +++ b/backend/venv/lib/python3.7/importlib @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib \ No newline at end of file diff --git a/backend/venv/lib/python3.7/io.py b/backend/venv/lib/python3.7/io.py new file mode 120000 index 0000000..43f630b --- /dev/null +++ b/backend/venv/lib/python3.7/io.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/io.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/keyword.py b/backend/venv/lib/python3.7/keyword.py new file mode 120000 index 0000000..5adf06b --- /dev/null +++ b/backend/venv/lib/python3.7/keyword.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/keyword.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/lib-dynload b/backend/venv/lib/python3.7/lib-dynload new file mode 120000 index 0000000..2f180d9 --- /dev/null +++ b/backend/venv/lib/python3.7/lib-dynload @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload \ No newline at end of file diff --git a/backend/venv/lib/python3.7/linecache.py b/backend/venv/lib/python3.7/linecache.py new file mode 120000 index 0000000..538b638 --- /dev/null +++ b/backend/venv/lib/python3.7/linecache.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/linecache.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/locale.py b/backend/venv/lib/python3.7/locale.py new file mode 120000 index 0000000..2fed2c1 --- /dev/null +++ b/backend/venv/lib/python3.7/locale.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/locale.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/no-global-site-packages.txt b/backend/venv/lib/python3.7/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/lib/python3.7/ntpath.py b/backend/venv/lib/python3.7/ntpath.py new file mode 120000 index 0000000..4e91922 --- /dev/null +++ b/backend/venv/lib/python3.7/ntpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ntpath.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/operator.py b/backend/venv/lib/python3.7/operator.py new file mode 120000 index 0000000..bd7fe66 --- /dev/null +++ b/backend/venv/lib/python3.7/operator.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/operator.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/orig-prefix.txt b/backend/venv/lib/python3.7/orig-prefix.txt new file mode 100644 index 0000000..84e29de --- /dev/null +++ b/backend/venv/lib/python3.7/orig-prefix.txt @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7 \ No newline at end of file diff --git a/backend/venv/lib/python3.7/os.py b/backend/venv/lib/python3.7/os.py new file mode 120000 index 0000000..f6a3ca4 --- /dev/null +++ b/backend/venv/lib/python3.7/os.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/posixpath.py b/backend/venv/lib/python3.7/posixpath.py new file mode 120000 index 0000000..58c6b83 --- /dev/null +++ b/backend/venv/lib/python3.7/posixpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/random.py b/backend/venv/lib/python3.7/random.py new file mode 120000 index 0000000..c21ab76 --- /dev/null +++ b/backend/venv/lib/python3.7/random.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/random.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/re.py b/backend/venv/lib/python3.7/re.py new file mode 120000 index 0000000..7d2707d --- /dev/null +++ b/backend/venv/lib/python3.7/re.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/re.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/readline.so b/backend/venv/lib/python3.7/readline.so new file mode 120000 index 0000000..726f8d1 --- /dev/null +++ b/backend/venv/lib/python3.7/readline.so @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so \ No newline at end of file diff --git a/backend/venv/lib/python3.7/reprlib.py b/backend/venv/lib/python3.7/reprlib.py new file mode 120000 index 0000000..f98535a --- /dev/null +++ b/backend/venv/lib/python3.7/reprlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/reprlib.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/rlcompleter.py b/backend/venv/lib/python3.7/rlcompleter.py new file mode 120000 index 0000000..c4edf48 --- /dev/null +++ b/backend/venv/lib/python3.7/rlcompleter.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/rlcompleter.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/shutil.py b/backend/venv/lib/python3.7/shutil.py new file mode 120000 index 0000000..11c4205 --- /dev/null +++ b/backend/venv/lib/python3.7/shutil.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/shutil.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE new file mode 100644 index 0000000..8f9252f --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/LICENSE @@ -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/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA new file mode 100644 index 0000000..0a7e5b6 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/METADATA @@ -0,0 +1,124 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 1.0.3 +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 +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: https://dev.azure.com/pallets/pallets/_build?definitionId=2 +* Test coverage: https://codecov.io/gh/pallets/flask +* Official chat: https://discord.gg/t6rrQZH + +.. _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/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD new file mode 100644 index 0000000..10710bd --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/RECORD @@ -0,0 +1,48 @@ +../../../bin/flask,sha256=HA9fhakrmO5Tf2BM6ActCyFGu0V6zPs1HSowswUDK-s,277 +Flask-1.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-1.0.3.dist-info/LICENSE,sha256=ziEXA3AIuaiUn1qe4cd1XxCESWTYrk4TjN7Qb06J3l8,1575 +Flask-1.0.3.dist-info/METADATA,sha256=2fD2dkRksjxOHmBgcoz_QfqN5ghyP-njBUMItWo2Exo,4119 +Flask-1.0.3.dist-info/RECORD,, +Flask-1.0.3.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Flask-1.0.3.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 +Flask-1.0.3.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=SEPu7STunDgeHTDwji6JeSoKNcSBtULkKzY4spj3z6E,1673 +flask/__main__.py,sha256=pgIXrHhxM5MAMvgzAqWpw_t6AXZ1zG38us4JRgJKtxk,291 +flask/__pycache__/__init__.cpython-37.pyc,, +flask/__pycache__/__main__.cpython-37.pyc,, +flask/__pycache__/_compat.cpython-37.pyc,, +flask/__pycache__/app.cpython-37.pyc,, +flask/__pycache__/blueprints.cpython-37.pyc,, +flask/__pycache__/cli.cpython-37.pyc,, +flask/__pycache__/config.cpython-37.pyc,, +flask/__pycache__/ctx.cpython-37.pyc,, +flask/__pycache__/debughelpers.cpython-37.pyc,, +flask/__pycache__/globals.cpython-37.pyc,, +flask/__pycache__/helpers.cpython-37.pyc,, +flask/__pycache__/logging.cpython-37.pyc,, +flask/__pycache__/sessions.cpython-37.pyc,, +flask/__pycache__/signals.cpython-37.pyc,, +flask/__pycache__/templating.cpython-37.pyc,, +flask/__pycache__/testing.cpython-37.pyc,, +flask/__pycache__/views.cpython-37.pyc,, +flask/__pycache__/wrappers.cpython-37.pyc,, +flask/_compat.py,sha256=x1LK5kpv_6roOeybIFBmme15cGnXWpLtQAGsNfNwRvQ,2980 +flask/app.py,sha256=NC2JgfXOHpqRFxSdfWsSqWUhCfMSB84fHspOaTvUL88,94803 +flask/blueprints.py,sha256=SnIW5hCOhKMa8_N42sw-3LUTg_hPnvxqBJOYNBHkT5c,18296 +flask/cli.py,sha256=XtgWfUHyOABgdGkc34YyP-1b765xxeHLLgl1zPSqUvI,29913 +flask/config.py,sha256=Etv43UCp6I1rg5fDb7DPjp5sNUlQOqP6ZqyhTrTrqgc,10145 +flask/ctx.py,sha256=tLrqKokGoD6ZDqjak9r2ffeEprN06h-CoaelVihKBJ4,16224 +flask/debughelpers.py,sha256=1ceC-UyqZTd4KsJkf0OObHPsVt5R3T6vnmYhiWBjV-w,6479 +flask/globals.py,sha256=pGg72QW_-4xUfsI33I5L_y76c21AeqfSqXDcbd8wvXU,1649 +flask/helpers.py,sha256=M_C0zBY2WtnHG0Y7n0-1lNz0imzj6HmffGEGjMEcXLs,40424 +flask/json/__init__.py,sha256=0x3zrRd8mjYHVxbb7ZXr7OZ2Q1aSvVoturl4Tsp_F0Y,11859 +flask/json/__pycache__/__init__.cpython-37.pyc,, +flask/json/__pycache__/tag.cpython-37.pyc,, +flask/json/tag.py,sha256=9ehzrmt5k7hxf7ZEK0NOs3swvQyU9fWNe-pnYe69N60,8223 +flask/logging.py,sha256=qV9h0vt7NIRkKM9OHDWndzO61E5CeBMlqPJyTt-W2Wc,2231 +flask/sessions.py,sha256=Zgfk3cevqWM3yFlYT-nvhBFtgsCFnGrhneI0u5rT5SM,14471 +flask/signals.py,sha256=BGQbVyCYXnzKK2DVCzppKFyWN1qmrtW1QMAYUs-1Nr8,2211 +flask/templating.py,sha256=FDfWMbpgpC3qObW8GGXRAVrkHFF8K4CHOJymB1wvULI,4914 +flask/testing.py,sha256=I6h58A42ZTKizPjwmVtl-37d8R4A8Mkz5rflY1RsCYg,9329 +flask/views.py,sha256=Wy-_WkUVtCfE2zCXYeJehNgHuEtviE4v3HYfJ--MpbY,5733 +flask/wrappers.py,sha256=1Z9hF5-hXQajn_58XITQFRY8efv3Vy3uZ0avBfZu6XI,7511 diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt new file mode 100644 index 0000000..1eb0252 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask = flask.cli:main + diff --git a/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask-1.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..aeab36c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst @@ -0,0 +1,134 @@ +Flask-CORS +========== + +|Build Status| |Latest Version| |Supported Python versions| +|License| + +A Flask extension for handling Cross Origin Resource Sharing (CORS), +making cross-origin AJAX possible. + +This package has a simple philosophy, when you want to enable CORS, you +wish to enable it for all use cases on a domain. This means no mucking +around with different allowed headers, methods, etc. By default, +submission of cookies across domains is disabled due to the security +implications, please see the documentation for how to enable +credential'ed requests, and please make sure you add some sort of +`CSRF `__ +protection before doing so! + +Installation +------------ + +Install the extension with using pip, or easy\_install. + +.. code:: bash + + $ pip install -U flask-cors + +Usage +----- + +This package exposes a Flask extension which by default enables CORS support on all routes, for all origins and methods. It allows parameterization of all CORS headers on a per-resource level. The package also contains a decorator, for those who prefer this approach. + +Simple Usage +~~~~~~~~~~~~ + +In the simplest case, initialize the Flask-Cors extension with default +arguments in order to allow CORS for all domains on all routes. See the +full list of options in the `documentation `__. + +.. code:: python + + + from flask import Flask + from flask_cors import CORS, cross_origin + + app = Flask(__name__) + CORS(app) + + @app.route("/") + def helloWorld(): + return "Hello, cross-origin-world!" + +Resource specific CORS +^^^^^^^^^^^^^^^^^^^^^^ + +Alternatively, you can specify CORS options on a resource and origin +level of granularity by passing a dictionary as the `resources` option, +mapping paths to a set of options. See the +full list of options in the `documentation `__. + +.. code:: python + + app = Flask(__name__) + cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) + + @app.route("/api/v1/users") + def list_users(): + return "user example" + +Route specific CORS via decorator +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This extension also exposes a simple decorator to decorate flask routes +with. Simply add ``@cross_origin()`` below a call to Flask's +``@app.route(..)`` to allow CORS on a given route. See the +full list of options in the `decorator documentation `__. + +.. code:: python + + @app.route("/") + @cross_origin() + def helloWorld(): + return "Hello, cross-origin-world!" + +Documentation +------------- + +For a full list of options, please see the full +`documentation `__ + +Troubleshooting +--------------- + +If things aren't working as you expect, enable logging to help understand +what is going on under the hood, and why. + +.. code:: python + + logging.getLogger('flask_cors').level = logging.DEBUG + + +Tests +----- + +A simple set of tests is included in ``test/``. To run, install nose, +and simply invoke ``nosetests`` or ``python setup.py test`` to exercise +the tests. + +Contributing +------------ + +Questions, comments or improvements? Please create an issue on +`Github `__, tweet at +`@corydolphin `__ or send me an email. +I do my best to include every contribution proposed in any way that I +can. + +Credits +------- + +This Flask extension is based upon the `Decorator for the HTTP Access +Control `__ written by Armin +Ronacher. + +.. |Build Status| image:: https://api.travis-ci.org/corydolphin/flask-cors.svg?branch=master + :target: https://travis-ci.org/corydolphin/flask-cors +.. |Latest Version| image:: https://img.shields.io/pypi/v/Flask-Cors.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ +.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/Flask-Cors.svg + :target: https://img.shields.io/pypi/pyversions/Flask-Cors.svg +.. |License| image:: http://img.shields.io/:license-mit-blue.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ + + diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA new file mode 100644 index 0000000..95e42d8 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/METADATA @@ -0,0 +1,158 @@ +Metadata-Version: 2.0 +Name: Flask-Cors +Version: 3.0.3 +Summary: A Flask extension adding a decorator for CORS support +Home-page: https://github.com/corydolphin/flask-cors +Author: Cory Dolphin +Author-email: corydolphin@gmail.com +License: MIT +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +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 (>=0.9) +Requires-Dist: Six + +Flask-CORS +========== + +|Build Status| |Latest Version| |Supported Python versions| +|License| + +A Flask extension for handling Cross Origin Resource Sharing (CORS), +making cross-origin AJAX possible. + +This package has a simple philosophy, when you want to enable CORS, you +wish to enable it for all use cases on a domain. This means no mucking +around with different allowed headers, methods, etc. By default, +submission of cookies across domains is disabled due to the security +implications, please see the documentation for how to enable +credential'ed requests, and please make sure you add some sort of +`CSRF `__ +protection before doing so! + +Installation +------------ + +Install the extension with using pip, or easy\_install. + +.. code:: bash + + $ pip install -U flask-cors + +Usage +----- + +This package exposes a Flask extension which by default enables CORS support on all routes, for all origins and methods. It allows parameterization of all CORS headers on a per-resource level. The package also contains a decorator, for those who prefer this approach. + +Simple Usage +~~~~~~~~~~~~ + +In the simplest case, initialize the Flask-Cors extension with default +arguments in order to allow CORS for all domains on all routes. See the +full list of options in the `documentation `__. + +.. code:: python + + + from flask import Flask + from flask_cors import CORS, cross_origin + + app = Flask(__name__) + CORS(app) + + @app.route("/") + def helloWorld(): + return "Hello, cross-origin-world!" + +Resource specific CORS +^^^^^^^^^^^^^^^^^^^^^^ + +Alternatively, you can specify CORS options on a resource and origin +level of granularity by passing a dictionary as the `resources` option, +mapping paths to a set of options. See the +full list of options in the `documentation `__. + +.. code:: python + + app = Flask(__name__) + cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) + + @app.route("/api/v1/users") + def list_users(): + return "user example" + +Route specific CORS via decorator +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This extension also exposes a simple decorator to decorate flask routes +with. Simply add ``@cross_origin()`` below a call to Flask's +``@app.route(..)`` to allow CORS on a given route. See the +full list of options in the `decorator documentation `__. + +.. code:: python + + @app.route("/") + @cross_origin() + def helloWorld(): + return "Hello, cross-origin-world!" + +Documentation +------------- + +For a full list of options, please see the full +`documentation `__ + +Troubleshooting +--------------- + +If things aren't working as you expect, enable logging to help understand +what is going on under the hood, and why. + +.. code:: python + + logging.getLogger('flask_cors').level = logging.DEBUG + + +Tests +----- + +A simple set of tests is included in ``test/``. To run, install nose, +and simply invoke ``nosetests`` or ``python setup.py test`` to exercise +the tests. + +Contributing +------------ + +Questions, comments or improvements? Please create an issue on +`Github `__, tweet at +`@corydolphin `__ or send me an email. +I do my best to include every contribution proposed in any way that I +can. + +Credits +------- + +This Flask extension is based upon the `Decorator for the HTTP Access +Control `__ written by Armin +Ronacher. + +.. |Build Status| image:: https://api.travis-ci.org/corydolphin/flask-cors.svg?branch=master + :target: https://travis-ci.org/corydolphin/flask-cors +.. |Latest Version| image:: https://img.shields.io/pypi/v/Flask-Cors.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ +.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/Flask-Cors.svg + :target: https://img.shields.io/pypi/pyversions/Flask-Cors.svg +.. |License| image:: http://img.shields.io/:license-mit-blue.svg + :target: https://pypi.python.org/pypi/Flask-Cors/ + + diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD new file mode 100644 index 0000000..6701677 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/RECORD @@ -0,0 +1,17 @@ +Flask_Cors-3.0.3.dist-info/DESCRIPTION.rst,sha256=OZ8TtlMi3rOa7YMnqQX8p1XlTU31TyH0-ECIvDimpwE,4218 +Flask_Cors-3.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Cors-3.0.3.dist-info/METADATA,sha256=qmkvVl7SQ2ieuWB1_TREz6Jd48QNyN_ou9DHLxMNXcw,5172 +Flask_Cors-3.0.3.dist-info/RECORD,, +Flask_Cors-3.0.3.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +Flask_Cors-3.0.3.dist-info/metadata.json,sha256=V-JDQzpdjO6ZSSvQOCKyW5woqOE44bWgDiMDolfbvVM,1139 +Flask_Cors-3.0.3.dist-info/top_level.txt,sha256=aWye_0QNZPp_QtPF4ZluLHqnyVLT9CPJsfiGhwqkWuo,11 +flask_cors/__init__.py,sha256=ymYAYrah_35eGzD51UdEHdBRSkLTteY4O3412xdOWMA,924 +flask_cors/__pycache__/__init__.cpython-37.pyc,, +flask_cors/__pycache__/core.cpython-37.pyc,, +flask_cors/__pycache__/decorator.cpython-37.pyc,, +flask_cors/__pycache__/extension.cpython-37.pyc,, +flask_cors/__pycache__/version.cpython-37.pyc,, +flask_cors/core.py,sha256=trJCpbOOxkJyOcIda_0nI_lD393B4l0L4tiHgilElrM,13771 +flask_cors/decorator.py,sha256=iiwjUi0lVeCm4OJJHY5Cvuzj2nENbUns3Iq6zqKXuss,4937 +flask_cors/extension.py,sha256=KnI-ogRBB7PKhz2yK2m0EzRS9CjJMxTfZCEBhaeixl8,7405 +flask_cors/version.py,sha256=f3vNGrLTgOxbJH5qxemKyIWl-KEbqvz66qZKwIM1iw8,22 diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/WHEEL new file mode 100644 index 0000000..9dff69d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.24.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json new file mode 100644 index 0000000..2055452 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/metadata.json @@ -0,0 +1 @@ +{"license": "MIT", "name": "Flask-Cors", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "test_requires": [{"requires": ["nose"]}], "summary": "A Flask extension adding a decorator for CORS support", "platform": "any", "run_requires": [{"requires": ["Flask (>=0.9)", "Six"]}], "version": "3.0.3", "extensions": {"python.details": {"project_urls": {"Home": "https://github.com/corydolphin/flask-cors"}, "document_names": {"description": "DESCRIPTION.rst"}, "contacts": [{"role": "author", "email": "corydolphin@gmail.com", "name": "Cory Dolphin"}]}}, "classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extras": []} \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt new file mode 100644 index 0000000..27af988 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_Cors-3.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_cors diff --git a/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/LICENSE b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/LICENSE new file mode 100644 index 0000000..344b3c1 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2011-2017, Dan Crosta +All 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. + +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 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, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/METADATA new file mode 100644 index 0000000..60703fa --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/METADATA @@ -0,0 +1,43 @@ +Metadata-Version: 2.1 +Name: Flask-PyMongo +Version: 2.3.0 +Summary: PyMongo support for Flask applications +Home-page: http://flask-pymongo.readthedocs.org/ +Author: Dan Crosta +Author-email: dcrosta@late.am +License: BSD +Download-URL: https://github.com/dcrosta/flask-pymongo/tags +Platform: any +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 :: 2.7 +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 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Flask (>=0.11) +Requires-Dist: PyMongo (>=3.3) + + +Flask-PyMongo +------------- + +MongoDB support for Flask applications. + +Flask-PyMongo is pip-installable: + + $ pip install Flask-PyMongo + +Documentation for Flask-PyMongo is available on `ReadTheDocs +`_. + +Source code is hosted on `GitHub `_. +Contributions are welcome! + + diff --git a/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/RECORD new file mode 100644 index 0000000..5defbc4 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/RECORD @@ -0,0 +1,25 @@ +Flask_PyMongo-2.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_PyMongo-2.3.0.dist-info/LICENSE,sha256=Ap8d3yrzplSqXFfool6NTo87qPxXRHk_ikV97lurKvY,1298 +Flask_PyMongo-2.3.0.dist-info/METADATA,sha256=YAaRh_44jnKkfE9PdipsdhwJeAFMSYdvHBcC0_Uz0Ok,1356 +Flask_PyMongo-2.3.0.dist-info/RECORD,, +Flask_PyMongo-2.3.0.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Flask_PyMongo-2.3.0.dist-info/pbr.json,sha256=Uog-jmFMzzyMUmvHpecWUp8hrfTHUIL8FHdBBkk0P6k,47 +Flask_PyMongo-2.3.0.dist-info/top_level.txt,sha256=D0YaRrox4mkWzPhTMnqwIP_A_L1SRd9krRPQCU3dDQU,14 +flask_pymongo/__init__.py,sha256=iiavXfDPhz37a1rM1XsyFn0XBdG4ykgdTsYUKLl9lCY,8968 +flask_pymongo/__pycache__/__init__.cpython-37.pyc,, +flask_pymongo/__pycache__/_version.cpython-37.pyc,, +flask_pymongo/__pycache__/wrappers.cpython-37.pyc,, +flask_pymongo/_version.py,sha256=wB_e6iDNGYA2lGSf9Do9xoBiacRXeGfjda4PNVbM_jk,122 +flask_pymongo/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask_pymongo/tests/__pycache__/__init__.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_config.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_gridfs.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_url_converter.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/test_wrappers.cpython-37.pyc,, +flask_pymongo/tests/__pycache__/util.cpython-37.pyc,, +flask_pymongo/tests/test_config.py,sha256=P6Fw10liyMYUz78e9U4I1ir0Wb-ltxYtdTWYr8WPrSM,3363 +flask_pymongo/tests/test_gridfs.py,sha256=sc70aukyMW9erW0pZZaZoEBKi3dfp1w-AW8OnCR5EDw,3039 +flask_pymongo/tests/test_url_converter.py,sha256=u1Avnps0Cgr6UG0akZnD8mPScJEVfJSvjLVziIouUfY,605 +flask_pymongo/tests/test_wrappers.py,sha256=c-NCD3xuuM5hWyCBlbMIEW9bkOVTTITHegf7AO-UOig,1212 +flask_pymongo/tests/util.py,sha256=XB7xxpDDPRkxYH4gA6v-FtAOo7IGnE8NubAYoDtlZWA,1087 +flask_pymongo/wrappers.py,sha256=A24URUPDchBNiY7qfRO9PKc9UGi6eMzB-FqbHVeChNY,4269 diff --git a/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/pbr.json b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/pbr.json new file mode 100644 index 0000000..e83a7d2 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/pbr.json @@ -0,0 +1 @@ +{"is_release": false, "git_version": "775c8c3"} \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/top_level.txt new file mode 100644 index 0000000..1748c74 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Flask_PyMongo-2.3.0.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_pymongo diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE new file mode 100644 index 0000000..10145a2 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/LICENSE @@ -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/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA new file mode 100644 index 0000000..fb4a867 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/METADATA @@ -0,0 +1,67 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 2.10.1 +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 +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/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD new file mode 100644 index 0000000..914594a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/RECORD @@ -0,0 +1,61 @@ +Jinja2-2.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-2.10.1.dist-info/LICENSE,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554 +Jinja2-2.10.1.dist-info/METADATA,sha256=rx0eN8lX8iq8-YVppmCzV1Qx4y3Pj9IWi08mXUCrewI,2227 +Jinja2-2.10.1.dist-info/RECORD,, +Jinja2-2.10.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Jinja2-2.10.1.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72 +Jinja2-2.10.1.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=V1D-JHQKklZseXOMA-uAW7-BeKe_TfPpOFi9-dV04ZA,2616 +jinja2/__pycache__/__init__.cpython-37.pyc,, +jinja2/__pycache__/_compat.cpython-37.pyc,, +jinja2/__pycache__/_identifier.cpython-37.pyc,, +jinja2/__pycache__/asyncfilters.cpython-37.pyc,, +jinja2/__pycache__/asyncsupport.cpython-37.pyc,, +jinja2/__pycache__/bccache.cpython-37.pyc,, +jinja2/__pycache__/compiler.cpython-37.pyc,, +jinja2/__pycache__/constants.cpython-37.pyc,, +jinja2/__pycache__/debug.cpython-37.pyc,, +jinja2/__pycache__/defaults.cpython-37.pyc,, +jinja2/__pycache__/environment.cpython-37.pyc,, +jinja2/__pycache__/exceptions.cpython-37.pyc,, +jinja2/__pycache__/ext.cpython-37.pyc,, +jinja2/__pycache__/filters.cpython-37.pyc,, +jinja2/__pycache__/idtracking.cpython-37.pyc,, +jinja2/__pycache__/lexer.cpython-37.pyc,, +jinja2/__pycache__/loaders.cpython-37.pyc,, +jinja2/__pycache__/meta.cpython-37.pyc,, +jinja2/__pycache__/nativetypes.cpython-37.pyc,, +jinja2/__pycache__/nodes.cpython-37.pyc,, +jinja2/__pycache__/optimizer.cpython-37.pyc,, +jinja2/__pycache__/parser.cpython-37.pyc,, +jinja2/__pycache__/runtime.cpython-37.pyc,, +jinja2/__pycache__/sandbox.cpython-37.pyc,, +jinja2/__pycache__/tests.cpython-37.pyc,, +jinja2/__pycache__/utils.cpython-37.pyc,, +jinja2/__pycache__/visitor.cpython-37.pyc,, +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=UmX8hVjdaERCbA3RXBwrV1f-beA23KmijG5kzPJyU4A,17106 +jinja2/tests.py,sha256=iJQLwbapZr-EKquTG_fVOVdwHUUKf3SX9eNkjQDF8oU,4237 +jinja2/utils.py,sha256=q24VupGZotQ-uOyrJxCaXtDWhZC1RgsQG7kcdmjck2Q,20629 +jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/entry_points.txt new file mode 100644 index 0000000..32e6b75 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.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/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Jinja2-2.10.1.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE new file mode 100644 index 0000000..5d26938 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/LICENSE @@ -0,0 +1,33 @@ +Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS +for more details. + +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. + +* 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 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 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 AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA new file mode 100644 index 0000000..25a3ad1 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/METADATA @@ -0,0 +1,135 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 1.0 +Summary: Implements a XML/HTML/XHTML Markup safe string for Python +Home-page: http://github.com/pallets/markupsafe +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +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 :: 3 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML + +MarkupSafe +========== + +Implements a unicode subclass that supports HTML strings: + +.. code-block:: python + + >>> from markupsafe import Markup, escape + >>> escape("") + Markup(u'<script>alert(document.cookie);</script>') + >>> tmpl = Markup("%s") + >>> tmpl % "Peter > Lustig" + Markup(u'Peter > Lustig') + +If you want to make an object unicode that is not yet unicode +but don't want to lose the taint information, you can use the +``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which +is a different name for the same function). + +.. code-block:: python + + >>> from markupsafe import soft_unicode + >>> soft_unicode(42) + u'42' + >>> soft_unicode(Markup('foo')) + Markup(u'foo') + +HTML Representations +-------------------- + +Objects can customize their HTML markup equivalent by overriding +the ``__html__`` function: + +.. code-block:: python + + >>> class Foo(object): + ... def __html__(self): + ... return 'Nice' + ... + >>> escape(Foo()) + Markup(u'Nice') + >>> Markup(Foo()) + Markup(u'Nice') + +Silent Escapes +-------------- + +Since MarkupSafe 0.10 there is now also a separate escape function +called ``escape_silent`` that returns an empty string for ``None`` for +consistency with other systems that return empty strings for ``None`` +when escaping (for instance Pylons' webhelpers). + +If you also want to use this for the escape method of the Markup +object, you can create your own subclass that does that: + +.. code-block:: python + + from markupsafe import Markup, escape_silent as escape + + class SilentMarkup(Markup): + __slots__ = () + + @classmethod + def escape(cls, s): + return cls(escape(s)) + +New-Style String Formatting +--------------------------- + +Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and +3.x are now fully supported. Previously the escape behavior of those +functions was spotty at best. The new implementations operates under the +following algorithm: + +1. if an object has an ``__html_format__`` method it is called as + replacement for ``__format__`` with the format specifier. It either + has to return a string or markup object. +2. if an object has an ``__html__`` method it is called. +3. otherwise the default format system of Python kicks in and the result + is HTML escaped. + +Here is how you can implement your own formatting: + +.. code-block:: python + + class User(object): + + def __init__(self, id, username): + self.id = id + self.username = username + + def __html_format__(self, format_spec): + if format_spec == 'link': + return Markup('{1}').format( + self.id, + self.__html__(), + ) + elif format_spec: + raise ValueError('Invalid format spec') + return self.__html__() + + def __html__(self): + return Markup('{0}').format(self.username) + +And to format that user: + +.. code-block:: python + + >>> user = User(1, 'foo') + >>> Markup('

    User: {0:link}').format(user) + Markup(u'

    User: foo') + +Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher. + + diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD new file mode 100644 index 0000000..cc5f54c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/RECORD @@ -0,0 +1,16 @@ +MarkupSafe-1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-1.0.dist-info/LICENSE,sha256=C76IIo_WPSDsCX9k5Y1aCkZRI64TkUChjUBsYLSIJLU,1582 +MarkupSafe-1.0.dist-info/METADATA,sha256=RTBfxOEfHqiY9goR2QvR2sG0-pRm52r0QWcGi_pUYCQ,4182 +MarkupSafe-1.0.dist-info/RECORD,, +MarkupSafe-1.0.dist-info/WHEEL,sha256=KUcuKd4NS6mCD7Qx4sT343lTcoCvKQec801MGpvmkDM,110 +MarkupSafe-1.0.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=xtkRdxhzJzgp65wUo1D4DjnazxHU88pPldaAuDekBeY,10697 +markupsafe/__pycache__/__init__.cpython-37.pyc,, +markupsafe/__pycache__/_compat.cpython-37.pyc,, +markupsafe/__pycache__/_constants.cpython-37.pyc,, +markupsafe/__pycache__/_native.cpython-37.pyc,, +markupsafe/_compat.py,sha256=r1HE0CpcAZeb-AiTV9wITR91PeLHn0CzZ_XHkYoozpI,565 +markupsafe/_constants.py,sha256=U_xybFQsyXKCgHSfranJnFzo-z9nn9fuBeSk243sE5Q,4795 +markupsafe/_native.py,sha256=E2Un1ysOf-w45d18YCj8UelT5UP7Vt__IuFPYJ7YRIs,1187 +markupsafe/_speedups.c,sha256=B6Mf6Fn33WqkagfwY7q5ZBSm_vJoHDYxDB0Jp_DP7Jw,5936 +markupsafe/_speedups.cpython-37m-darwin.so,sha256=aCkvKwOgS-osg2ytJNhI926sjgLMFp8E-dxnjnXiMQ4,10584 diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL new file mode 100644 index 0000000..9c98308 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: false +Tag: cp37-cp37m-macosx_10_9_x86_64 + diff --git a/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/MarkupSafe-1.0.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/LICENSE.rst b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/LICENSE.rst new file mode 100644 index 0000000..c37cae4 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. 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. + +3. 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 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, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/METADATA new file mode 100644 index 0000000..ae87c92 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/METADATA @@ -0,0 +1,133 @@ +Metadata-Version: 2.1 +Name: Werkzeug +Version: 0.15.4 +Summary: The comprehensive WSGI web application library. +Home-page: https://palletsprojects.com/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: The Pallets Team +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Code, https://github.com/pallets/werkzeug +Project-URL: Issue tracker, https://github.com/pallets/werkzeug/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: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: dev +Requires-Dist: pytest ; 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: sphinx-issues ; extra == 'dev' +Provides-Extra: termcolor +Requires-Dist: termcolor ; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog ; extra == 'watchdog' + +Werkzeug +======== + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +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/ +- Documentation: https://werkzeug.palletsprojects.com/ +- 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/pallets/werkzeug + +- Test coverage: https://codecov.io/gh/pallets/werkzeug +- Official chat: https://discord.gg/t6rrQZH + +.. _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/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/RECORD new file mode 100644 index 0000000..91578f1 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/RECORD @@ -0,0 +1,119 @@ +Werkzeug-0.15.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-0.15.4.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-0.15.4.dist-info/METADATA,sha256=BFCzIm51w-fKsnG13iHz4No7Upu9-y_vJUq_rkY_bqY,4864 +Werkzeug-0.15.4.dist-info/RECORD,, +Werkzeug-0.15.4.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +Werkzeug-0.15.4.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=LBPc9xBJsifxGUsUY5EkreS0o_D8ixJD3YYSh9ARtxE,6805 +werkzeug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/__pycache__/_compat.cpython-37.pyc,, +werkzeug/__pycache__/_internal.cpython-37.pyc,, +werkzeug/__pycache__/_reloader.cpython-37.pyc,, +werkzeug/__pycache__/datastructures.cpython-37.pyc,, +werkzeug/__pycache__/exceptions.cpython-37.pyc,, +werkzeug/__pycache__/filesystem.cpython-37.pyc,, +werkzeug/__pycache__/formparser.cpython-37.pyc,, +werkzeug/__pycache__/http.cpython-37.pyc,, +werkzeug/__pycache__/local.cpython-37.pyc,, +werkzeug/__pycache__/posixemulation.cpython-37.pyc,, +werkzeug/__pycache__/routing.cpython-37.pyc,, +werkzeug/__pycache__/security.cpython-37.pyc,, +werkzeug/__pycache__/serving.cpython-37.pyc,, +werkzeug/__pycache__/test.cpython-37.pyc,, +werkzeug/__pycache__/testapp.cpython-37.pyc,, +werkzeug/__pycache__/urls.cpython-37.pyc,, +werkzeug/__pycache__/useragents.cpython-37.pyc,, +werkzeug/__pycache__/utils.cpython-37.pyc,, +werkzeug/__pycache__/wsgi.cpython-37.pyc,, +werkzeug/_compat.py,sha256=oBEVVrJT4sqYdIZbUWmgV9T9w257RhTSDBlTjh0Zbb0,6431 +werkzeug/_internal.py,sha256=Wx7cpTRWqeBd0LAqobo0lCO4pNUW4oav6XKf7Taumgk,14590 +werkzeug/_reloader.py,sha256=8B8T1npsQT-96nGeVJjV1KXWK_ong6ZlTXOWgxfRLpg,11241 +werkzeug/contrib/__init__.py,sha256=EvNyiiCF49j5P0fZYJ3ZGe82ofXdSBvUNqWFwwBMibQ,553 +werkzeug/contrib/__pycache__/__init__.cpython-37.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-37.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-37.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-37.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-37.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-37.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-37.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-37.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-37.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-37.pyc,, +werkzeug/contrib/atom.py,sha256=KpPJcTfzNW1J0VNQckCbVtVGBe3V8s451tOUya4qByI,15415 +werkzeug/contrib/cache.py,sha256=AEh5UIw-Ui7sHZnlpvrD7ueOKUhCaAD55FXiPtXbbRs,32115 +werkzeug/contrib/fixers.py,sha256=peEtAiIWYT5bh00EWEPOGKzGZXivOzVhhzKPvvzk1RM,9193 +werkzeug/contrib/iterio.py,sha256=KKHa_8aCF_uhoeQVyPGUwrivuB6y6nNdXYo2D2vzOA8,10928 +werkzeug/contrib/lint.py,sha256=NdIxP0E2kVt1xDIxoaIz3Rcl8ZdgmHaFbGTOaybGpN4,296 +werkzeug/contrib/profiler.py,sha256=k_oMLU-AtsVvQ9TxNdermY6FuzSTYr-WE-ZmWb_DMyU,1229 +werkzeug/contrib/securecookie.py,sha256=xbtElskGmtbiApgOJ5WhGgqGDs_68_PcWzqDIAY_QZY,13076 +werkzeug/contrib/sessions.py,sha256=oVXh_7-6_CWOMxDKqcaK05H8RpYoWqAd3al-KzMFPYs,13042 +werkzeug/contrib/wrappers.py,sha256=ZmNk0wpzD66yomPnQxapndZQs4c0kNJaRzqI-BVxeQk,13199 +werkzeug/datastructures.py,sha256=8HoA4Gu9i7ZWi5OBjx244OLWvDEE4JTQQUUTRoAYKog,91761 +werkzeug/debug/__init__.py,sha256=Bo3HvgTNY4NQ_2jROTSk3r1ScZcT_g_4EnuHTjKyrKM,18275 +werkzeug/debug/__pycache__/__init__.cpython-37.pyc,, +werkzeug/debug/__pycache__/console.cpython-37.pyc,, +werkzeug/debug/__pycache__/repr.cpython-37.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-37.pyc,, +werkzeug/debug/console.py,sha256=HoBL21bbcmtiCLqiLDJLZi1LYnWMZxjoXYH5WaZB1XY,5469 +werkzeug/debug/repr.py,sha256=lIwuhbyrMwVe3P_cFqNyqzHL7P93TLKod7lw9clydEw,9621 +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=rOhqZMRfpZnnu6_XCGn6wMWPhtfwRAcyZKksdIxPJas,6400 +werkzeug/debug/shared/jquery.js,sha256=FgpCb_KJQlLNfOu91ta32o_NMZxltwRo8QtmkMRdAu8,86927 +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=_Y98F6dR2CBUZNKylsOdgSHjwVaVy717WqE3-xJVcmE,6581 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/tbtools.py,sha256=SkAAA4KKfwsXJinUbf-AEP4GqONTsR4uU7WPUloXcSE,20318 +werkzeug/exceptions.py,sha256=SNbLn_vitnNiG_nwirLT0k6Nf6CZ_1R0Fyk_ub2XCbE,23230 +werkzeug/filesystem.py,sha256=HzKl-j0Hd8Jl66j778UbPTAYNnY6vUZgYLlBZ0e7uw0,2101 +werkzeug/formparser.py,sha256=tN6SO4mn6RUsxRZq4qVBWXbNWNuasn2KaBznTieMaVk,21790 +werkzeug/http.py,sha256=t0ET2tySAf9ZWdEelVWJoLaZzFViYpjoUmiYHPz10-E,43304 +werkzeug/local.py,sha256=USVEcgIg-oCiUJFPIecFIW9jkIejfw4Fjf1u5yN-Np4,14456 +werkzeug/middleware/__init__.py,sha256=f1SFZo67IlW4k1uqKzNHxYQlsakUS-D6KK_j0e3jjwQ,549 +werkzeug/middleware/__pycache__/__init__.cpython-37.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-37.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-37.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-37.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-37.pyc,, +werkzeug/middleware/dispatcher.py,sha256=_-KoMzHtcISHS7ouWKAOraqlCLprdh83YOAn_8DjLp8,2240 +werkzeug/middleware/http_proxy.py,sha256=lRjTdMmghHiZuZrS7_UJ3gZc-vlFizhBbFZ-XZPLwIA,7117 +werkzeug/middleware/lint.py,sha256=ItTwuWJnflF8xMT1uqU_Ty1ryhux-CjeUfskqaUpxsw,12967 +werkzeug/middleware/profiler.py,sha256=8B_s23d6BGrU_q54gJsm6kcCbOJbTSqrXCsioHON0Xs,4471 +werkzeug/middleware/proxy_fix.py,sha256=Y86VcU2oAQ--x0mi4iFVJyEFMzp3Ao8q0zvr_SsrpNw,8506 +werkzeug/middleware/shared_data.py,sha256=6aUzMABeOLul0Krf5S_hs-T7oUc7ZIQ3B8tAO4p8C7E,8541 +werkzeug/posixemulation.py,sha256=gSSiv1SCmOyzOM_nq1ZaZCtxP__C5MeDJl_4yXJmi4Q,3541 +werkzeug/routing.py,sha256=51zsLuN3qZcpRxpy3K3XoEuL8kyFfuqo28MquJsjZjw,72902 +werkzeug/security.py,sha256=mfxfcM-D6U8LhsyDK5W_rnL1oVTZWgyt-E8E4FlSdrI,8026 +werkzeug/serving.py,sha256=tUFUMg7Bj9iw3nA8ZgC_czMDJJKN7vFskajEmgEFhzE,36597 +werkzeug/test.py,sha256=Cnb5xa3vLDL0hzFCH1fkG_YRpndViGQgCh4D744iSQk,40645 +werkzeug/testapp.py,sha256=hcKBzorVlSHC-uGvGXXjCm3FzCwGWq4yjbTG3Pr7MV8,9301 +werkzeug/urls.py,sha256=8yHdYI99N__-isoTwvGqvuj9QhOh66dd1Xh1DIp0q0g,39261 +werkzeug/useragents.py,sha256=FIonyUF790Ro8OG8cJqG1zixhg5YzXdHmkZbrnK0QRo,5965 +werkzeug/utils.py,sha256=O20Y0qWk5O1IWamC_A5gkmzR5cgBd3yDIHviwBTfNB0,27387 +werkzeug/wrappers/__init__.py,sha256=S4VioKAmF_av9Ec9zQvG71X1EOkYfPx1TYck9jyDiyY,1384 +werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/accept.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/auth.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/base_response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/common_descriptors.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/etag.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/json.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-37.pyc,, +werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc,, +werkzeug/wrappers/accept.py,sha256=TIvjUc0g73fhTWX54wg_D9NNzKvpnG1X8u1w26tK1o8,1760 +werkzeug/wrappers/auth.py,sha256=Pmn6iaGHBrUyHbJpW0lZhO_q9RVoAa5QalaTqcavdAI,1158 +werkzeug/wrappers/base_request.py,sha256=k5mu1UU99X_xrPqmXj44pzJbkPRpgvwMuP2j9vl8QFU,26873 +werkzeug/wrappers/base_response.py,sha256=ZA1XlxtsbvG4SpbdOEMT5--z7aZM0w6C5y33W8wOXa4,27906 +werkzeug/wrappers/common_descriptors.py,sha256=OJ8jOwMun4L-BxCuFPkK1vaefx_-Y5IndVXvvn_ems4,12089 +werkzeug/wrappers/etag.py,sha256=TwMO1fvluXbBqnFTj2DvrCNa3mYhbHYe1UZAVzfXvuU,12533 +werkzeug/wrappers/json.py,sha256=HvK_A4NpO0sLqgb10sTJcoZydYOwyNiPCJPV7SVgcgE,4343 +werkzeug/wrappers/request.py,sha256=qPo2zmmBv4HxboywtWZb2pJL8OPXo07BUXBKw2j9Fi8,1338 +werkzeug/wrappers/response.py,sha256=vDZFEGzDOG0jjmS0uVVjeT3hqRt1hFaf15npnx7RD28,2329 +werkzeug/wrappers/user_agent.py,sha256=4bTgQKTLQmGUyxOREYOzbeiFP2VwIOE7E14AhUB5NqM,444 +werkzeug/wsgi.py,sha256=h-zyAeInwE6X6ciSnHI14ImA85adV-F861PmR7UGtRk,36681 diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/Werkzeug-0.15.4.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/backend/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60747c6f7c6ebbb44458cd759ffa24f8d8567239 GIT binary patch literal 333 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d4706c8e5225440103353ed4ebc169a05ba2488 GIT binary patch literal 24991 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%0A061AWW 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 Fj{sn+vpoO+ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__init__.py b/backend/venv/lib/python3.7/site-packages/bson/__init__.py new file mode 100644 index 0000000..c802cbf --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/__init__.py @@ -0,0 +1,1170 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""BSON (Binary JSON) encoding and decoding. + +The mapping from Python types to BSON types is as follows: + +======================================= ============= =================== +Python Type BSON Type Supported Direction +======================================= ============= =================== +None null both +bool boolean both +int [#int]_ int32 / int64 py -> bson +long int64 py -> bson +`bson.int64.Int64` int64 both +float number (real) both +string string py -> bson +unicode string both +list array both +dict / `SON` object both +datetime.datetime [#dt]_ [#dt2]_ date both +`bson.regex.Regex` regex both +compiled re [#re]_ regex py -> bson +`bson.binary.Binary` binary both +`bson.objectid.ObjectId` oid both +`bson.dbref.DBRef` dbref both +None undefined bson -> py +unicode code bson -> py +`bson.code.Code` code py -> bson +unicode symbol bson -> py +bytes (Python 3) [#bytes]_ binary both +======================================= ============= =================== + +Note that, when using Python 2.x, to save binary data it must be wrapped as +an instance of `bson.binary.Binary`. Otherwise it will be saved as a BSON +string and retrieved as unicode. Users of Python 3.x can use the Python bytes +type. + +.. [#int] A Python int will be saved as a BSON int32 or BSON int64 depending + on its size. A BSON int32 will always decode to a Python int. A BSON + int64 will always decode to a :class:`~bson.int64.Int64`. +.. [#dt] datetime.datetime instances will be rounded to the nearest + millisecond when saved +.. [#dt2] all datetime.datetime instances are treated as *naive*. clients + should always use UTC. +.. [#re] :class:`~bson.regex.Regex` instances and regular expression + objects from ``re.compile()`` are both saved as BSON regular expressions. + BSON regular expressions are decoded as :class:`~bson.regex.Regex` + instances. +.. [#bytes] The bytes type from Python 3.x is encoded as BSON binary with + subtype 0. In Python 3.x it will be decoded back to bytes. In Python 2.x + it will be decoded to an instance of :class:`~bson.binary.Binary` with + subtype 0. +""" + +import calendar +import datetime +import itertools +import re +import struct +import sys +import uuid + +from codecs import (utf_8_decode as _utf_8_decode, + utf_8_encode as _utf_8_encode) + +from bson.binary import (Binary, OLD_UUID_SUBTYPE, + JAVA_LEGACY, CSHARP_LEGACY, + UUIDLegacy) +from bson.code import Code +from bson.codec_options import ( + CodecOptions, DEFAULT_CODEC_OPTIONS, _raw_document_class) +from bson.dbref import DBRef +from bson.decimal128 import Decimal128 +from bson.errors import (InvalidBSON, + InvalidDocument, + InvalidStringData) +from bson.int64 import Int64 +from bson.max_key import MaxKey +from bson.min_key import MinKey +from bson.objectid import ObjectId +from bson.py3compat import (abc, + b, + PY3, + iteritems, + text_type, + string_type, + reraise) +from bson.regex import Regex +from bson.son import SON, RE_TYPE +from bson.timestamp import Timestamp +from bson.tz_util import utc + + +try: + from bson import _cbson + _USE_C = True +except ImportError: + _USE_C = False + + +EPOCH_AWARE = datetime.datetime.fromtimestamp(0, utc) +EPOCH_NAIVE = datetime.datetime.utcfromtimestamp(0) + + +BSONNUM = b"\x01" # Floating point +BSONSTR = b"\x02" # UTF-8 string +BSONOBJ = b"\x03" # Embedded document +BSONARR = b"\x04" # Array +BSONBIN = b"\x05" # Binary +BSONUND = b"\x06" # Undefined +BSONOID = b"\x07" # ObjectId +BSONBOO = b"\x08" # Boolean +BSONDAT = b"\x09" # UTC Datetime +BSONNUL = b"\x0A" # Null +BSONRGX = b"\x0B" # Regex +BSONREF = b"\x0C" # DBRef +BSONCOD = b"\x0D" # Javascript code +BSONSYM = b"\x0E" # Symbol +BSONCWS = b"\x0F" # Javascript code with scope +BSONINT = b"\x10" # 32bit int +BSONTIM = b"\x11" # Timestamp +BSONLON = b"\x12" # 64bit int +BSONDEC = b"\x13" # Decimal128 +BSONMIN = b"\xFF" # Min key +BSONMAX = b"\x7F" # Max key + + +_UNPACK_FLOAT = struct.Struct("= obj_end: + raise InvalidBSON("invalid object length") + # If this is the top-level document, validate the total size too. + if position == 0 and obj_size != obj_end: + raise InvalidBSON("invalid object length") + return obj_size, end + + +def _get_object(data, position, obj_end, opts, dummy): + """Decode a BSON subdocument to opts.document_class or bson.dbref.DBRef.""" + obj_size, end = _get_object_size(data, position, obj_end) + if _raw_document_class(opts.document_class): + return (opts.document_class(data[position:end + 1], opts), + position + obj_size) + + obj = _elements_to_dict(data, position + 4, end, opts) + + position += obj_size + if "$ref" in obj: + return (DBRef(obj.pop("$ref"), obj.pop("$id", None), + obj.pop("$db", None), obj), position) + return obj, position + + +def _get_array(data, position, obj_end, opts, element_name): + """Decode a BSON array to python list.""" + size = _UNPACK_INT(data[position:position + 4])[0] + end = position + size - 1 + if data[end:end + 1] != b"\x00": + raise InvalidBSON("bad eoo") + + position += 4 + end -= 1 + result = [] + + # Avoid doing global and attribute lookups in the loop. + append = result.append + index = data.index + getter = _ELEMENT_GETTER + decoder_map = opts.type_registry._decoder_map + + while position < end: + element_type = data[position:position + 1] + # Just skip the keys. + position = index(b'\x00', position) + 1 + try: + value, position = getter[element_type]( + data, position, obj_end, opts, element_name) + except KeyError: + _raise_unknown_type(element_type, element_name) + + if decoder_map: + custom_decoder = decoder_map.get(type(value)) + if custom_decoder is not None: + value = custom_decoder(value) + + append(value) + + if position != end + 1: + raise InvalidBSON('bad array length') + return result, position + 1 + + +def _get_binary(data, position, obj_end, opts, dummy1): + """Decode a BSON binary to bson.binary.Binary or python UUID.""" + length, subtype = _UNPACK_LENGTH_SUBTYPE(data[position:position + 5]) + position += 5 + if subtype == 2: + length2 = _UNPACK_INT(data[position:position + 4])[0] + position += 4 + if length2 != length - 4: + raise InvalidBSON("invalid binary (st 2) - lengths don't match!") + length = length2 + end = position + length + if length < 0 or end > obj_end: + raise InvalidBSON('bad binary object length') + if subtype == 3: + # Java Legacy + uuid_representation = opts.uuid_representation + if uuid_representation == JAVA_LEGACY: + java = data[position:end] + value = uuid.UUID(bytes=java[0:8][::-1] + java[8:16][::-1]) + # C# legacy + elif uuid_representation == CSHARP_LEGACY: + value = uuid.UUID(bytes_le=data[position:end]) + # Python + else: + value = uuid.UUID(bytes=data[position:end]) + return value, end + if subtype == 4: + return uuid.UUID(bytes=data[position:end]), end + # Python3 special case. Decode subtype 0 to 'bytes'. + if PY3 and subtype == 0: + value = data[position:end] + else: + value = Binary(data[position:end], subtype) + return value, end + + +def _get_oid(data, position, dummy0, dummy1, dummy2): + """Decode a BSON ObjectId to bson.objectid.ObjectId.""" + end = position + 12 + return ObjectId(data[position:end]), end + + +def _get_boolean(data, position, dummy0, dummy1, dummy2): + """Decode a BSON true/false to python True/False.""" + end = position + 1 + boolean_byte = data[position:end] + if boolean_byte == b'\x00': + return False, end + elif boolean_byte == b'\x01': + return True, end + raise InvalidBSON('invalid boolean value: %r' % boolean_byte) + + +def _get_date(data, position, dummy0, opts, dummy1): + """Decode a BSON datetime to python datetime.datetime.""" + end = position + 8 + millis = _UNPACK_LONG(data[position:end])[0] + return _millis_to_datetime(millis, opts), end + + +def _get_code(data, position, obj_end, opts, element_name): + """Decode a BSON code to bson.code.Code.""" + code, position = _get_string(data, position, obj_end, opts, element_name) + return Code(code), position + + +def _get_code_w_scope(data, position, obj_end, opts, element_name): + """Decode a BSON code_w_scope to bson.code.Code.""" + code_end = position + _UNPACK_INT(data[position:position + 4])[0] + code, position = _get_string( + data, position + 4, code_end, opts, element_name) + scope, position = _get_object(data, position, code_end, opts, element_name) + if position != code_end: + raise InvalidBSON('scope outside of javascript code boundaries') + return Code(code, scope), position + + +def _get_regex(data, position, dummy0, opts, dummy1): + """Decode a BSON regex to bson.regex.Regex or a python pattern object.""" + pattern, position = _get_c_string(data, position, opts) + bson_flags, position = _get_c_string(data, position, opts) + bson_re = Regex(pattern, bson_flags) + return bson_re, position + + +def _get_ref(data, position, obj_end, opts, element_name): + """Decode (deprecated) BSON DBPointer to bson.dbref.DBRef.""" + collection, position = _get_string( + data, position, obj_end, opts, element_name) + oid, position = _get_oid(data, position, obj_end, opts, element_name) + return DBRef(collection, oid), position + + +def _get_timestamp(data, position, dummy0, dummy1, dummy2): + """Decode a BSON timestamp to bson.timestamp.Timestamp.""" + end = position + 8 + inc, timestamp = _UNPACK_TIMESTAMP(data[position:end]) + return Timestamp(timestamp, inc), end + + +def _get_int64(data, position, dummy0, dummy1, dummy2): + """Decode a BSON int64 to bson.int64.Int64.""" + end = position + 8 + return Int64(_UNPACK_LONG(data[position:end])[0]), end + + +def _get_decimal128(data, position, dummy0, dummy1, dummy2): + """Decode a BSON decimal128 to bson.decimal128.Decimal128.""" + end = position + 16 + return Decimal128.from_bid(data[position:end]), end + + +# Each decoder function's signature is: +# - data: bytes +# - position: int, beginning of object in 'data' to decode +# - obj_end: int, end of object to decode in 'data' if variable-length type +# - opts: a CodecOptions +_ELEMENT_GETTER = { + BSONNUM: _get_float, + BSONSTR: _get_string, + BSONOBJ: _get_object, + BSONARR: _get_array, + BSONBIN: _get_binary, + BSONUND: lambda v, w, x, y, z: (None, w), # Deprecated undefined + BSONOID: _get_oid, + BSONBOO: _get_boolean, + BSONDAT: _get_date, + BSONNUL: lambda v, w, x, y, z: (None, w), + BSONRGX: _get_regex, + BSONREF: _get_ref, # Deprecated DBPointer + BSONCOD: _get_code, + BSONSYM: _get_string, # Deprecated symbol + BSONCWS: _get_code_w_scope, + BSONINT: _get_int, + BSONTIM: _get_timestamp, + BSONLON: _get_int64, + BSONDEC: _get_decimal128, + BSONMIN: lambda v, w, x, y, z: (MinKey(), w), + BSONMAX: lambda v, w, x, y, z: (MaxKey(), w)} + + +def _element_to_dict(data, position, obj_end, opts): + """Decode a single key, value pair.""" + element_type = data[position:position + 1] + position += 1 + element_name, position = _get_c_string(data, position, opts) + try: + value, position = _ELEMENT_GETTER[element_type](data, position, + obj_end, opts, + element_name) + except KeyError: + _raise_unknown_type(element_type, element_name) + + if opts.type_registry._decoder_map: + custom_decoder = opts.type_registry._decoder_map.get(type(value)) + if custom_decoder is not None: + value = custom_decoder(value) + + return element_name, value, position +if _USE_C: + _element_to_dict = _cbson._element_to_dict + + +def _elements_to_dict(data, position, obj_end, opts, result=None): + """Decode a BSON document into result.""" + if result is None: + result = opts.document_class() + end = obj_end - 1 + while position < end: + key, value, position = _element_to_dict(data, position, obj_end, opts) + result[key] = value + if position != obj_end: + raise InvalidBSON('bad object or element length') + return result + + +def _bson_to_dict(data, opts): + """Decode a BSON string to document_class.""" + try: + if _raw_document_class(opts.document_class): + return opts.document_class(data, opts) + _, end = _get_object_size(data, 0, len(data)) + return _elements_to_dict(data, 4, end, opts) + except InvalidBSON: + raise + except Exception: + # Change exception type to InvalidBSON but preserve traceback. + _, exc_value, exc_tb = sys.exc_info() + reraise(InvalidBSON, exc_value, exc_tb) +if _USE_C: + _bson_to_dict = _cbson._bson_to_dict + + +_PACK_FLOAT = struct.Struct(">> import collections # From Python standard library. + >>> import bson + >>> from bson.codec_options import CodecOptions + >>> data = bson.BSON.encode({'a': 1}) + >>> decoded_doc = bson.BSON(data).decode() + + >>> options = CodecOptions(document_class=collections.OrderedDict) + >>> decoded_doc = bson.BSON(data).decode(codec_options=options) + >>> type(decoded_doc) + + + :Parameters: + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionchanged:: 3.0 + Removed `compile_re` option: PyMongo now always represents BSON + regular expressions as :class:`~bson.regex.Regex` objects. Use + :meth:`~bson.regex.Regex.try_compile` to attempt to convert from a + BSON regular expression to a Python regular expression object. + + Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with + `codec_options`. + + .. versionchanged:: 2.7 + Added `compile_re` option. If set to False, PyMongo represented BSON + regular expressions as :class:`~bson.regex.Regex` objects instead of + attempting to compile BSON regular expressions as Python native + regular expressions, thus preventing errors for some incompatible + patterns, see `PYTHON-500`_. + + .. _PYTHON-500: https://jira.mongodb.org/browse/PYTHON-500 + """ + if not isinstance(codec_options, CodecOptions): + raise _CODEC_OPTIONS_TYPE_ERROR + + return _bson_to_dict(self, codec_options) + + +def has_c(): + """Is the C extension installed? + """ + return _USE_C diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68352a24a11dbc5ec58c4c4c0e65c36a91b78b30 GIT binary patch literal 32798 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/binary.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/binary.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00fa84bc2e87276741ead576997844fbd5138391 GIT binary patch literal 5272 zcmbVQ%WoUU8Q&KlqNu0sG)`X=KO(Iwld@$uiRu`k9!^v^v>?eTyoNDa?F^-r$X#Z3 zX_X396t#g|d+)`%rN;sVdgy<$rvg0$Mo+!=)bE>pkd!5%=u$JgGyBc=p80;OrLnP+ z0@wEsK6vr*PZZ^!I7qJ|JbVr<_#<>oVQN!psg|nZv)0sFx~1c@WiZ{!F~iEUoK;|X ztH_Ji2rpPAR7i@PWouOJ|y8@LWS>Ix}9YR-PAFj^$q~uT-n}odWX(R(uVqZny{hf>5~L zZb0lnG70y1%s-wdVYkgI(Ul6xJw$WYN(n)>@l8EaCp^Z9%TNj5hukB`MK&jJgK+f~|Idb>@FU`c3N`-iS$QKtSPeRr* zO%^f}0+|}IBM;qhk0fl#JUMimP4qb9=%?7dgfLfdCv0}nZ>gHG?TOUIbz9gi9&!<+ zf^R1-TqKw%gJB!Ytwc*8&P<#2+nBy~(~OsHCuI5M= z_*6zoZysGs191)&q{dqXPBDQe+0o6@)UZuL+x1|V4CIAbh)QmdW^a^}lA@6;*&`je zMx}nDMFmPden@FFNta}jP?|_GjYxNzL1dsQQ6ZU)jDR;Ae^vz42<1Pl+7|9hJLJ`u zwx~AzChXgw+7i{BeM&zG?t34aqv?b}k%X7l#l z-#P~!+NITYx8-}gzKn7;&V)+4E8YW9Sb2hJ=oGc27G;}+ds)q^N8_>PmBbVW9flX) zvB_BDvENhn6^M^|baOM_qPRCgJRg&^i;qn_HSsc4@grCTw;#hzS{!#j#o-6g{Rvut zMMg0)EfPm%THtHUK5W4~=t3n_d&(>AjdlX1^r~{KhPt>F8jy!M$huoS^-Z2>C+e}< z1G@b}Lj#@ldYlJ^Cgi$z`;J+RazUrfg_r=A(Kw~MJcLNvVmF{vpfE9o9r`TF$46mo zjuxA96<$EG9HCSmaIgqNDx_^cho=*00qz||n^woc<40FAKM%@sr2R++E!$eRV32Mt z@e!B-TMCR;8(L4@H{cnzT0=Vk)0hh8Y4t~DE>;-rk%~&yrJK!IR<7h0?7vE z-s6=16<5nhr~`K6n<2Zi_*@2h21nf+NU;-4Gp(V$ha$Cln#r>_gE?|DFiky9A}}9e z0`wQ`iW%Vhw*g)HX2)yIi3s?3P(Q$pB}!X9>ooDXOzAfryP3R!V~P0=rB<0@DWxr2 z9B>hhFRj&U8_($G)1|Fv>#Oo)h>C6D!$t_ZGFJrVuDFgJhCqCT9cmSgC7JF39!awu z41Aa3Y6brcL zc%J21L1I8ae{2NiimU`4AB{=~Tp#mY+v(arK!|WC5fzw)Wf(Sk+ZQ1@^u+<7GAP_o z$B`%i$m1hYvI8=NX!`&G+z7ZO1dNar$A=Fe61OG!bvkZZ^>MZ#{1(9qTS<8t#-$ywXDnMD>cSvU6m?JT?<@&S>V@Cp-I~@EV()0TpN7;qUkzFT`Z;v;fQpeIW_= z<8;ORDW6o%UD?m3R7KD%S$*d;mxk-HzR)w5KA(T_JU0DBvKq2`Q=d~w8vJ(Q)&1!0obp84_P z@9dxRsgmLU-^sm+3U6Qd5rC`~N$ul>?^tM#oKirchg*3jWuTCaVzx@nDmwQ@fdWLd-j2I>PD;s6_pwkQ$ Me?<-62BG` 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/dbref.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/dbref.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0914fec2c5c1dac6a4c1e34c423639d051c24f75 GIT binary patch literal 4368 zcma)9U31&U6~zJ|1ktoC%Zc+j>5j*)O^;0_PSQ9U#bdk4csyy<*7ifosS85br3?`S z;9XD-In+z!>3jcy{nq{^y!I)7A${q&3jq{0b{lf`1K7pIz2~02_u~H9vuz8%e{O&H z^l-zn{!JJ4&&A{}nx;-zeM>N5Cv0r@ZANn^amH@n9k==|bL}SHc%{F>tOu583GbyP zJn0`f{Z+B@*y{STyHBz#(R`RGJ`U43pCn-sr+fU{`;X*M^J_{DrIKkRH7_#$`z+nd zzP-;y7EQ)7Ep)f{6ZEjUtn`JHd6ebTu3fIig;Z!`U7pc}g1n%Z<`TP{$A8#~=!yF0 zU~(5t{~evQ`V2PNg7qC?_g&${*3cHNXuV|pmh^-tR$f|1tiOV}FILUm$Gk1hnE9&c zh_f%Pep{@Ga~RKvb#WeJM{I}-7|)7##Jd>R#6|HQ#&hC*@d3tl@uBz#<9Xo#m5J+)=7){pTo;*=g2!o%Nw3ZE`$@ozov4MLejXZG_&u8b8@j@pvw|Jj`uze{ z7Hr?S2z!2HbJ#mtRkyM3nDyIO$E;arb1QJ?Hu~1wLGR65uU6*nYsRd33)jA|p}8CW z$F{78Xd zRK!_2;NZtVghjX;YKc|N)2wL3geic~MF^VkY}kmSy_Ne1{964E+`#iG&!@$+Eajhf zE8s|*yN%lf7ykXebu#kN7B2%Mrm$gs=ykXq3s8|fP%-(}AnKW|h2d`>A7+eZsacMB% z#)jpmYlPsS8t?A1M)eNDxH$~VLatvQy#SDUS;+rI`-BjFjQj}~-Qdv#CXXwv^@6j# z9v@Q}f{9yOTaLdUSl7H(6nM+k=7f}f z5Rl`7pxg+|xe9{CtIKwMFBau`J+I$cdXpS;S+3P96@Fc>bhS)|W&4CA8xs8b$-WoJ z9|{$gUiHMkEcGt*`Z?OnReS)En+KuV9A=3C=QhV`b9X-oZtE}8uMWf)QIH?p`m`9{ z-rHBnXTvYQ{(AGtW*+A^jg3ii^VSd1XcA0=&3tMQ-rUt$x@i#ZOz^l!7-n!%%2Z;u#l#g9g6zeUp&8t2x&g{Z}5+Ye-6NW3@;V7w6n z1~1Uyq2`k`jxr$^VWZ2`83@C$j==y@b)=#?kM0{ZjlgJG?rgnMZXxp*sP{>w-U*d( zqLvisK=xY{KnAZYK32f56o|zycyabWaj98xBIG=h#YCl=?_{Z@7+yT9l}3P)I=xzO zoy#a5A{sW~amkXiZ@1(EmL8&2P06B5Oa;q&ezmz_AF`bV5`xZm_$0iVsl10w${w1Qy}69r$DV? zPpwG{*$;7^4&#D*WhV%7cICI#v`=)zD5A^-2& zLwnCYVuy6k5e}+`8#J3U;cf%tS1ztvrY>MWvo+H-hfsPoSqh;%M-oE`hjI^T*rcDD zDku2#K&Db5`A#X{qn41A>UKe%JWt}NdRE8-nPfR4&LRxEml2j{&gEF_pclJcPf<-| zPNSj|p@>WdLgVWiM+Z^;G>TrR1KfU!2Q-~Ct3|GC+_n|R@|*`=B~@$%=>L zJdyOpB1PA&f=4Su!KF%jqWdmp&?Kv{Y^ zQvkCa{K`^eWDfzfM`X6qDSs9A~FJh0tEh z3W6UYp~^FM2P^^on*hJq)ZI`-2$Y7wI1`hEN=Ha}J_(cKLUIK%vj~}@V?LLIai~U8 zsrTq9KUWlDi|OeQ`VnbQ6`A7HU8C*>bvLQIMco(FEmD)2nc9es3`sX}%eP&}wby>t z@$mQkRp0S3n6YJm+Ud5{SJ+*;1f?R_`fF4oqB#7V;#62vv4niw_st4cP2exRY}_(53XZD^%`K>NjAzcE?_49p}H-oGUi~ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/decimal128.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/decimal128.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11b76a1d497346f7e7c8b25b19eacb4d7cfed3a1 GIT binary patch literal 9684 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/errors.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/errors.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc38f575cca4a04eadce9b4a23b27243096251f2 GIT binary patch literal 1316 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/max_key.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/max_key.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fabed3812c23c98a6c7be22bf29a398a60c985d4 GIT binary patch literal 1561 zcma)6OK;Oa5cVsNrb*vI2q9sCkQ!CBX+_nCDpVB&2h<#(r$}hydNzp@zq)op6IJ5S z{uua6zH;I(aAL-8S_eX5tDUhu+xh1EW;VyQT1CS3_3+WBX9Y?6PA`+C;lmN`=ph=A zn$kN7WKgapP`G@hHWg4mN_B0#^MQwgN8FFC*a>{S9SA+{a{VOmJHeY{-SJ~Ce9P5O ztc&-2q{pL>8xmr5l#WQse;nfKn3kuY8IdXMf61|K^c7s=AeSU z4D(P$KL<5fKwp7HSVBJ!%dmpJ3aeP=T2jp5$HV*Us_3{3LmzSxAsf4E`5g`i2l}?L zo5nEQYGt`vE!_`3>y8(?+(Z76ZU|4 zrhs{t=yOq*1s+0n!Y3oXcgM

    &7+6~Of&23hCSfgH}N%bucsU{W1yZ{E&K%8-QKCs-INQp5B zY{mrLc2OoXPlj|5H8P82mdGrVSs_E0JZI=$q@%Tp578Q$azRrxrL5-v(i4rkDjwj0 cq!^s_xE-e-bE(qI**!bVN`6Jy={?ibUwFAblmGw# literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/min_key.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/min_key.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b4cbc1218b985e12352a2634ea18f95d77f74d0 GIT binary patch literal 1561 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 Jx8ciX{{keG8-M@+ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/raw_bson.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/raw_bson.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..784fdd5827b853d3f3356b279582eabc82e3531d GIT binary patch literal 4211 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 SpHV#8k^zR@8e8=$5B~*<4m>RY literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/son.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/son.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abfd4d3e9c68ea241ea390a1b19b1e21dd220531 GIT binary patch literal 6377 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/bson/__pycache__/tz_util.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/bson/__pycache__/tz_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b50303a0ebe73b98cc704f8e3eb7e998b1b30317 GIT binary patch literal 1515 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�^(R8G^V?i!FVEbzu()@0rm?8`>dBQ7eM|6kx{OK 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 z zof*5XORQ2hOjzGFAt@;=2Z1)~gX-`SA^=gNVpI(9fP%cLks?Qud zRSKsGj259*_oz6`eI>qnb_hA0`eD`)uo={U=CMSvmT@!E! zitNlwq750MRcxYNrm*!XU5joKoXe?}RMxBL#PmD26vxI$*k~uzp>j5MDFQjDto8B1^FZ7+6qND-{1;0nWDx93Y6Mw6Pm{0Im<#l~o8@t8EYm z)S%U@KpgB6TuU%`4X>j#!*Fty;4HIunKrLnTjwfX;;XIHI*6 z_CVSK!2u4oUrm$sLvVLmqHch`NE6owN`ebYw0PQ_(A>FDDcYaXwe%XT$+e)igx8g{ z-7cC*WO-hxWpiF(b& znE_|#^`&zIC3U6MxSQ~y3psQg741Dnb8CA$aB8LP-GPl~Fbx(Dxdg)qy_x3LT3%%W z*u@o)=|zZaNux(FxIp_8Fq(IgK=Yf#OH>t&woS09T+zJU7GeAz%8FMeNlPo679zH1-Q_18!x!m`>TvBy`!;=EAXuU`yF;}UaY=1WeI;+WXb-!=$+slhA)d|qL;?F< zt`hX$1lkQiYdt`Q5>bD0%l6YAKw9&6BAa-w7tdBaabD1`A+5pH>S{^b+t<^P+3H@O z(UO**pYLftvn8`7tvRhDy~W*<-rS=#vmw1Xt<~K!w!yXDwHF784X$SV>*$%)+Dm#gyIu${kEq$cw_Vdn2p`T0q6mT$v$eh&lq(PQ~enE7#bD}KLJ`E8i^ ztbeVNm!01UGyiO~5q}jbzYW{@JtEanz5{0d29Vdi(j%P_cK+s{Ndkmfe<#fP7ehbrm#6aEu$|wN(tn&V^Vgm$^Ixp;+i)U3 z1NhNn`5p(%{LSZyWUWNyw_&1j{A4-sncoRBzkRM+t@7KjogcH7_|ap2C(QizdF*nV ze|0`fe3tJ?>Ay~x`R(&sez;udFUR>U^S6)?e)L$r6J~zNB*5K^J|lsihD^azYQ}<@Xr8# z^q4=j{jv;^tbMEU+pwKKKSlmdnB^B=B=h&gg)++DhVA@=d0`7b!Ytp0j|Tp!DAS|P z=}%CweQtjSVYrd%(#}K$Hz;_9f>$e;^vn5Bzts74De%kfMEFgB4>!NoR!F4RkzLHf-l#pOW7RGk;5^L`cKMJ@RA2cK+Iw_Hn|@ zpH(IE^RH7dzYW{@o%|k-|7Ml{1eM>0|J(do3uO5t?D7?C=WmwDiT>e)Mg0|izRKV7 zznFg{U+2JYs>*M}cKIES@yz-=VV1AeiR>Ex0tn@2!*>2GnVjI?2{V6|%0Jhxzk(C_ zc>xnY!Yn__0W-g6kx16+RDK(_^Y2Y*e@)5`A(SS&sO>Ws`A^go!`ELN|^a=_)*}WN?ERv1w5eCBjyf--hk{%_;evF!Q&l z{BNrKHf-l_Ny+bonLmH2MEF?cw_!WKv%XUh>4cfTS><=(QZwb5fI&7JE=!V6jzlOZRmEVSK{$YlSA7S$Egv%MJeyQ`D7xbL{X*%G;^`}-<{{N`* zZTKm`hwD#kQuK=rzXp7cFVBsVA+qM=uM_G05oxan`FB?c+v__WZ#WaS*IOqm*j_)K zrC@tKG)BSp`sNY^+v^qnAsN!M*B{p@*rV)o{zV#5o`V0RVB6l`s$koG-=kpL9zUR9 z+rI9BjzW62y*yCCw*7mmf^GYDl#M@D%FCx<+upoV!M6Q)wSsMX&{VK(-`%BP+g^K6 z!M6SN7-5J0+pb_+|Ls<=t^dAKu&w_xph%hD)_(&OZ0o;l1>5>BSHX6Fm`vDV-(9L; z+rA4BhQ74zyX6YD?K{4K%yiqndsM-;er31hyYu#XAISo?^%>1hrrYB)N5S@ZpQvD4 zpI)M1Tb~6KY>&@n3byrCM8WxLJl&^Ydp!MJ!M6R#7mLY{y?^sh8?HhCzYpPQJP0R`LkMbJ*KCU=^4oq}!q zbG3qPd+2sMznWj}QE--m9|ny7ha@$;Z;=9XU(=cXehU0U3Y>)w;Ka{PfiFyfi&Ef{ z6u3GCzAgpkyW`ICT2kN*De&eLxFZFACk5_Ifiq#3I?EfB0-v1%k57U5XOo=yXQ#kd zr@$*y;9FDRds5(yDe(3bcvlMiMGE|53OvBwmESW{;E5^lv=n$w3S6B6FH3=&Q(%5F z#VIfTod+lUYzq8t3cN1`?hW1P%s)5`j3$Pl4-F;KmgA))e?234;asdmsho`)Wu`r1L#DC(L)zoG{-pbHaSL%nARP z0%v01-I+cx1wJ7KJ|zV{GX*|31->8!o|pnpNr7jiz-NIuzPorf96zx!3N9CpUzy;a z6CVwi2X{W)7`U-;jBHSc6ezKj$i({0&W)Em2f3+v*AkN=D?M~(FW#RIu~vp9KWMc33nCTe7Gt& z``ynPglplhhO2|ChvU2(f?Ei;2yQXl61Z#Nmcli_t$LNI!8OC(42NGn?FAp)MR1ehXdg_4yBzLXxMgsh^OwUl!u`}9|L3#^z6sFv zu)0JYHj5)t8{nC!I>dBFC5|}lNS?0RVaMUB9hG{fYRAi?*Dg?(LseW4aGZ0Ol-cLs zIK)2Ofj6RY;_WzomJyD_X>oj>a@>s%i5%`^yhI$@%VT<+K}*nieyy%3;K(}>B3=T8 z2@Zg1iSz#wUJMYY=^`Z1h@Uw8=W%ut5@+0KuasMfh)LeqB+&J8Vz(Ik_Fy8xaaW{E zoVp@%n7D2v#0?oBPUw2&@c(G%e0rM(f++4Ulo;Boz!9MyDijVhNN`$(G_*lYT-B}A ze0$#f-5J{wJw(8PQ#x5&IM|0K%j<30@hIJt18rQo9SBW0o>NvT8%SVt77G9Aq?0- zR{}KX8beTsrr1G}C!xWq1||ck!7)Jukq@*`XEU&Wv>ZanP+yf218B0te;Ae-v>!aI7Xv#=tSSNi~||v%dN`rWw9(oI!H@2|A8G35!!6ZiLpi zUr@=ZZ+p~)+O#*@$M*h!C)-Uodq6FdRljMePD`uhiFSNv&ezTFk0M~P1-g1a->ueN z|2%vBYW{Ba{Pw(@pUqC^ZzQi^c$&7uSteZrUqb4-rs86go}iE+>bM$KO_zx}EUCx< zW^=<;tD3^TM=B=i-&Cr|N}83`{(2x|n7ae6Kcag%^R;l}Sp<-Idg8`R&I*m3hPpl1 zPEWG)(hCSBXUqp`3zzvJ%+GX5g)1c{Q9C^e>Dnj}SwKcpy&RMjlL0Sl#{Vs%8d98+ z%2Sz0^Ftyvx`=@wf)>lwrEsa*Rh2#*J?cag%C(N*&UpP{=8^IPRdtg6xTn1=OzB)N zoeRXl*MJsW!p(6=)^dkxYxs2d9!oR}TsQ6f?1&4U+$0jx5;u#?t6Fth&tuFpcu@Au z(I$_KG@D^}v+jqhJ4?&5EnJmF`D5(9cH7&!@ZX zYL9Ps=*#y5W^n&_+mx$sSIdh`_ + to use + """ + + _type_marker = 5 + + def __new__(cls, data, subtype=BINARY_SUBTYPE): + if not isinstance(data, bytes): + raise TypeError("data must be an instance of bytes") + if not isinstance(subtype, int): + raise TypeError("subtype must be an instance of int") + if subtype >= 256 or subtype < 0: + raise ValueError("subtype must be contained in [0, 256)") + self = bytes.__new__(cls, data) + self.__subtype = subtype + return self + + @property + def subtype(self): + """Subtype of this binary data. + """ + return self.__subtype + + def __getnewargs__(self): + # Work around http://bugs.python.org/issue7382 + data = super(Binary, self).__getnewargs__()[0] + if PY3 and not isinstance(data, bytes): + data = data.encode('latin-1') + return data, self.__subtype + + def __eq__(self, other): + if isinstance(other, Binary): + return ((self.__subtype, bytes(self)) == + (other.subtype, bytes(other))) + # We don't return NotImplemented here because if we did then + # Binary("foo") == "foo" would return True, since Binary is a + # subclass of str... + return False + + def __hash__(self): + return super(Binary, self).__hash__() ^ hash(self.__subtype) + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "Binary(%s, %s)" % (bytes.__repr__(self), self.__subtype) + + +class UUIDLegacy(Binary): + """UUID wrapper to support working with UUIDs stored as PYTHON_LEGACY. + + .. doctest:: + + >>> import uuid + >>> from bson.binary import Binary, UUIDLegacy, STANDARD + >>> from bson.codec_options import CodecOptions + >>> my_uuid = uuid.uuid4() + >>> coll = db.get_collection('test', + ... CodecOptions(uuid_representation=STANDARD)) + >>> coll.insert_one({'uuid': Binary(my_uuid.bytes, 3)}).inserted_id + ObjectId('...') + >>> coll.count_documents({'uuid': my_uuid}) + 0 + >>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) + 1 + >>> coll.find({'uuid': UUIDLegacy(my_uuid)})[0]['uuid'] + UUID('...') + >>> + >>> # Convert from subtype 3 to subtype 4 + >>> doc = coll.find_one({'uuid': UUIDLegacy(my_uuid)}) + >>> coll.replace_one({"_id": doc["_id"]}, doc).matched_count + 1 + >>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) + 0 + >>> coll.count_documents({'uuid': {'$in': [UUIDLegacy(my_uuid), my_uuid]}}) + 1 + >>> coll.find_one({'uuid': my_uuid})['uuid'] + UUID('...') + + Raises TypeError if `obj` is not an instance of :class:`~uuid.UUID`. + + :Parameters: + - `obj`: An instance of :class:`~uuid.UUID`. + """ + + def __new__(cls, obj): + if not isinstance(obj, UUID): + raise TypeError("obj must be an instance of uuid.UUID") + self = Binary.__new__(cls, obj.bytes, OLD_UUID_SUBTYPE) + self.__uuid = obj + return self + + def __getnewargs__(self): + # Support copy and deepcopy + return (self.__uuid,) + + @property + def uuid(self): + """UUID instance wrapped by this UUIDLegacy instance. + """ + return self.__uuid + + def __repr__(self): + return "UUIDLegacy('%s')" % self.__uuid diff --git a/backend/venv/lib/python3.7/site-packages/bson/code.py b/backend/venv/lib/python3.7/site-packages/bson/code.py new file mode 100644 index 0000000..3f6e504 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/code.py @@ -0,0 +1,99 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing JavaScript code in BSON. +""" + +from bson.py3compat import abc, string_type, PY3, text_type + + +class Code(str): + """BSON's JavaScript code type. + + Raises :class:`TypeError` if `code` is not an instance of + :class:`basestring` (:class:`str` in python 3) or `scope` + is not ``None`` or an instance of :class:`dict`. + + Scope variables can be set by passing a dictionary as the `scope` + argument or by using keyword arguments. If a variable is set as a + keyword argument it will override any setting for that variable in + the `scope` dictionary. + + :Parameters: + - `code`: A string containing JavaScript code to be evaluated or another + instance of Code. In the latter case, the scope of `code` becomes this + Code's :attr:`scope`. + - `scope` (optional): dictionary representing the scope in which + `code` should be evaluated - a mapping from identifiers (as + strings) to values. Defaults to ``None``. This is applied after any + scope associated with a given `code` above. + - `**kwargs` (optional): scope variables can also be passed as + keyword arguments. These are applied after `scope` and `code`. + + .. versionchanged:: 3.4 + The default value for :attr:`scope` is ``None`` instead of ``{}``. + + """ + + _type_marker = 13 + + def __new__(cls, code, scope=None, **kwargs): + if not isinstance(code, string_type): + raise TypeError("code must be an " + "instance of %s" % (string_type.__name__)) + + if not PY3 and isinstance(code, text_type): + self = str.__new__(cls, code.encode('utf8')) + else: + self = str.__new__(cls, code) + + try: + self.__scope = code.scope + except AttributeError: + self.__scope = None + + if scope is not None: + if not isinstance(scope, abc.Mapping): + raise TypeError("scope must be an instance of dict") + if self.__scope is not None: + self.__scope.update(scope) + else: + self.__scope = scope + + if kwargs: + if self.__scope is not None: + self.__scope.update(kwargs) + else: + self.__scope = kwargs + + return self + + @property + def scope(self): + """Scope dictionary for this instance or ``None``. + """ + return self.__scope + + def __repr__(self): + return "Code(%s, %r)" % (str.__repr__(self), self.__scope) + + def __eq__(self, other): + if isinstance(other, Code): + return (self.__scope, str(self)) == (other.__scope, str(other)) + return False + + __hash__ = None + + def __ne__(self, other): + return not self == other diff --git a/backend/venv/lib/python3.7/site-packages/bson/codec_options.py b/backend/venv/lib/python3.7/site-packages/bson/codec_options.py new file mode 100644 index 0000000..471d695 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/codec_options.py @@ -0,0 +1,334 @@ +# Copyright 2014-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for specifying BSON codec options.""" + +import datetime + +from abc import abstractmethod +from collections import namedtuple + +from bson.py3compat import ABC, abc, abstractproperty, string_type + +from bson.binary import (ALL_UUID_REPRESENTATIONS, + PYTHON_LEGACY, + UUID_REPRESENTATION_NAMES) + + +_RAW_BSON_DOCUMENT_MARKER = 101 + + +def _raw_document_class(document_class): + """Determine if a document_class is a RawBSONDocument class.""" + marker = getattr(document_class, '_type_marker', None) + return marker == _RAW_BSON_DOCUMENT_MARKER + + +class TypeEncoder(ABC): + """Base class for defining type codec classes which describe how a + custom type can be transformed to one of the types BSON understands. + + Codec classes must implement the ``python_type`` attribute, and the + ``transform_python`` method to support encoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + @abstractproperty + def python_type(self): + """The Python type to be converted into something serializable.""" + pass + + @abstractmethod + def transform_python(self, value): + """Convert the given Python object into something serializable.""" + pass + + +class TypeDecoder(ABC): + """Base class for defining type codec classes which describe how a + BSON type can be transformed to a custom type. + + Codec classes must implement the ``bson_type`` attribute, and the + ``transform_bson`` method to support decoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + @abstractproperty + def bson_type(self): + """The BSON type to be converted into our own type.""" + pass + + @abstractmethod + def transform_bson(self, value): + """Convert the given BSON value into our own type.""" + pass + + +class TypeCodec(TypeEncoder, TypeDecoder): + """Base class for defining type codec classes which describe how a + custom type can be transformed to/from one of the types :mod:`bson` + can already encode/decode. + + Codec classes must implement the ``python_type`` attribute, and the + ``transform_python`` method to support encoding, as well as the + ``bson_type`` attribute, and the ``transform_bson`` method to support + decoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + pass + + +class TypeRegistry(object): + """Encapsulates type codecs used in encoding and / or decoding BSON, as + well as the fallback encoder. Type registries cannot be modified after + instantiation. + + ``TypeRegistry`` can be initialized with an iterable of type codecs, and + a callable for the fallback encoder:: + + >>> from bson.codec_options import TypeRegistry + >>> type_registry = TypeRegistry([Codec1, Codec2, Codec3, ...], + ... fallback_encoder) + + See :ref:`custom-type-type-registry` documentation for an example. + + :Parameters: + - `type_codecs` (optional): iterable of type codec instances. If + ``type_codecs`` contains multiple codecs that transform a single + python or BSON type, the transformation specified by the type codec + occurring last prevails. A TypeError will be raised if one or more + type codecs modify the encoding behavior of a built-in :mod:`bson` + type. + - `fallback_encoder` (optional): callable that accepts a single, + unencodable python value and transforms it into a type that + :mod:`bson` can encode. See :ref:`fallback-encoder-callable` + documentation for an example. + """ + def __init__(self, type_codecs=None, fallback_encoder=None): + self.__type_codecs = list(type_codecs or []) + self._fallback_encoder = fallback_encoder + self._encoder_map = {} + self._decoder_map = {} + + if self._fallback_encoder is not None: + if not callable(fallback_encoder): + raise TypeError("fallback_encoder %r is not a callable" % ( + fallback_encoder)) + + for codec in self.__type_codecs: + is_valid_codec = False + if isinstance(codec, TypeEncoder): + self._validate_type_encoder(codec) + is_valid_codec = True + self._encoder_map[codec.python_type] = codec.transform_python + if isinstance(codec, TypeDecoder): + is_valid_codec = True + self._decoder_map[codec.bson_type] = codec.transform_bson + if not is_valid_codec: + raise TypeError( + "Expected an instance of %s, %s, or %s, got %r instead" % ( + TypeEncoder.__name__, TypeDecoder.__name__, + TypeCodec.__name__, codec)) + + def _validate_type_encoder(self, codec): + from bson import _BUILT_IN_TYPES + for pytype in _BUILT_IN_TYPES: + if issubclass(codec.python_type, pytype): + err_msg = ("TypeEncoders cannot change how built-in types are " + "encoded (encoder %s transforms type %s)" % + (codec, pytype)) + raise TypeError(err_msg) + + def __repr__(self): + return ('%s(type_codecs=%r, fallback_encoder=%r)' % ( + self.__class__.__name__, self.__type_codecs, + self._fallback_encoder)) + + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + return ((self._decoder_map == other._decoder_map) and + (self._encoder_map == other._encoder_map) and + (self._fallback_encoder == other._fallback_encoder)) + + +_options_base = namedtuple( + 'CodecOptions', + ('document_class', 'tz_aware', 'uuid_representation', + 'unicode_decode_error_handler', 'tzinfo', 'type_registry')) + + +class CodecOptions(_options_base): + """Encapsulates options used encoding and / or decoding BSON. + + The `document_class` option is used to define a custom type for use + decoding BSON documents. Access to the underlying raw BSON bytes for + a document is available using the :class:`~bson.raw_bson.RawBSONDocument` + type:: + + >>> from bson.raw_bson import RawBSONDocument + >>> from bson.codec_options import CodecOptions + >>> codec_options = CodecOptions(document_class=RawBSONDocument) + >>> coll = db.get_collection('test', codec_options=codec_options) + >>> doc = coll.find_one() + >>> doc.raw + '\\x16\\x00\\x00\\x00\\x07_id\\x00[0\\x165\\x91\\x10\\xea\\x14\\xe8\\xc5\\x8b\\x93\\x00' + + The document class can be any type that inherits from + :class:`~collections.MutableMapping`:: + + >>> class AttributeDict(dict): + ... # A dict that supports attribute access. + ... def __getattr__(self, key): + ... return self[key] + ... def __setattr__(self, key, value): + ... self[key] = value + ... + >>> codec_options = CodecOptions(document_class=AttributeDict) + >>> coll = db.get_collection('test', codec_options=codec_options) + >>> doc = coll.find_one() + >>> doc._id + ObjectId('5b3016359110ea14e8c58b93') + + See :doc:`/examples/datetimes` for examples using the `tz_aware` and + `tzinfo` options. + + See :class:`~bson.binary.UUIDLegacy` for examples using the + `uuid_representation` option. + + :Parameters: + - `document_class`: BSON documents returned in queries will be decoded + to an instance of this class. Must be a subclass of + :class:`~collections.MutableMapping`. Defaults to :class:`dict`. + - `tz_aware`: If ``True``, BSON datetimes will be decoded to timezone + aware instances of :class:`~datetime.datetime`. Otherwise they will be + naive. Defaults to ``False``. + - `uuid_representation`: The BSON representation to use when encoding + and decoding instances of :class:`~uuid.UUID`. Defaults to + :data:`~bson.binary.PYTHON_LEGACY`. + - `unicode_decode_error_handler`: The error handler to apply when + a Unicode-related error occurs during BSON decoding that would + otherwise raise :exc:`UnicodeDecodeError`. Valid options include + 'strict', 'replace', and 'ignore'. Defaults to 'strict'. + - `tzinfo`: A :class:`~datetime.tzinfo` subclass that specifies the + timezone to/from which :class:`~datetime.datetime` objects should be + encoded/decoded. + - `type_registry`: Instance of :class:`TypeRegistry` used to customize + encoding and decoding behavior. + + .. versionadded:: 3.8 + `type_registry` attribute. + + .. warning:: Care must be taken when changing + `unicode_decode_error_handler` from its default value ('strict'). + The 'replace' and 'ignore' modes should not be used when documents + retrieved from the server will be modified in the client application + and stored back to the server. + """ + + def __new__(cls, document_class=dict, + tz_aware=False, uuid_representation=PYTHON_LEGACY, + unicode_decode_error_handler="strict", + tzinfo=None, type_registry=None): + if not (issubclass(document_class, abc.MutableMapping) or + _raw_document_class(document_class)): + raise TypeError("document_class must be dict, bson.son.SON, " + "bson.raw_bson.RawBSONDocument, or a " + "sublass of collections.MutableMapping") + if not isinstance(tz_aware, bool): + raise TypeError("tz_aware must be True or False") + if uuid_representation not in ALL_UUID_REPRESENTATIONS: + raise ValueError("uuid_representation must be a value " + "from bson.binary.ALL_UUID_REPRESENTATIONS") + if not isinstance(unicode_decode_error_handler, (string_type, None)): + raise ValueError("unicode_decode_error_handler must be a string " + "or None") + if tzinfo is not None: + if not isinstance(tzinfo, datetime.tzinfo): + raise TypeError( + "tzinfo must be an instance of datetime.tzinfo") + if not tz_aware: + raise ValueError( + "cannot specify tzinfo without also setting tz_aware=True") + + type_registry = type_registry or TypeRegistry() + + if not isinstance(type_registry, TypeRegistry): + raise TypeError("type_registry must be an instance of TypeRegistry") + + return tuple.__new__( + cls, (document_class, tz_aware, uuid_representation, + unicode_decode_error_handler, tzinfo, type_registry)) + + def _arguments_repr(self): + """Representation of the arguments used to create this object.""" + document_class_repr = ( + 'dict' if self.document_class is dict + else repr(self.document_class)) + + uuid_rep_repr = UUID_REPRESENTATION_NAMES.get(self.uuid_representation, + self.uuid_representation) + + return ('document_class=%s, tz_aware=%r, uuid_representation=%s, ' + 'unicode_decode_error_handler=%r, tzinfo=%r, ' + 'type_registry=%r' % + (document_class_repr, self.tz_aware, uuid_rep_repr, + self.unicode_decode_error_handler, self.tzinfo, + self.type_registry)) + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, self._arguments_repr()) + + def with_options(self, **kwargs): + """Make a copy of this CodecOptions, overriding some options:: + + >>> from bson.codec_options import DEFAULT_CODEC_OPTIONS + >>> DEFAULT_CODEC_OPTIONS.tz_aware + False + >>> options = DEFAULT_CODEC_OPTIONS.with_options(tz_aware=True) + >>> options.tz_aware + True + + .. versionadded:: 3.5 + """ + return CodecOptions( + kwargs.get('document_class', self.document_class), + kwargs.get('tz_aware', self.tz_aware), + kwargs.get('uuid_representation', self.uuid_representation), + kwargs.get('unicode_decode_error_handler', + self.unicode_decode_error_handler), + kwargs.get('tzinfo', self.tzinfo), + kwargs.get('type_registry', self.type_registry) + ) + + +DEFAULT_CODEC_OPTIONS = CodecOptions() + + +def _parse_codec_options(options): + """Parse BSON codec options.""" + return CodecOptions( + document_class=options.get( + 'document_class', DEFAULT_CODEC_OPTIONS.document_class), + tz_aware=options.get( + 'tz_aware', DEFAULT_CODEC_OPTIONS.tz_aware), + uuid_representation=options.get( + 'uuidrepresentation', DEFAULT_CODEC_OPTIONS.uuid_representation), + unicode_decode_error_handler=options.get( + 'unicode_decode_error_handler', + DEFAULT_CODEC_OPTIONS.unicode_decode_error_handler), + tzinfo=options.get('tzinfo', DEFAULT_CODEC_OPTIONS.tzinfo), + type_registry=options.get( + 'type_registry', DEFAULT_CODEC_OPTIONS.type_registry)) diff --git a/backend/venv/lib/python3.7/site-packages/bson/dbref.py b/backend/venv/lib/python3.7/site-packages/bson/dbref.py new file mode 100644 index 0000000..3ec5463 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/dbref.py @@ -0,0 +1,135 @@ +# Copyright 2009-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for manipulating DBRefs (references to MongoDB documents).""" + +from copy import deepcopy + +from bson.py3compat import iteritems, string_type +from bson.son import SON + + +class DBRef(object): + """A reference to a document stored in MongoDB. + """ + + # DBRef isn't actually a BSON "type" so this number was arbitrarily chosen. + _type_marker = 100 + + def __init__(self, collection, id, database=None, _extra={}, **kwargs): + """Initialize a new :class:`DBRef`. + + Raises :class:`TypeError` if `collection` or `database` is not + an instance of :class:`basestring` (:class:`str` in python 3). + `database` is optional and allows references to documents to work + across databases. Any additional keyword arguments will create + additional fields in the resultant embedded document. + + :Parameters: + - `collection`: name of the collection the document is stored in + - `id`: the value of the document's ``"_id"`` field + - `database` (optional): name of the database to reference + - `**kwargs` (optional): additional keyword arguments will + create additional, custom fields + + .. mongodoc:: dbrefs + """ + if not isinstance(collection, string_type): + raise TypeError("collection must be an " + "instance of %s" % string_type.__name__) + if database is not None and not isinstance(database, string_type): + raise TypeError("database must be an " + "instance of %s" % string_type.__name__) + + self.__collection = collection + self.__id = id + self.__database = database + kwargs.update(_extra) + self.__kwargs = kwargs + + @property + def collection(self): + """Get the name of this DBRef's collection as unicode. + """ + return self.__collection + + @property + def id(self): + """Get this DBRef's _id. + """ + return self.__id + + @property + def database(self): + """Get the name of this DBRef's database. + + Returns None if this DBRef doesn't specify a database. + """ + return self.__database + + def __getattr__(self, key): + try: + return self.__kwargs[key] + except KeyError: + raise AttributeError(key) + + # Have to provide __setstate__ to avoid + # infinite recursion since we override + # __getattr__. + def __setstate__(self, state): + self.__dict__.update(state) + + def as_doc(self): + """Get the SON document representation of this DBRef. + + Generally not needed by application developers + """ + doc = SON([("$ref", self.collection), + ("$id", self.id)]) + if self.database is not None: + doc["$db"] = self.database + doc.update(self.__kwargs) + return doc + + def __repr__(self): + extra = "".join([", %s=%r" % (k, v) + for k, v in iteritems(self.__kwargs)]) + if self.database is None: + return "DBRef(%r, %r%s)" % (self.collection, self.id, extra) + return "DBRef(%r, %r, %r%s)" % (self.collection, self.id, + self.database, extra) + + def __eq__(self, other): + if isinstance(other, DBRef): + us = (self.__database, self.__collection, + self.__id, self.__kwargs) + them = (other.__database, other.__collection, + other.__id, other.__kwargs) + return us == them + return NotImplemented + + def __ne__(self, other): + return not self == other + + def __hash__(self): + """Get a hash value for this :class:`DBRef`.""" + return hash((self.__collection, self.__id, self.__database, + tuple(sorted(self.__kwargs.items())))) + + def __deepcopy__(self, memo): + """Support function for `copy.deepcopy()`.""" + return DBRef(deepcopy(self.__collection, memo), + deepcopy(self.__id, memo), + deepcopy(self.__database, memo), + deepcopy(self.__kwargs, memo)) diff --git a/backend/venv/lib/python3.7/site-packages/bson/decimal128.py b/backend/venv/lib/python3.7/site-packages/bson/decimal128.py new file mode 100644 index 0000000..0c0fc10 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/decimal128.py @@ -0,0 +1,335 @@ +# Copyright 2016-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for working with the BSON decimal128 type. + +.. versionadded:: 3.4 + +.. note:: The Decimal128 BSON type requires MongoDB 3.4+. +""" + +import decimal +import struct +import sys + +from bson.py3compat import (PY3 as _PY3, + string_type as _string_type) + + +if _PY3: + _from_bytes = int.from_bytes # pylint: disable=no-member, invalid-name +else: + import binascii + def _from_bytes(value, dummy, _int=int, _hexlify=binascii.hexlify): + "An implementation of int.from_bytes for python 2.x." + return _int(_hexlify(value), 16) + + +_PACK_64 = struct.Struct("= 3.3, cdecimal + decimal.Context(clamp=1) # pylint: disable=unexpected-keyword-arg + _CTX_OPTIONS['clamp'] = 1 +except TypeError: + # Python < 3.3 + _CTX_OPTIONS['_clamp'] = 1 + +_DEC128_CTX = decimal.Context(**_CTX_OPTIONS.copy()) + + +def create_decimal128_context(): + """Returns an instance of :class:`decimal.Context` appropriate + for working with IEEE-754 128-bit decimal floating point values. + """ + opts = _CTX_OPTIONS.copy() + opts['traps'] = [] + return decimal.Context(**opts) + + +def _decimal_to_128(value): + """Converts a decimal.Decimal to BID (high bits, low bits). + + :Parameters: + - `value`: An instance of decimal.Decimal + """ + with decimal.localcontext(_DEC128_CTX) as ctx: + value = ctx.create_decimal(value) + + if value.is_infinite(): + return _NINF if value.is_signed() else _PINF + + sign, digits, exponent = value.as_tuple() + + if value.is_nan(): + if digits: + raise ValueError("NaN with debug payload is not supported") + if value.is_snan(): + return _NSNAN if value.is_signed() else _PSNAN + return _NNAN if value.is_signed() else _PNAN + + significand = int("".join([str(digit) for digit in digits])) + bit_length = significand.bit_length() + + high = 0 + low = 0 + for i in range(min(64, bit_length)): + if significand & (1 << i): + low |= 1 << i + + for i in range(64, bit_length): + if significand & (1 << i): + high |= 1 << (i - 64) + + biased_exponent = exponent + _EXPONENT_BIAS + + if high >> 49 == 1: + high = high & 0x7fffffffffff + high |= _EXPONENT_MASK + high |= (biased_exponent & 0x3fff) << 47 + else: + high |= biased_exponent << 49 + + if sign: + high |= _SIGN + + return high, low + + +class Decimal128(object): + """BSON Decimal128 type:: + + >>> Decimal128(Decimal("0.0005")) + Decimal128('0.0005') + >>> Decimal128("0.0005") + Decimal128('0.0005') + >>> Decimal128((3474527112516337664, 5)) + Decimal128('0.0005') + + :Parameters: + - `value`: An instance of :class:`decimal.Decimal`, string, or tuple of + (high bits, low bits) from Binary Integer Decimal (BID) format. + + .. note:: :class:`~Decimal128` uses an instance of :class:`decimal.Context` + configured for IEEE-754 Decimal128 when validating parameters. + Signals like :class:`decimal.InvalidOperation`, :class:`decimal.Inexact`, + and :class:`decimal.Overflow` are trapped and raised as exceptions:: + + >>> Decimal128(".13.1") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.InvalidOperation: [] + >>> + >>> Decimal128("1E-6177") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.Inexact: [] + >>> + >>> Decimal128("1E6145") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.Overflow: [, ] + + To ensure the result of a calculation can always be stored as BSON + Decimal128 use the context returned by + :func:`create_decimal128_context`:: + + >>> import decimal + >>> decimal128_ctx = create_decimal128_context() + >>> with decimal.localcontext(decimal128_ctx) as ctx: + ... Decimal128(ctx.create_decimal(".13.3")) + ... + Decimal128('NaN') + >>> + >>> with decimal.localcontext(decimal128_ctx) as ctx: + ... Decimal128(ctx.create_decimal("1E-6177")) + ... + Decimal128('0E-6176') + >>> + >>> with decimal.localcontext(DECIMAL128_CTX) as ctx: + ... Decimal128(ctx.create_decimal("1E6145")) + ... + Decimal128('Infinity') + + To match the behavior of MongoDB's Decimal128 implementation + str(Decimal(value)) may not match str(Decimal128(value)) for NaN values:: + + >>> Decimal128(Decimal('NaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('-NaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('sNaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('-sNaN')) + Decimal128('NaN') + + However, :meth:`~Decimal128.to_decimal` will return the exact value:: + + >>> Decimal128(Decimal('NaN')).to_decimal() + Decimal('NaN') + >>> Decimal128(Decimal('-NaN')).to_decimal() + Decimal('-NaN') + >>> Decimal128(Decimal('sNaN')).to_decimal() + Decimal('sNaN') + >>> Decimal128(Decimal('-sNaN')).to_decimal() + Decimal('-sNaN') + + Two instances of :class:`Decimal128` compare equal if their Binary + Integer Decimal encodings are equal:: + + >>> Decimal128('NaN') == Decimal128('NaN') + True + >>> Decimal128('NaN').bid == Decimal128('NaN').bid + True + + This differs from :class:`decimal.Decimal` comparisons for NaN:: + + >>> Decimal('NaN') == Decimal('NaN') + False + """ + __slots__ = ('__high', '__low') + + _type_marker = 19 + + def __init__(self, value): + if isinstance(value, (_string_type, decimal.Decimal)): + self.__high, self.__low = _decimal_to_128(value) + elif isinstance(value, (list, tuple)): + if len(value) != 2: + raise ValueError('Invalid size for creation of Decimal128 ' + 'from list or tuple. Must have exactly 2 ' + 'elements.') + self.__high, self.__low = value + else: + raise TypeError("Cannot convert %r to Decimal128" % (value,)) + + def to_decimal(self): + """Returns an instance of :class:`decimal.Decimal` for this + :class:`Decimal128`. + """ + high = self.__high + low = self.__low + sign = 1 if (high & _SIGN) else 0 + + if (high & _SNAN) == _SNAN: + return decimal.Decimal((sign, (), 'N')) + elif (high & _NAN) == _NAN: + return decimal.Decimal((sign, (), 'n')) + elif (high & _INF) == _INF: + return decimal.Decimal((sign, (), 'F')) + + if (high & _EXPONENT_MASK) == _EXPONENT_MASK: + exponent = ((high & 0x1fffe00000000000) >> 47) - _EXPONENT_BIAS + return decimal.Decimal((sign, (0,), exponent)) + else: + exponent = ((high & 0x7fff800000000000) >> 49) - _EXPONENT_BIAS + + arr = bytearray(15) + mask = 0x00000000000000ff + for i in range(14, 6, -1): + arr[i] = (low & mask) >> ((14 - i) << 3) + mask = mask << 8 + + mask = 0x00000000000000ff + for i in range(6, 0, -1): + arr[i] = (high & mask) >> ((6 - i) << 3) + mask = mask << 8 + + mask = 0x0001000000000000 + arr[0] = (high & mask) >> 48 + + # cdecimal only accepts a tuple for digits. + digits = tuple( + int(digit) for digit in str(_from_bytes(arr, 'big'))) + + with decimal.localcontext(_DEC128_CTX) as ctx: + return ctx.create_decimal((sign, digits, exponent)) + + @classmethod + def from_bid(cls, value): + """Create an instance of :class:`Decimal128` from Binary Integer + Decimal string. + + :Parameters: + - `value`: 16 byte string (128-bit IEEE 754-2008 decimal floating + point in Binary Integer Decimal (BID) format). + """ + if not isinstance(value, bytes): + raise TypeError("value must be an instance of bytes") + if len(value) != 16: + raise ValueError("value must be exactly 16 bytes") + return cls((_UNPACK_64(value[8:])[0], _UNPACK_64(value[:8])[0])) + + @property + def bid(self): + """The Binary Integer Decimal (BID) encoding of this instance.""" + return _PACK_64(self.__low) + _PACK_64(self.__high) + + def __str__(self): + dec = self.to_decimal() + if dec.is_nan(): + # Required by the drivers spec to match MongoDB behavior. + return "NaN" + return str(dec) + + def __repr__(self): + return "Decimal128('%s')" % (str(self),) + + def __setstate__(self, value): + self.__high, self.__low = value + + def __getstate__(self): + return self.__high, self.__low + + def __eq__(self, other): + if isinstance(other, Decimal128): + return self.bid == other.bid + return NotImplemented + + def __ne__(self, other): + return not self == other diff --git a/backend/venv/lib/python3.7/site-packages/bson/errors.py b/backend/venv/lib/python3.7/site-packages/bson/errors.py new file mode 100644 index 0000000..9bdb741 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/errors.py @@ -0,0 +1,40 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Exceptions raised by the BSON package.""" + + +class BSONError(Exception): + """Base class for all BSON exceptions. + """ + + +class InvalidBSON(BSONError): + """Raised when trying to create a BSON object from invalid data. + """ + + +class InvalidStringData(BSONError): + """Raised when trying to encode a string containing non-UTF8 data. + """ + + +class InvalidDocument(BSONError): + """Raised when trying to create a BSON object from an invalid document. + """ + + +class InvalidId(BSONError): + """Raised when trying to create an ObjectId from invalid data. + """ diff --git a/backend/venv/lib/python3.7/site-packages/bson/int64.py b/backend/venv/lib/python3.7/site-packages/bson/int64.py new file mode 100644 index 0000000..77e9812 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/int64.py @@ -0,0 +1,34 @@ +# Copyright 2014-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A BSON wrapper for long (int in python3)""" + +from bson.py3compat import PY3 + +if PY3: + long = int + + +class Int64(long): + """Representation of the BSON int64 type. + + This is necessary because every integral number is an :class:`int` in + Python 3. Small integral numbers are encoded to BSON int32 by default, + but Int64 numbers will always be encoded to BSON int64. + + :Parameters: + - `value`: the numeric value to represent + """ + + _type_marker = 18 diff --git a/backend/venv/lib/python3.7/site-packages/bson/json_util.py b/backend/venv/lib/python3.7/site-packages/bson/json_util.py new file mode 100644 index 0000000..871f711 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/json_util.py @@ -0,0 +1,829 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for using Python's :mod:`json` module with BSON documents. + +This module provides two helper methods `dumps` and `loads` that wrap the +native :mod:`json` methods and provide explicit BSON conversion to and from +JSON. :class:`~bson.json_util.JSONOptions` provides a way to control how JSON +is emitted and parsed, with the default being the legacy PyMongo format. +:mod:`~bson.json_util` can also generate Canonical or Relaxed `Extended JSON`_ +when :const:`CANONICAL_JSON_OPTIONS` or :const:`RELAXED_JSON_OPTIONS` is +provided, respectively. + +.. _Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst + +Example usage (deserialization): + +.. doctest:: + + >>> from bson.json_util import loads + >>> loads('[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$scope": {}, "$code": "function x() { return 1; }"}}, {"bin": {"$type": "80", "$binary": "AQIDBA=="}}]') + [{u'foo': [1, 2]}, {u'bar': {u'hello': u'world'}}, {u'code': Code('function x() { return 1; }', {})}, {u'bin': Binary('...', 128)}] + +Example usage (serialization): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }", {})}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}]) + '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]' + +Example usage (with :const:`CANONICAL_JSON_OPTIONS`): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps, CANONICAL_JSON_OPTIONS + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }")}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}], + ... json_options=CANONICAL_JSON_OPTIONS) + '[{"foo": [{"$numberInt": "1"}, {"$numberInt": "2"}]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]' + +Example usage (with :const:`RELAXED_JSON_OPTIONS`): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps, RELAXED_JSON_OPTIONS + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }")}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}], + ... json_options=RELAXED_JSON_OPTIONS) + '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]' + +Alternatively, you can manually pass the `default` to :func:`json.dumps`. +It won't handle :class:`~bson.binary.Binary` and :class:`~bson.code.Code` +instances (as they are extended strings you can't provide custom defaults), +but it will be faster as there is less recursion. + +.. note:: + If your application does not need the flexibility offered by + :class:`JSONOptions` and spends a large amount of time in the `json_util` + module, look to + `python-bsonjs `_ for a nice + performance improvement. `python-bsonjs` is a fast BSON to MongoDB + Extended JSON converter for Python built on top of + `libbson `_. `python-bsonjs` works best + with PyMongo when using :class:`~bson.raw_bson.RawBSONDocument`. + +.. versionchanged:: 2.8 + The output format for :class:`~bson.timestamp.Timestamp` has changed from + '{"t": , "i": }' to '{"$timestamp": {"t": , "i": }}'. + This new format will be decoded to an instance of + :class:`~bson.timestamp.Timestamp`. The old format will continue to be + decoded to a python dict as before. Encoding to the old format is no longer + supported as it was never correct and loses type information. + Added support for $numberLong and $undefined - new in MongoDB 2.6 - and + parsing $date in ISO-8601 format. + +.. versionchanged:: 2.7 + Preserves order when rendering SON, Timestamp, Code, Binary, and DBRef + instances. + +.. versionchanged:: 2.3 + Added dumps and loads helpers to automatically handle conversion to and + from json and supports :class:`~bson.binary.Binary` and + :class:`~bson.code.Code` +""" + +import base64 +import datetime +import json +import math +import re +import sys +import uuid + +from pymongo.errors import ConfigurationError + +import bson +from bson import EPOCH_AWARE, EPOCH_NAIVE, RE_TYPE, SON +from bson.binary import (Binary, JAVA_LEGACY, CSHARP_LEGACY, OLD_UUID_SUBTYPE, + UUID_SUBTYPE) +from bson.code import Code +from bson.codec_options import CodecOptions +from bson.dbref import DBRef +from bson.decimal128 import Decimal128 +from bson.int64 import Int64 +from bson.max_key import MaxKey +from bson.min_key import MinKey +from bson.objectid import ObjectId +from bson.py3compat import (PY3, iteritems, integer_types, string_type, + text_type) +from bson.regex import Regex +from bson.timestamp import Timestamp +from bson.tz_util import utc + + +_RE_OPT_TABLE = { + "i": re.I, + "l": re.L, + "m": re.M, + "s": re.S, + "u": re.U, + "x": re.X, +} + +# Dollar-prefixed keys which may appear in DBRefs. +_DBREF_KEYS = frozenset(['$id', '$ref', '$db']) + + +class DatetimeRepresentation: + LEGACY = 0 + """Legacy MongoDB Extended JSON datetime representation. + + :class:`datetime.datetime` instances will be encoded to JSON in the + format `{"$date": }`, where `dateAsMilliseconds` is + a 64-bit signed integer giving the number of milliseconds since the Unix + epoch UTC. This was the default encoding before PyMongo version 3.4. + + .. versionadded:: 3.4 + """ + + NUMBERLONG = 1 + """NumberLong datetime representation. + + :class:`datetime.datetime` instances will be encoded to JSON in the + format `{"$date": {"$numberLong": ""}}`, + where `dateAsMilliseconds` is the string representation of a 64-bit signed + integer giving the number of milliseconds since the Unix epoch UTC. + + .. versionadded:: 3.4 + """ + + ISO8601 = 2 + """ISO-8601 datetime representation. + + :class:`datetime.datetime` instances greater than or equal to the Unix + epoch UTC will be encoded to JSON in the format `{"$date": ""}`. + :class:`datetime.datetime` instances before the Unix epoch UTC will be + encoded as if the datetime representation is + :const:`~DatetimeRepresentation.NUMBERLONG`. + + .. versionadded:: 3.4 + """ + + +class JSONMode: + LEGACY = 0 + """Legacy Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces PyMongo's legacy + non-standard JSON output. Consider using + :const:`~bson.json_util.JSONMode.RELAXED` or + :const:`~bson.json_util.JSONMode.CANONICAL` instead. + + .. versionadded:: 3.5 + """ + + RELAXED = 1 + """Relaxed Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces Relaxed Extended JSON, + a mostly JSON-like format. Consider using this for things like a web API, + where one is sending a document (or a projection of a document) that only + uses ordinary JSON type primitives. In particular, the ``int``, + :class:`~bson.int64.Int64`, and ``float`` numeric types are represented in + the native JSON number format. This output is also the most human readable + and is useful for debugging and documentation. + + .. seealso:: The specification for Relaxed `Extended JSON`_. + + .. versionadded:: 3.5 + """ + + CANONICAL = 2 + """Canonical Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces Canonical Extended + JSON, a type preserving format. Consider using this for things like + testing, where one has to precisely specify expected types in JSON. In + particular, the ``int``, :class:`~bson.int64.Int64`, and ``float`` numeric + types are encoded with type wrappers. + + .. seealso:: The specification for Canonical `Extended JSON`_. + + .. versionadded:: 3.5 + """ + + +class JSONOptions(CodecOptions): + """Encapsulates JSON options for :func:`dumps` and :func:`loads`. + + :Parameters: + - `strict_number_long`: If ``True``, :class:`~bson.int64.Int64` objects + are encoded to MongoDB Extended JSON's *Strict mode* type + `NumberLong`, ie ``'{"$numberLong": "" }'``. Otherwise they + will be encoded as an `int`. Defaults to ``False``. + - `datetime_representation`: The representation to use when encoding + instances of :class:`datetime.datetime`. Defaults to + :const:`~DatetimeRepresentation.LEGACY`. + - `strict_uuid`: If ``True``, :class:`uuid.UUID` object are encoded to + MongoDB Extended JSON's *Strict mode* type `Binary`. Otherwise it + will be encoded as ``'{"$uuid": "" }'``. Defaults to ``False``. + - `json_mode`: The :class:`JSONMode` to use when encoding BSON types to + Extended JSON. Defaults to :const:`~JSONMode.LEGACY`. + - `document_class`: BSON documents returned by :func:`loads` will be + decoded to an instance of this class. Must be a subclass of + :class:`collections.MutableMapping`. Defaults to :class:`dict`. + - `uuid_representation`: The BSON representation to use when encoding + and decoding instances of :class:`uuid.UUID`. Defaults to + :const:`~bson.binary.PYTHON_LEGACY`. + - `tz_aware`: If ``True``, MongoDB Extended JSON's *Strict mode* type + `Date` will be decoded to timezone aware instances of + :class:`datetime.datetime`. Otherwise they will be naive. Defaults + to ``True``. + - `tzinfo`: A :class:`datetime.tzinfo` subclass that specifies the + timezone from which :class:`~datetime.datetime` objects should be + decoded. Defaults to :const:`~bson.tz_util.utc`. + - `args`: arguments to :class:`~bson.codec_options.CodecOptions` + - `kwargs`: arguments to :class:`~bson.codec_options.CodecOptions` + + .. seealso:: The specification for Relaxed and Canonical `Extended JSON`_. + + .. versionadded:: 3.4 + + .. versionchanged:: 3.5 + Accepts the optional parameter `json_mode`. + + """ + + def __new__(cls, strict_number_long=False, + datetime_representation=DatetimeRepresentation.LEGACY, + strict_uuid=False, json_mode=JSONMode.LEGACY, + *args, **kwargs): + kwargs["tz_aware"] = kwargs.get("tz_aware", True) + if kwargs["tz_aware"]: + kwargs["tzinfo"] = kwargs.get("tzinfo", utc) + if datetime_representation not in (DatetimeRepresentation.LEGACY, + DatetimeRepresentation.NUMBERLONG, + DatetimeRepresentation.ISO8601): + raise ConfigurationError( + "JSONOptions.datetime_representation must be one of LEGACY, " + "NUMBERLONG, or ISO8601 from DatetimeRepresentation.") + self = super(JSONOptions, cls).__new__(cls, *args, **kwargs) + if json_mode not in (JSONMode.LEGACY, + JSONMode.RELAXED, + JSONMode.CANONICAL): + raise ConfigurationError( + "JSONOptions.json_mode must be one of LEGACY, RELAXED, " + "or CANONICAL from JSONMode.") + self.json_mode = json_mode + if self.json_mode == JSONMode.RELAXED: + self.strict_number_long = False + self.datetime_representation = DatetimeRepresentation.ISO8601 + self.strict_uuid = True + elif self.json_mode == JSONMode.CANONICAL: + self.strict_number_long = True + self.datetime_representation = DatetimeRepresentation.NUMBERLONG + self.strict_uuid = True + else: + self.strict_number_long = strict_number_long + self.datetime_representation = datetime_representation + self.strict_uuid = strict_uuid + return self + + def _arguments_repr(self): + return ('strict_number_long=%r, ' + 'datetime_representation=%r, ' + 'strict_uuid=%r, json_mode=%r, %s' % ( + self.strict_number_long, + self.datetime_representation, + self.strict_uuid, + self.json_mode, + super(JSONOptions, self)._arguments_repr())) + + +LEGACY_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.LEGACY) +""":class:`JSONOptions` for encoding to PyMongo's legacy JSON format. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.LEGACY`. + +.. versionadded:: 3.5 +""" + +DEFAULT_JSON_OPTIONS = LEGACY_JSON_OPTIONS +"""The default :class:`JSONOptions` for JSON encoding/decoding. + +The same as :const:`LEGACY_JSON_OPTIONS`. This will change to +:const:`RELAXED_JSON_OPTIONS` in a future release. + +.. versionadded:: 3.4 +""" + +CANONICAL_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.CANONICAL) +""":class:`JSONOptions` for Canonical Extended JSON. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.CANONICAL`. + +.. versionadded:: 3.5 +""" + +RELAXED_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.RELAXED) +""":class:`JSONOptions` for Relaxed Extended JSON. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.RELAXED`. + +.. versionadded:: 3.5 +""" + +STRICT_JSON_OPTIONS = JSONOptions( + strict_number_long=True, + datetime_representation=DatetimeRepresentation.ISO8601, + strict_uuid=True) +"""**DEPRECATED** - :class:`JSONOptions` for MongoDB Extended JSON's *Strict +mode* encoding. + +.. versionadded:: 3.4 + +.. versionchanged:: 3.5 + Deprecated. Use :const:`RELAXED_JSON_OPTIONS` or + :const:`CANONICAL_JSON_OPTIONS` instead. +""" + + +def dumps(obj, *args, **kwargs): + """Helper function that wraps :func:`json.dumps`. + + Recursive function that handles all BSON types including + :class:`~bson.binary.Binary` and :class:`~bson.code.Code`. + + :Parameters: + - `json_options`: A :class:`JSONOptions` instance used to modify the + encoding of MongoDB Extended JSON types. Defaults to + :const:`DEFAULT_JSON_OPTIONS`. + + .. versionchanged:: 3.4 + Accepts optional parameter `json_options`. See :class:`JSONOptions`. + + .. versionchanged:: 2.7 + Preserves order when rendering SON, Timestamp, Code, Binary, and DBRef + instances. + """ + json_options = kwargs.pop("json_options", DEFAULT_JSON_OPTIONS) + return json.dumps(_json_convert(obj, json_options), *args, **kwargs) + + +def loads(s, *args, **kwargs): + """Helper function that wraps :func:`json.loads`. + + Automatically passes the object_hook for BSON type conversion. + + Raises ``TypeError``, ``ValueError``, ``KeyError``, or + :exc:`~bson.errors.InvalidId` on invalid MongoDB Extended JSON. + + :Parameters: + - `json_options`: A :class:`JSONOptions` instance used to modify the + decoding of MongoDB Extended JSON types. Defaults to + :const:`DEFAULT_JSON_OPTIONS`. + + .. versionchanged:: 3.5 + Parses Relaxed and Canonical Extended JSON as well as PyMongo's legacy + format. Now raises ``TypeError`` or ``ValueError`` when parsing JSON + type wrappers with values of the wrong type or any extra keys. + + .. versionchanged:: 3.4 + Accepts optional parameter `json_options`. See :class:`JSONOptions`. + """ + json_options = kwargs.pop("json_options", DEFAULT_JSON_OPTIONS) + kwargs["object_pairs_hook"] = lambda pairs: object_pairs_hook( + pairs, json_options) + return json.loads(s, *args, **kwargs) + + +def _json_convert(obj, json_options=DEFAULT_JSON_OPTIONS): + """Recursive helper method that converts BSON types so they can be + converted into json. + """ + if hasattr(obj, 'iteritems') or hasattr(obj, 'items'): # PY3 support + return SON(((k, _json_convert(v, json_options)) + for k, v in iteritems(obj))) + elif hasattr(obj, '__iter__') and not isinstance(obj, (text_type, bytes)): + return list((_json_convert(v, json_options) for v in obj)) + try: + return default(obj, json_options) + except TypeError: + return obj + + +def object_pairs_hook(pairs, json_options=DEFAULT_JSON_OPTIONS): + return object_hook(json_options.document_class(pairs), json_options) + + +def object_hook(dct, json_options=DEFAULT_JSON_OPTIONS): + if "$oid" in dct: + return _parse_canonical_oid(dct) + if "$ref" in dct: + return _parse_canonical_dbref(dct) + if "$date" in dct: + return _parse_canonical_datetime(dct, json_options) + if "$regex" in dct: + return _parse_legacy_regex(dct) + if "$minKey" in dct: + return _parse_canonical_minkey(dct) + if "$maxKey" in dct: + return _parse_canonical_maxkey(dct) + if "$binary" in dct: + if "$type" in dct: + return _parse_legacy_binary(dct, json_options) + else: + return _parse_canonical_binary(dct, json_options) + if "$code" in dct: + return _parse_canonical_code(dct) + if "$uuid" in dct: + return _parse_legacy_uuid(dct) + if "$undefined" in dct: + return None + if "$numberLong" in dct: + return _parse_canonical_int64(dct) + if "$timestamp" in dct: + tsp = dct["$timestamp"] + return Timestamp(tsp["t"], tsp["i"]) + if "$numberDecimal" in dct: + return _parse_canonical_decimal128(dct) + if "$dbPointer" in dct: + return _parse_canonical_dbpointer(dct) + if "$regularExpression" in dct: + return _parse_canonical_regex(dct) + if "$symbol" in dct: + return _parse_canonical_symbol(dct) + if "$numberInt" in dct: + return _parse_canonical_int32(dct) + if "$numberDouble" in dct: + return _parse_canonical_double(dct) + return dct + + +def _parse_legacy_regex(doc): + pattern = doc["$regex"] + # Check if this is the $regex query operator. + if isinstance(pattern, Regex): + return doc + flags = 0 + # PyMongo always adds $options but some other tools may not. + for opt in doc.get("$options", ""): + flags |= _RE_OPT_TABLE.get(opt, 0) + return Regex(pattern, flags) + + +def _parse_legacy_uuid(doc): + """Decode a JSON legacy $uuid to Python UUID.""" + if len(doc) != 1: + raise TypeError('Bad $uuid, extra field(s): %s' % (doc,)) + return uuid.UUID(doc["$uuid"]) + + +def _binary_or_uuid(data, subtype, json_options): + # special handling for UUID + if subtype == OLD_UUID_SUBTYPE: + if json_options.uuid_representation == CSHARP_LEGACY: + return uuid.UUID(bytes_le=data) + if json_options.uuid_representation == JAVA_LEGACY: + data = data[7::-1] + data[:7:-1] + return uuid.UUID(bytes=data) + if subtype == UUID_SUBTYPE: + return uuid.UUID(bytes=data) + if PY3 and subtype == 0: + return data + return Binary(data, subtype) + + +def _parse_legacy_binary(doc, json_options): + if isinstance(doc["$type"], int): + doc["$type"] = "%02x" % doc["$type"] + subtype = int(doc["$type"], 16) + if subtype >= 0xffffff80: # Handle mongoexport values + subtype = int(doc["$type"][6:], 16) + data = base64.b64decode(doc["$binary"].encode()) + return _binary_or_uuid(data, subtype, json_options) + + +def _parse_canonical_binary(doc, json_options): + binary = doc["$binary"] + b64 = binary["base64"] + subtype = binary["subType"] + if not isinstance(b64, string_type): + raise TypeError('$binary base64 must be a string: %s' % (doc,)) + if not isinstance(subtype, string_type) or len(subtype) > 2: + raise TypeError('$binary subType must be a string at most 2 ' + 'characters: %s' % (doc,)) + if len(binary) != 2: + raise TypeError('$binary must include only "base64" and "subType" ' + 'components: %s' % (doc,)) + + data = base64.b64decode(b64.encode()) + return _binary_or_uuid(data, int(subtype, 16), json_options) + + +def _parse_canonical_datetime(doc, json_options): + """Decode a JSON datetime to python datetime.datetime.""" + dtm = doc["$date"] + if len(doc) != 1: + raise TypeError('Bad $date, extra field(s): %s' % (doc,)) + # mongoexport 2.6 and newer + if isinstance(dtm, string_type): + # Parse offset + if dtm[-1] == 'Z': + dt = dtm[:-1] + offset = 'Z' + elif dtm[-3] == ':': + # (+|-)HH:MM + dt = dtm[:-6] + offset = dtm[-6:] + elif dtm[-5] in ('+', '-'): + # (+|-)HHMM + dt = dtm[:-5] + offset = dtm[-5:] + elif dtm[-3] in ('+', '-'): + # (+|-)HH + dt = dtm[:-3] + offset = dtm[-3:] + else: + dt = dtm + offset = '' + + # Parse the optional factional seconds portion. + dot_index = dt.rfind('.') + microsecond = 0 + if dot_index != -1: + microsecond = int(float(dt[dot_index:]) * 1000000) + dt = dt[:dot_index] + + aware = datetime.datetime.strptime( + dt, "%Y-%m-%dT%H:%M:%S").replace(microsecond=microsecond, + tzinfo=utc) + + if offset and offset != 'Z': + if len(offset) == 6: + hours, minutes = offset[1:].split(':') + secs = (int(hours) * 3600 + int(minutes) * 60) + elif len(offset) == 5: + secs = (int(offset[1:3]) * 3600 + int(offset[3:]) * 60) + elif len(offset) == 3: + secs = int(offset[1:3]) * 3600 + if offset[0] == "-": + secs *= -1 + aware = aware - datetime.timedelta(seconds=secs) + + if json_options.tz_aware: + if json_options.tzinfo: + aware = aware.astimezone(json_options.tzinfo) + return aware + else: + return aware.replace(tzinfo=None) + return bson._millis_to_datetime(int(dtm), json_options) + + +def _parse_canonical_oid(doc): + """Decode a JSON ObjectId to bson.objectid.ObjectId.""" + if len(doc) != 1: + raise TypeError('Bad $oid, extra field(s): %s' % (doc,)) + return ObjectId(doc['$oid']) + + +def _parse_canonical_symbol(doc): + """Decode a JSON symbol to Python string.""" + symbol = doc['$symbol'] + if len(doc) != 1: + raise TypeError('Bad $symbol, extra field(s): %s' % (doc,)) + return text_type(symbol) + + +def _parse_canonical_code(doc): + """Decode a JSON code to bson.code.Code.""" + for key in doc: + if key not in ('$code', '$scope'): + raise TypeError('Bad $code, extra field(s): %s' % (doc,)) + return Code(doc['$code'], scope=doc.get('$scope')) + + +def _parse_canonical_regex(doc): + """Decode a JSON regex to bson.regex.Regex.""" + regex = doc['$regularExpression'] + if len(doc) != 1: + raise TypeError('Bad $regularExpression, extra field(s): %s' % (doc,)) + if len(regex) != 2: + raise TypeError('Bad $regularExpression must include only "pattern"' + 'and "options" components: %s' % (doc,)) + return Regex(regex['pattern'], regex['options']) + + +def _parse_canonical_dbref(doc): + """Decode a JSON DBRef to bson.dbref.DBRef.""" + for key in doc: + if key.startswith('$') and key not in _DBREF_KEYS: + # Other keys start with $, so dct cannot be parsed as a DBRef. + return doc + return DBRef(doc.pop('$ref'), doc.pop('$id'), + database=doc.pop('$db', None), **doc) + + +def _parse_canonical_dbpointer(doc): + """Decode a JSON (deprecated) DBPointer to bson.dbref.DBRef.""" + dbref = doc['$dbPointer'] + if len(doc) != 1: + raise TypeError('Bad $dbPointer, extra field(s): %s' % (doc,)) + if isinstance(dbref, DBRef): + dbref_doc = dbref.as_doc() + # DBPointer must not contain $db in its value. + if dbref.database is not None: + raise TypeError( + 'Bad $dbPointer, extra field $db: %s' % (dbref_doc,)) + if not isinstance(dbref.id, ObjectId): + raise TypeError( + 'Bad $dbPointer, $id must be an ObjectId: %s' % (dbref_doc,)) + if len(dbref_doc) != 2: + raise TypeError( + 'Bad $dbPointer, extra field(s) in DBRef: %s' % (dbref_doc,)) + return dbref + else: + raise TypeError('Bad $dbPointer, expected a DBRef: %s' % (doc,)) + + +def _parse_canonical_int32(doc): + """Decode a JSON int32 to python int.""" + i_str = doc['$numberInt'] + if len(doc) != 1: + raise TypeError('Bad $numberInt, extra field(s): %s' % (doc,)) + if not isinstance(i_str, string_type): + raise TypeError('$numberInt must be string: %s' % (doc,)) + return int(i_str) + + +def _parse_canonical_int64(doc): + """Decode a JSON int64 to bson.int64.Int64.""" + l_str = doc['$numberLong'] + if len(doc) != 1: + raise TypeError('Bad $numberLong, extra field(s): %s' % (doc,)) + return Int64(l_str) + + +def _parse_canonical_double(doc): + """Decode a JSON double to python float.""" + d_str = doc['$numberDouble'] + if len(doc) != 1: + raise TypeError('Bad $numberDouble, extra field(s): %s' % (doc,)) + if not isinstance(d_str, string_type): + raise TypeError('$numberDouble must be string: %s' % (doc,)) + return float(d_str) + + +def _parse_canonical_decimal128(doc): + """Decode a JSON decimal128 to bson.decimal128.Decimal128.""" + d_str = doc['$numberDecimal'] + if len(doc) != 1: + raise TypeError('Bad $numberDecimal, extra field(s): %s' % (doc,)) + if not isinstance(d_str, string_type): + raise TypeError('$numberDecimal must be string: %s' % (doc,)) + return Decimal128(d_str) + + +def _parse_canonical_minkey(doc): + """Decode a JSON MinKey to bson.min_key.MinKey.""" + if doc['$minKey'] is not 1: + raise TypeError('$minKey value must be 1: %s' % (doc,)) + if len(doc) != 1: + raise TypeError('Bad $minKey, extra field(s): %s' % (doc,)) + return MinKey() + + +def _parse_canonical_maxkey(doc): + """Decode a JSON MaxKey to bson.max_key.MaxKey.""" + if doc['$maxKey'] is not 1: + raise TypeError('$maxKey value must be 1: %s', (doc,)) + if len(doc) != 1: + raise TypeError('Bad $minKey, extra field(s): %s' % (doc,)) + return MaxKey() + + +def _encode_binary(data, subtype, json_options): + if json_options.json_mode == JSONMode.LEGACY: + return SON([ + ('$binary', base64.b64encode(data).decode()), + ('$type', "%02x" % subtype)]) + return {'$binary': SON([ + ('base64', base64.b64encode(data).decode()), + ('subType', "%02x" % subtype)])} + + +def default(obj, json_options=DEFAULT_JSON_OPTIONS): + # We preserve key order when rendering SON, DBRef, etc. as JSON by + # returning a SON for those types instead of a dict. + if isinstance(obj, ObjectId): + return {"$oid": str(obj)} + if isinstance(obj, DBRef): + return _json_convert(obj.as_doc(), json_options=json_options) + if isinstance(obj, datetime.datetime): + if (json_options.datetime_representation == + DatetimeRepresentation.ISO8601): + if not obj.tzinfo: + obj = obj.replace(tzinfo=utc) + if obj >= EPOCH_AWARE: + off = obj.tzinfo.utcoffset(obj) + if (off.days, off.seconds, off.microseconds) == (0, 0, 0): + tz_string = 'Z' + else: + tz_string = obj.strftime('%z') + millis = int(obj.microsecond / 1000) + fracsecs = ".%03d" % (millis,) if millis else "" + return {"$date": "%s%s%s" % ( + obj.strftime("%Y-%m-%dT%H:%M:%S"), fracsecs, tz_string)} + + millis = bson._datetime_to_millis(obj) + if (json_options.datetime_representation == + DatetimeRepresentation.LEGACY): + return {"$date": millis} + return {"$date": {"$numberLong": str(millis)}} + if json_options.strict_number_long and isinstance(obj, Int64): + return {"$numberLong": str(obj)} + if isinstance(obj, (RE_TYPE, Regex)): + flags = "" + if obj.flags & re.IGNORECASE: + flags += "i" + if obj.flags & re.LOCALE: + flags += "l" + if obj.flags & re.MULTILINE: + flags += "m" + if obj.flags & re.DOTALL: + flags += "s" + if obj.flags & re.UNICODE: + flags += "u" + if obj.flags & re.VERBOSE: + flags += "x" + if isinstance(obj.pattern, text_type): + pattern = obj.pattern + else: + pattern = obj.pattern.decode('utf-8') + if json_options.json_mode == JSONMode.LEGACY: + return SON([("$regex", pattern), ("$options", flags)]) + return {'$regularExpression': SON([("pattern", pattern), + ("options", flags)])} + if isinstance(obj, MinKey): + return {"$minKey": 1} + if isinstance(obj, MaxKey): + return {"$maxKey": 1} + if isinstance(obj, Timestamp): + return {"$timestamp": SON([("t", obj.time), ("i", obj.inc)])} + if isinstance(obj, Code): + if obj.scope is None: + return {'$code': str(obj)} + return SON([ + ('$code', str(obj)), + ('$scope', _json_convert(obj.scope, json_options))]) + if isinstance(obj, Binary): + return _encode_binary(obj, obj.subtype, json_options) + if PY3 and isinstance(obj, bytes): + return _encode_binary(obj, 0, json_options) + if isinstance(obj, uuid.UUID): + if json_options.strict_uuid: + data = obj.bytes + subtype = OLD_UUID_SUBTYPE + if json_options.uuid_representation == CSHARP_LEGACY: + data = obj.bytes_le + elif json_options.uuid_representation == JAVA_LEGACY: + data = data[7::-1] + data[:7:-1] + elif json_options.uuid_representation == UUID_SUBTYPE: + subtype = UUID_SUBTYPE + return _encode_binary(data, subtype, json_options) + else: + return {"$uuid": obj.hex} + if isinstance(obj, Decimal128): + return {"$numberDecimal": str(obj)} + if isinstance(obj, bool): + return obj + if (json_options.json_mode == JSONMode.CANONICAL and + isinstance(obj, integer_types)): + if -2 ** 31 <= obj < 2 ** 31: + return {'$numberInt': text_type(obj)} + return {'$numberLong': text_type(obj)} + if json_options.json_mode != JSONMode.LEGACY and isinstance(obj, float): + if math.isnan(obj): + return {'$numberDouble': 'NaN'} + elif math.isinf(obj): + representation = 'Infinity' if obj > 0 else '-Infinity' + return {'$numberDouble': representation} + elif json_options.json_mode == JSONMode.CANONICAL: + # repr() will return the shortest string guaranteed to produce the + # original value, when float() is called on it. str produces a + # shorter string in Python 2. + return {'$numberDouble': text_type(repr(obj))} + raise TypeError("%r is not JSON serializable" % obj) diff --git a/backend/venv/lib/python3.7/site-packages/bson/max_key.py b/backend/venv/lib/python3.7/site-packages/bson/max_key.py new file mode 100644 index 0000000..7e89dd7 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/max_key.py @@ -0,0 +1,50 @@ +# Copyright 2010-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Representation for the MongoDB internal MaxKey type. +""" + + +class MaxKey(object): + """MongoDB internal MaxKey type. + + .. versionchanged:: 2.7 + ``MaxKey`` now implements comparison operators. + """ + + _type_marker = 127 + + def __eq__(self, other): + return isinstance(other, MaxKey) + + def __hash__(self): + return hash(self._type_marker) + + def __ne__(self, other): + return not self == other + + def __le__(self, other): + return isinstance(other, MaxKey) + + def __lt__(self, dummy): + return False + + def __ge__(self, dummy): + return True + + def __gt__(self, other): + return not isinstance(other, MaxKey) + + def __repr__(self): + return "MaxKey()" diff --git a/backend/venv/lib/python3.7/site-packages/bson/min_key.py b/backend/venv/lib/python3.7/site-packages/bson/min_key.py new file mode 100644 index 0000000..b03520e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/min_key.py @@ -0,0 +1,50 @@ +# Copyright 2010-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Representation for the MongoDB internal MinKey type. +""" + + +class MinKey(object): + """MongoDB internal MinKey type. + + .. versionchanged:: 2.7 + ``MinKey`` now implements comparison operators. + """ + + _type_marker = 255 + + def __eq__(self, other): + return isinstance(other, MinKey) + + def __hash__(self): + return hash(self._type_marker) + + def __ne__(self, other): + return not self == other + + def __le__(self, dummy): + return True + + def __lt__(self, other): + return not isinstance(other, MinKey) + + def __ge__(self, other): + return isinstance(other, MinKey) + + def __gt__(self, dummy): + return False + + def __repr__(self): + return "MinKey()" diff --git a/backend/venv/lib/python3.7/site-packages/bson/objectid.py b/backend/venv/lib/python3.7/site-packages/bson/objectid.py new file mode 100644 index 0000000..8b7ad8e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/objectid.py @@ -0,0 +1,299 @@ +# Copyright 2009-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for working with MongoDB `ObjectIds +`_. +""" + +import binascii +import calendar +import datetime +import os +import struct +import threading +import time + +from random import SystemRandom + +from bson.errors import InvalidId +from bson.py3compat import PY3, bytes_from_hex, string_type, text_type +from bson.tz_util import utc + + +_MAX_COUNTER_VALUE = 0xFFFFFF + + +def _raise_invalid_id(oid): + raise InvalidId( + "%r is not a valid ObjectId, it must be a 12-byte input" + " or a 24-character hex string" % oid) + + +def _random_bytes(): + """Get the 5-byte random field of an ObjectId.""" + return struct.pack(">Q", SystemRandom().randint(0, 0xFFFFFFFFFF))[3:] + + +class ObjectId(object): + """A MongoDB ObjectId. + """ + + _pid = os.getpid() + + _inc = SystemRandom().randint(0, _MAX_COUNTER_VALUE) + _inc_lock = threading.Lock() + + __random = _random_bytes() + + __slots__ = ('__id',) + + _type_marker = 7 + + def __init__(self, oid=None): + """Initialize a new ObjectId. + + An ObjectId is a 12-byte unique identifier consisting of: + + - a 4-byte value representing the seconds since the Unix epoch, + - a 5-byte random value, + - a 3-byte counter, starting with a random value. + + By default, ``ObjectId()`` creates a new unique identifier. The + optional parameter `oid` can be an :class:`ObjectId`, or any 12 + :class:`bytes` or, in Python 2, any 12-character :class:`str`. + + For example, the 12 bytes b'foo-bar-quux' do not follow the ObjectId + specification but they are acceptable input:: + + >>> ObjectId(b'foo-bar-quux') + ObjectId('666f6f2d6261722d71757578') + + `oid` can also be a :class:`unicode` or :class:`str` of 24 hex digits:: + + >>> ObjectId('0123456789ab0123456789ab') + ObjectId('0123456789ab0123456789ab') + >>> + >>> # A u-prefixed unicode literal: + >>> ObjectId(u'0123456789ab0123456789ab') + ObjectId('0123456789ab0123456789ab') + + Raises :class:`~bson.errors.InvalidId` if `oid` is not 12 bytes nor + 24 hex digits, or :class:`TypeError` if `oid` is not an accepted type. + + :Parameters: + - `oid` (optional): a valid ObjectId. + + .. mongodoc:: objectids + + .. versionchanged:: 3.8 + :class:`~bson.objectid.ObjectId` now implements the `ObjectID + specification version 0.2 + `_. + """ + if oid is None: + self.__generate() + elif isinstance(oid, bytes) and len(oid) == 12: + self.__id = oid + else: + self.__validate(oid) + + @classmethod + def from_datetime(cls, generation_time): + """Create a dummy ObjectId instance with a specific generation time. + + This method is useful for doing range queries on a field + containing :class:`ObjectId` instances. + + .. warning:: + It is not safe to insert a document containing an ObjectId + generated using this method. This method deliberately + eliminates the uniqueness guarantee that ObjectIds + generally provide. ObjectIds generated with this method + should be used exclusively in queries. + + `generation_time` will be converted to UTC. Naive datetime + instances will be treated as though they already contain UTC. + + An example using this helper to get documents where ``"_id"`` + was generated before January 1, 2010 would be: + + >>> gen_time = datetime.datetime(2010, 1, 1) + >>> dummy_id = ObjectId.from_datetime(gen_time) + >>> result = collection.find({"_id": {"$lt": dummy_id}}) + + :Parameters: + - `generation_time`: :class:`~datetime.datetime` to be used + as the generation time for the resulting ObjectId. + """ + if generation_time.utcoffset() is not None: + generation_time = generation_time - generation_time.utcoffset() + timestamp = calendar.timegm(generation_time.timetuple()) + oid = struct.pack( + ">I", int(timestamp)) + b"\x00\x00\x00\x00\x00\x00\x00\x00" + return cls(oid) + + @classmethod + def is_valid(cls, oid): + """Checks if a `oid` string is valid or not. + + :Parameters: + - `oid`: the object id to validate + + .. versionadded:: 2.3 + """ + if not oid: + return False + + try: + ObjectId(oid) + return True + except (InvalidId, TypeError): + return False + + @classmethod + def _random(cls): + """Generate a 5-byte random number once per process. + """ + pid = os.getpid() + if pid != cls._pid: + cls._pid = pid + cls.__random = _random_bytes() + return cls.__random + + def __generate(self): + """Generate a new value for this ObjectId. + """ + + # 4 bytes current time + oid = struct.pack(">I", int(time.time())) + + # 5 bytes random + oid += ObjectId._random() + + # 3 bytes inc + with ObjectId._inc_lock: + oid += struct.pack(">I", ObjectId._inc)[1:4] + ObjectId._inc = (ObjectId._inc + 1) % (_MAX_COUNTER_VALUE + 1) + + self.__id = oid + + def __validate(self, oid): + """Validate and use the given id for this ObjectId. + + Raises TypeError if id is not an instance of + (:class:`basestring` (:class:`str` or :class:`bytes` + in python 3), ObjectId) and InvalidId if it is not a + valid ObjectId. + + :Parameters: + - `oid`: a valid ObjectId + """ + if isinstance(oid, ObjectId): + self.__id = oid.binary + # bytes or unicode in python 2, str in python 3 + elif isinstance(oid, string_type): + if len(oid) == 24: + try: + self.__id = bytes_from_hex(oid) + except (TypeError, ValueError): + _raise_invalid_id(oid) + else: + _raise_invalid_id(oid) + else: + raise TypeError("id must be an instance of (bytes, %s, ObjectId), " + "not %s" % (text_type.__name__, type(oid))) + + @property + def binary(self): + """12-byte binary representation of this ObjectId. + """ + return self.__id + + @property + def generation_time(self): + """A :class:`datetime.datetime` instance representing the time of + generation for this :class:`ObjectId`. + + The :class:`datetime.datetime` is timezone aware, and + represents the generation time in UTC. It is precise to the + second. + """ + timestamp = struct.unpack(">I", self.__id[0:4])[0] + return datetime.datetime.fromtimestamp(timestamp, utc) + + def __getstate__(self): + """return value of object for pickling. + needed explicitly because __slots__() defined. + """ + return self.__id + + def __setstate__(self, value): + """explicit state set from pickling + """ + # Provide backwards compatability with OIDs + # pickled with pymongo-1.9 or older. + if isinstance(value, dict): + oid = value["_ObjectId__id"] + else: + oid = value + # ObjectIds pickled in python 2.x used `str` for __id. + # In python 3.x this has to be converted to `bytes` + # by encoding latin-1. + if PY3 and isinstance(oid, text_type): + self.__id = oid.encode('latin-1') + else: + self.__id = oid + + def __str__(self): + if PY3: + return binascii.hexlify(self.__id).decode() + return binascii.hexlify(self.__id) + + def __repr__(self): + return "ObjectId('%s')" % (str(self),) + + def __eq__(self, other): + if isinstance(other, ObjectId): + return self.__id == other.binary + return NotImplemented + + def __ne__(self, other): + if isinstance(other, ObjectId): + return self.__id != other.binary + return NotImplemented + + def __lt__(self, other): + if isinstance(other, ObjectId): + return self.__id < other.binary + return NotImplemented + + def __le__(self, other): + if isinstance(other, ObjectId): + return self.__id <= other.binary + return NotImplemented + + def __gt__(self, other): + if isinstance(other, ObjectId): + return self.__id > other.binary + return NotImplemented + + def __ge__(self, other): + if isinstance(other, ObjectId): + return self.__id >= other.binary + return NotImplemented + + def __hash__(self): + """Get a hash value for this :class:`ObjectId`.""" + return hash(self.__id) diff --git a/backend/venv/lib/python3.7/site-packages/bson/py3compat.py b/backend/venv/lib/python3.7/site-packages/bson/py3compat.py new file mode 100644 index 0000000..84d1ea0 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/py3compat.py @@ -0,0 +1,107 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you +# may not use this file except in compliance with the License. You +# may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. See the License for the specific language governing +# permissions and limitations under the License. + +"""Utility functions and definitions for python3 compatibility.""" + +import sys + +PY3 = sys.version_info[0] == 3 + +if PY3: + import codecs + import collections.abc as abc + import _thread as thread + from abc import ABC, abstractmethod + from io import BytesIO as StringIO + + def abstractproperty(func): + return property(abstractmethod(func)) + + MAXSIZE = sys.maxsize + + imap = map + + def b(s): + # BSON and socket operations deal in binary data. In + # python 3 that means instances of `bytes`. In python + # 2.7 you can create an alias for `bytes` using + # the b prefix (e.g. b'foo'). + # See http://python3porting.com/problems.html#nicer-solutions + return codecs.latin_1_encode(s)[0] + + def bytes_from_hex(h): + return bytes.fromhex(h) + + def iteritems(d): + return iter(d.items()) + + def itervalues(d): + return iter(d.values()) + + def reraise(exctype, value, trace=None): + raise exctype(str(value)).with_traceback(trace) + + def reraise_instance(exc_instance, trace=None): + raise exc_instance.with_traceback(trace) + + def _unicode(s): + return s + + text_type = str + string_type = str + integer_types = int +else: + import collections as abc + import thread + from abc import ABCMeta, abstractproperty + + from itertools import imap + try: + from cStringIO import StringIO + except ImportError: + from StringIO import StringIO + + ABC = ABCMeta('ABC', (object,), {}) + + MAXSIZE = sys.maxint + + def b(s): + # See comments above. In python 2.x b('foo') is just 'foo'. + return s + + def bytes_from_hex(h): + return h.decode('hex') + + def iteritems(d): + return d.iteritems() + + def itervalues(d): + return d.itervalues() + + def reraise(exctype, value, trace=None): + _reraise(exctype, str(value), trace) + + def reraise_instance(exc_instance, trace=None): + _reraise(exc_instance, None, trace) + + # "raise x, y, z" raises SyntaxError in Python 3 + exec("""def _reraise(exc, value, trace): + raise exc, value, trace +""") + + _unicode = unicode + + string_type = basestring + text_type = unicode + integer_types = (int, long) diff --git a/backend/venv/lib/python3.7/site-packages/bson/raw_bson.py b/backend/venv/lib/python3.7/site-packages/bson/raw_bson.py new file mode 100644 index 0000000..429b2ac --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/raw_bson.py @@ -0,0 +1,124 @@ +# Copyright 2015-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing raw BSON documents. +""" + +from bson import _elements_to_dict, _get_object_size +from bson.py3compat import abc, iteritems +from bson.codec_options import ( + DEFAULT_CODEC_OPTIONS as DEFAULT, _RAW_BSON_DOCUMENT_MARKER) +from bson.son import SON + + +class RawBSONDocument(abc.Mapping): + """Representation for a MongoDB document that provides access to the raw + BSON bytes that compose it. + + Only when a field is accessed or modified within the document does + RawBSONDocument decode its bytes. + """ + + __slots__ = ('__raw', '__inflated_doc', '__codec_options') + _type_marker = _RAW_BSON_DOCUMENT_MARKER + + def __init__(self, bson_bytes, codec_options=None): + """Create a new :class:`RawBSONDocument` + + :class:`RawBSONDocument` is a representation of a BSON document that + provides access to the underlying raw BSON bytes. Only when a field is + accessed or modified within the document does RawBSONDocument decode + its bytes. + + :class:`RawBSONDocument` implements the ``Mapping`` abstract base + class from the standard library so it can be used like a read-only + ``dict``:: + + >>> raw_doc = RawBSONDocument(BSON.encode({'_id': 'my_doc'})) + >>> raw_doc.raw + b'...' + >>> raw_doc['_id'] + 'my_doc' + + :Parameters: + - `bson_bytes`: the BSON bytes that compose this document + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions` whose ``document_class`` + must be :class:`RawBSONDocument`. The default is + :attr:`DEFAULT_RAW_BSON_OPTIONS`. + + .. versionchanged:: 3.8 + :class:`RawBSONDocument` now validates that the ``bson_bytes`` + passed in represent a single bson document. + + .. versionchanged:: 3.5 + If a :class:`~bson.codec_options.CodecOptions` is passed in, its + `document_class` must be :class:`RawBSONDocument`. + """ + self.__raw = bson_bytes + self.__inflated_doc = None + # Can't default codec_options to DEFAULT_RAW_BSON_OPTIONS in signature, + # it refers to this class RawBSONDocument. + if codec_options is None: + codec_options = DEFAULT_RAW_BSON_OPTIONS + elif codec_options.document_class is not RawBSONDocument: + raise TypeError( + "RawBSONDocument cannot use CodecOptions with document " + "class %s" % (codec_options.document_class, )) + self.__codec_options = codec_options + # Validate the bson object size. + _get_object_size(bson_bytes, 0, len(bson_bytes)) + + @property + def raw(self): + """The raw BSON bytes composing this document.""" + return self.__raw + + def items(self): + """Lazily decode and iterate elements in this document.""" + return iteritems(self.__inflated) + + @property + def __inflated(self): + if self.__inflated_doc is None: + # We already validated the object's size when this document was + # created, so no need to do that again. + # Use SON to preserve ordering of elements. + self.__inflated_doc = _elements_to_dict( + self.__raw, 4, len(self.__raw)-1, self.__codec_options, SON()) + return self.__inflated_doc + + def __getitem__(self, item): + return self.__inflated[item] + + def __iter__(self): + return iter(self.__inflated) + + def __len__(self): + return len(self.__inflated) + + def __eq__(self, other): + if isinstance(other, RawBSONDocument): + return self.__raw == other.raw + return NotImplemented + + def __repr__(self): + return ("RawBSONDocument(%r, codec_options=%r)" + % (self.raw, self.__codec_options)) + + +DEFAULT_RAW_BSON_OPTIONS = DEFAULT.with_options(document_class=RawBSONDocument) +"""The default :class:`~bson.codec_options.CodecOptions` for +:class:`RawBSONDocument`. +""" diff --git a/backend/venv/lib/python3.7/site-packages/bson/regex.py b/backend/venv/lib/python3.7/site-packages/bson/regex.py new file mode 100644 index 0000000..f9d39ad --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/regex.py @@ -0,0 +1,128 @@ +# Copyright 2013-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing MongoDB regular expressions. +""" + +import re + +from bson.son import RE_TYPE +from bson.py3compat import string_type, text_type + + +def str_flags_to_int(str_flags): + flags = 0 + if "i" in str_flags: + flags |= re.IGNORECASE + if "l" in str_flags: + flags |= re.LOCALE + if "m" in str_flags: + flags |= re.MULTILINE + if "s" in str_flags: + flags |= re.DOTALL + if "u" in str_flags: + flags |= re.UNICODE + if "x" in str_flags: + flags |= re.VERBOSE + + return flags + + +class Regex(object): + """BSON regular expression data.""" + _type_marker = 11 + + @classmethod + def from_native(cls, regex): + """Convert a Python regular expression into a ``Regex`` instance. + + Note that in Python 3, a regular expression compiled from a + :class:`str` has the ``re.UNICODE`` flag set. If it is undesirable + to store this flag in a BSON regular expression, unset it first:: + + >>> pattern = re.compile('.*') + >>> regex = Regex.from_native(pattern) + >>> regex.flags ^= re.UNICODE + >>> db.collection.insert({'pattern': regex}) + + :Parameters: + - `regex`: A regular expression object from ``re.compile()``. + + .. warning:: + Python regular expressions use a different syntax and different + set of flags than MongoDB, which uses `PCRE`_. A regular + expression retrieved from the server may not compile in + Python, or may match a different set of strings in Python than + when used in a MongoDB query. + + .. _PCRE: http://www.pcre.org/ + """ + if not isinstance(regex, RE_TYPE): + raise TypeError( + "regex must be a compiled regular expression, not %s" + % type(regex)) + + return Regex(regex.pattern, regex.flags) + + def __init__(self, pattern, flags=0): + """BSON regular expression data. + + This class is useful to store and retrieve regular expressions that are + incompatible with Python's regular expression dialect. + + :Parameters: + - `pattern`: string + - `flags`: (optional) an integer bitmask, or a string of flag + characters like "im" for IGNORECASE and MULTILINE + """ + if not isinstance(pattern, (text_type, bytes)): + raise TypeError("pattern must be a string, not %s" % type(pattern)) + self.pattern = pattern + + if isinstance(flags, string_type): + self.flags = str_flags_to_int(flags) + elif isinstance(flags, int): + self.flags = flags + else: + raise TypeError( + "flags must be a string or int, not %s" % type(flags)) + + def __eq__(self, other): + if isinstance(other, Regex): + return self.pattern == other.pattern and self.flags == other.flags + else: + return NotImplemented + + __hash__ = None + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "Regex(%r, %r)" % (self.pattern, self.flags) + + def try_compile(self): + """Compile this :class:`Regex` as a Python regular expression. + + .. warning:: + Python regular expressions use a different syntax and different + set of flags than MongoDB, which uses `PCRE`_. A regular + expression retrieved from the server may not compile in + Python, or may match a different set of strings in Python than + when used in a MongoDB query. :meth:`try_compile()` may raise + :exc:`re.error`. + + .. _PCRE: http://www.pcre.org/ + """ + return re.compile(self.pattern, self.flags) diff --git a/backend/venv/lib/python3.7/site-packages/bson/son.py b/backend/venv/lib/python3.7/site-packages/bson/son.py new file mode 100644 index 0000000..701cb23 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/son.py @@ -0,0 +1,200 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for creating and manipulating SON, the Serialized Ocument Notation. + +Regular dictionaries can be used instead of SON objects, but not when the order +of keys is important. A SON object can be used just like a normal Python +dictionary.""" + +import copy +import re + +from bson.py3compat import abc, iteritems + + +# This sort of sucks, but seems to be as good as it gets... +# This is essentially the same as re._pattern_type +RE_TYPE = type(re.compile("")) + + +class SON(dict): + """SON data. + + A subclass of dict that maintains ordering of keys and provides a + few extra niceties for dealing with SON. SON provides an API + similar to collections.OrderedDict from Python 2.7+. + """ + + def __init__(self, data=None, **kwargs): + self.__keys = [] + dict.__init__(self) + self.update(data) + self.update(kwargs) + + def __new__(cls, *args, **kwargs): + instance = super(SON, cls).__new__(cls, *args, **kwargs) + instance.__keys = [] + return instance + + def __repr__(self): + result = [] + for key in self.__keys: + result.append("(%r, %r)" % (key, self[key])) + return "SON([%s])" % ", ".join(result) + + def __setitem__(self, key, value): + if key not in self.__keys: + self.__keys.append(key) + dict.__setitem__(self, key, value) + + def __delitem__(self, key): + self.__keys.remove(key) + dict.__delitem__(self, key) + + def keys(self): + return list(self.__keys) + + def copy(self): + other = SON() + other.update(self) + return other + + # TODO this is all from UserDict.DictMixin. it could probably be made more + # efficient. + # second level definitions support higher levels + def __iter__(self): + for k in self.__keys: + yield k + + def has_key(self, key): + return key in self.__keys + + # third level takes advantage of second level definitions + def iteritems(self): + for k in self: + yield (k, self[k]) + + def iterkeys(self): + return self.__iter__() + + # fourth level uses definitions from lower levels + def itervalues(self): + for _, v in self.iteritems(): + yield v + + def values(self): + return [v for _, v in self.iteritems()] + + def items(self): + return [(key, self[key]) for key in self] + + def clear(self): + self.__keys = [] + super(SON, self).clear() + + def setdefault(self, key, default=None): + try: + return self[key] + except KeyError: + self[key] = default + return default + + def pop(self, key, *args): + if len(args) > 1: + raise TypeError("pop expected at most 2 arguments, got "\ + + repr(1 + len(args))) + try: + value = self[key] + except KeyError: + if args: + return args[0] + raise + del self[key] + return value + + def popitem(self): + try: + k, v = next(self.iteritems()) + except StopIteration: + raise KeyError('container is empty') + del self[k] + return (k, v) + + def update(self, other=None, **kwargs): + # Make progressively weaker assumptions about "other" + if other is None: + pass + elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups + for k, v in other.iteritems(): + self[k] = v + elif hasattr(other, 'keys'): + for k in other.keys(): + self[k] = other[k] + else: + for k, v in other: + self[k] = v + if kwargs: + self.update(kwargs) + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + def __eq__(self, other): + """Comparison to another SON is order-sensitive while comparison to a + regular dictionary is order-insensitive. + """ + if isinstance(other, SON): + return len(self) == len(other) and self.items() == other.items() + return self.to_dict() == other + + def __ne__(self, other): + return not self == other + + def __len__(self): + return len(self.__keys) + + def to_dict(self): + """Convert a SON document to a normal Python dictionary instance. + + This is trickier than just *dict(...)* because it needs to be + recursive. + """ + + def transform_value(value): + if isinstance(value, list): + return [transform_value(v) for v in value] + elif isinstance(value, abc.Mapping): + return dict([ + (k, transform_value(v)) + for k, v in iteritems(value)]) + else: + return value + + return transform_value(dict(self)) + + def __deepcopy__(self, memo): + out = SON() + val_id = id(self) + if val_id in memo: + return memo.get(val_id) + memo[val_id] = out + for k, v in self.iteritems(): + if not isinstance(v, RE_TYPE): + v = copy.deepcopy(v, memo) + out[k] = v + return out diff --git a/backend/venv/lib/python3.7/site-packages/bson/timestamp.py b/backend/venv/lib/python3.7/site-packages/bson/timestamp.py new file mode 100644 index 0000000..7ea7551 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/timestamp.py @@ -0,0 +1,120 @@ +# Copyright 2010-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing MongoDB internal Timestamps. +""" + +import calendar +import datetime + +from bson.py3compat import integer_types +from bson.tz_util import utc + +UPPERBOUND = 4294967296 + + +class Timestamp(object): + """MongoDB internal timestamps used in the opLog. + """ + + _type_marker = 17 + + def __init__(self, time, inc): + """Create a new :class:`Timestamp`. + + This class is only for use with the MongoDB opLog. If you need + to store a regular timestamp, please use a + :class:`~datetime.datetime`. + + Raises :class:`TypeError` if `time` is not an instance of + :class: `int` or :class:`~datetime.datetime`, or `inc` is not + an instance of :class:`int`. Raises :class:`ValueError` if + `time` or `inc` is not in [0, 2**32). + + :Parameters: + - `time`: time in seconds since epoch UTC, or a naive UTC + :class:`~datetime.datetime`, or an aware + :class:`~datetime.datetime` + - `inc`: the incrementing counter + """ + if isinstance(time, datetime.datetime): + if time.utcoffset() is not None: + time = time - time.utcoffset() + time = int(calendar.timegm(time.timetuple())) + if not isinstance(time, integer_types): + raise TypeError("time must be an instance of int") + if not isinstance(inc, integer_types): + raise TypeError("inc must be an instance of int") + if not 0 <= time < UPPERBOUND: + raise ValueError("time must be contained in [0, 2**32)") + if not 0 <= inc < UPPERBOUND: + raise ValueError("inc must be contained in [0, 2**32)") + + self.__time = time + self.__inc = inc + + @property + def time(self): + """Get the time portion of this :class:`Timestamp`. + """ + return self.__time + + @property + def inc(self): + """Get the inc portion of this :class:`Timestamp`. + """ + return self.__inc + + def __eq__(self, other): + if isinstance(other, Timestamp): + return (self.__time == other.time and self.__inc == other.inc) + else: + return NotImplemented + + def __hash__(self): + return hash(self.time) ^ hash(self.inc) + + def __ne__(self, other): + return not self == other + + def __lt__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) < (other.time, other.inc) + return NotImplemented + + def __le__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) <= (other.time, other.inc) + return NotImplemented + + def __gt__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) > (other.time, other.inc) + return NotImplemented + + def __ge__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) >= (other.time, other.inc) + return NotImplemented + + def __repr__(self): + return "Timestamp(%s, %s)" % (self.__time, self.__inc) + + def as_datetime(self): + """Return a :class:`~datetime.datetime` instance corresponding + to the time portion of this :class:`Timestamp`. + + The returned datetime's timezone is UTC. + """ + return datetime.datetime.fromtimestamp(self.__time, utc) diff --git a/backend/venv/lib/python3.7/site-packages/bson/tz_util.py b/backend/venv/lib/python3.7/site-packages/bson/tz_util.py new file mode 100644 index 0000000..6ec918f --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/bson/tz_util.py @@ -0,0 +1,52 @@ +# Copyright 2010-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Timezone related utilities for BSON.""" + +from datetime import (timedelta, + tzinfo) + +ZERO = timedelta(0) + + +class FixedOffset(tzinfo): + """Fixed offset timezone, in minutes east from UTC. + + Implementation based from the Python `standard library documentation + `_. + Defining __getinitargs__ enables pickling / copying. + """ + + def __init__(self, offset, name): + if isinstance(offset, timedelta): + self.__offset = offset + else: + self.__offset = timedelta(minutes=offset) + self.__name = name + + def __getinitargs__(self): + return self.__offset, self.__name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO + + +utc = FixedOffset(0, "UTC") +"""Fixed offset timezone representing UTC.""" diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..e118723 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/DESCRIPTION.rst @@ -0,0 +1,3 @@ +UNKNOWN + + diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA new file mode 100644 index 0000000..1f10885 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/METADATA @@ -0,0 +1,16 @@ +Metadata-Version: 2.0 +Name: click +Version: 6.7 +Summary: A simple wrapper around optparse for powerful command line utilities. +Home-page: http://github.com/mitsuhiko/click +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: UNKNOWN +Platform: UNKNOWN +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 + +UNKNOWN + + diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD new file mode 100644 index 0000000..9ac11c8 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/RECORD @@ -0,0 +1,41 @@ +click-6.7.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 +click-6.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-6.7.dist-info/METADATA,sha256=l6lAyogIUXiHKUK_rWguef-EMcvO5C6bXzFCNCcblbQ,424 +click-6.7.dist-info/RECORD,, +click-6.7.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +click-6.7.dist-info/metadata.json,sha256=qg0uO6amNHkIkOxnmWX7Xa_DNQMQ62Q6drivuP9Gh1c,571 +click-6.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=k8R00cFKWI8dhDVKQeLBlAdNh1CxerMEDRiGnr32gdw,2858 +click/__pycache__/__init__.cpython-37.pyc,, +click/__pycache__/_bashcomplete.cpython-37.pyc,, +click/__pycache__/_compat.cpython-37.pyc,, +click/__pycache__/_termui_impl.cpython-37.pyc,, +click/__pycache__/_textwrap.cpython-37.pyc,, +click/__pycache__/_unicodefun.cpython-37.pyc,, +click/__pycache__/_winconsole.cpython-37.pyc,, +click/__pycache__/core.cpython-37.pyc,, +click/__pycache__/decorators.cpython-37.pyc,, +click/__pycache__/exceptions.cpython-37.pyc,, +click/__pycache__/formatting.cpython-37.pyc,, +click/__pycache__/globals.cpython-37.pyc,, +click/__pycache__/parser.cpython-37.pyc,, +click/__pycache__/termui.cpython-37.pyc,, +click/__pycache__/testing.cpython-37.pyc,, +click/__pycache__/types.cpython-37.pyc,, +click/__pycache__/utils.cpython-37.pyc,, +click/_bashcomplete.py,sha256=82rMiibtEurdwBq60NHXVCBuGXJHDpblFO9o2YxJDF0,2423 +click/_compat.py,sha256=j59MpzxYGE-fTGj0A5sg8UI8GhHod1XMojiCA0jvbL0,21011 +click/_termui_impl.py,sha256=Ol1JJhvBRw3l8j1WIU0tOWjQtxxmwGE44lFDbzDqzoA,16395 +click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 +click/_unicodefun.py,sha256=A3UOzJw6lEZyol2SBg3fNXgweTutaOzkJ61OB7vik3Y,4204 +click/_winconsole.py,sha256=MzG46DEYPoRyx4SO7EIhFuFZHESgooAfJLIukbB6p5c,7790 +click/core.py,sha256=M0nJ6Kkye7XZXYG7HCbkJWSfy14WHV6bQmGLACrOhKw,70254 +click/decorators.py,sha256=y7CX2needh8iRWafj-QS_hGQFsN24eyXAhx5Y2ATwas,10941 +click/exceptions.py,sha256=rOa0pP3PbSy0_AAPOW9irBEM8AJ3BySN-4z2VUwFVo4,6788 +click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 +click/globals.py,sha256=PAgnKvGxq4YuEIldw3lgYOGBLYwsyxnm1IByBX3BFXo,1515 +click/parser.py,sha256=i01xgYuIA6AwQWEXjshwHSwnTR3gUep4FxJIfyW4ta4,15510 +click/termui.py,sha256=Bp99MSWQtyoWe1_7HggDmA77n--3KLxu7NsZMFMaCUo,21008 +click/testing.py,sha256=kJ9mjtJgwNAlkgKcFf9-ISxufmaPDbbuOHVC9WIvKdY,11002 +click/types.py,sha256=ZGb2lmFs5Vwd9loTRIMbGcqhPVOql8mGoBhWBRT6V4E,18864 +click/utils.py,sha256=1jalPlkUU28JReTEQeeSFtbJd-SirYWBNfjtELBKzT4,14916 diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.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/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json new file mode 100644 index 0000000..0a4cfb1 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://github.com/mitsuhiko/click"}}}, "generator": "bdist_wheel (0.30.0.a0)", "metadata_version": "2.0", "name": "click", "summary": "A simple wrapper around optparse for powerful command line utilities.", "version": "6.7"} \ No newline at end of file diff --git a/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click-6.7.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/backend/venv/lib/python3.7/site-packages/click/__init__.py b/backend/venv/lib/python3.7/site-packages/click/__init__.py new file mode 100644 index 0000000..971e55d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/__init__.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +""" + click + ~~~~~ + + Click is a simple Python module that wraps the stdlib's 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. + + In case optparse ever gets removed from the stdlib, it will be shipped by + this module. + + :copyright: (c) 2014 by Armin Ronacher. + :license: BSD, see LICENSE 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, \ + STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED + +# 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', 'STRING', + 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', + + # 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__ = '6.7' diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..836dbdffe29364e79d4b5c3f832f21b72360141a GIT binary patch literal 2741 zcmbuBOH&(362}F4A_)P;?`PY_24O&ec^hLS@h~0?gn>&%Omwt53#skS?vAP!40G7; zvtM8@`%UUNd)lwCr_F2$dyezy2>qz6uFA^#XI3?h;o)M6o`3!J;OFU5D)k>WZk{?d zw&|yT8%U)fB~mZ|gZ=;xia|_^G-gBwvm%Q*k;A;mV?h*fNDN_76bE>0+Am>Ql#_PG zAI6HP;D{K(Q89{RVhnGITR1Mp@wT{)cf=jMEAHYwaS!i{`^lWF{{SC~hxkZ5!pGt< zJ`qpwsd$Rd#51&nh0n!vd?8-oOYssX#00()uabE=|20mENt_Z>SQS;A7Ss4fyuleU zgR^2b8I$+tuqJ9aFXnMUEa0M8#JA!tE{P>v7R$IIR&Z6U;+j~)b+L{cVguiacgfs> zzlra~d)yLR_(6QYZLy7YQOAa8U{f@4N9^FP*iFU``Fpr8_VJ_mnAk=C06&RO)Gk38 zhM@u@FbZRE3&!C#+=07r5AMSQcnFW+F+72%@C+#zauU=!ZM7JPths6zvqumiiW2mA054&W2~)UJ!4;7}aG zXYm=1PE*xm=iij*qD7DEd+xWS^$&iENwdkFmZvSp(jG>>v`(($P8e7iLYJ(#uvi^*ln(Go02h1~!Wci%&*pB(f8flz8I2xDGBT324&q4g<%uG^s~ z+Ma9iva}m|ABEa!`Este&x62n$^VbIDjrrfHvIKQw&qpi9^FR;FZf#cGS=aShQq`3^V z+^`y_J2RG+(mFh7?jD`)S{EU!qND{fc06Ct75_`=OI3$Vz8MCw{3SM}2JNHSQ4T#)lifQ!uAiAq+ z8R>RHGsb$fyueY{wvLr_(2Q^wXX2(~D2!xaUvLN`lt0>4Vgw|!De+(@ifr&y&j__m zdg$t~$wgFfQOtTJYV;PP%uvNRzOB7qrKxZf_NC{L$Zg75iRQGG)Vk#;lXZQ`e{_6J zYv;Q`uaVVB=otxKY;wNS4cv~&Qy^}KM@LRqODd>Ja`bn9ab+(l#dA$d>?%bmEH@nZ zQ7A(!Z|_C6-U?N0%17ZTow}y7`GVX zjN6PmjJu3`jQflSjE9UzjK_>8jHire42$uc@q+P^F~NAnc+Hq(OfjmAX~rAI3}cot z$EY#p84HX>##_b`W0|qSSY@m+))^a&cZ^NOd&U;y17n*}XEX?Vzou8_R*$MjCU4si zy0&dHbYSJ55|^sT4_l6}6O~2r`HO-yBfQCWW4b8+fc_%KXRGV|?L3&G zyg4=cPvt}ud-nr>B!A?GE`na2bDlUoj_=#Hu)s?`V0Jg~+z_PgdlWy3Z(lhoAP=Tw z+c#IF{m+y-W-~jJ9Zi?B#eqV4FijlDq$>l(bYUPzzY19e>KjaF(z#qF{eOZ+0i6H< literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/_bashcomplete.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..338386eb8e74e29b78d66b0d6e744360ce880d3d GIT binary patch literal 2391 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/_winconsole.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50bafdf4f25d1754bc1b11dac5c836ca182f1f15 GIT binary patch literal 7456 zcmcgxOKcoRdhXZs^t>pFq9{_5CHf&-v$jY}w)|RI=0lW4FEwOHYH2lMbcRzkWRu;~ zxLy8U- z36LS`uXop9Rsa9}fBl>(mGT;XfAh<+FB+FL?N?Me_&F#{A;lwxrZJ7_f##;U?&_*; zxQ5D2*HpRXS}M=D8I{|vjob*bq2oGX&dr5+H?Pw-%pemM+(KA%i($zvg#+$Dc*;E$ z4!VQkY4>zEr+%w^@I~<;M&+6LVMa;4=Ys4MVH9oR+&OHY@>W;2yjZsVEW7~Q0 z*Sbc3Om{~fY7OIaS}7Bp4==bE!i(-j%q#Mtj_$t1hqo@dm-wZv%kE{+ad#Z_W%p&! zSKL?lS$?6TGn+=$4UB&kEk$bM7m=4bddFm0^uDHgukg#v!Kl}f=a9dFJdgY;)7&yE zxZgqkCM&vcv66cY=*{9}Hb zUHx;@ondA69kk6deMKw3^)*RLrEDgnUL|VG22t!cHdgs#Ils6js?8=BNlv2b$-O2| z%%z7n%7rAez9)D+$u2Fc-R zlkCFMtSX%Pl*`#D466;c;5YbMGSpXFji$xM?wbFf&!0c{|AWZCgM6)HyI+%L_`fny zf@Wy{Ms4T)=f9(AHI#b4B1%(8@fHZzNN1ogIydVEGq?q6@(ie@XolM;+lpp+7G;M! zpgBeJiWX?@M#0VTyr}cset{KPiD%fruvRyo8Ib%_xRb#ox3uT2@6_u!d=q(M;^Y!D z;ElxbB@gNF5=ZbViyFaRVl|i_CU!j%VO1uXc(aO|%EnUojK@hn-dT_8^_a`pb#O~u zG^)YZIEv?PJ`SrvAgk*E7w53YO1YRgp4X^`-1CyW=Y5d19pHYI5oNu%tCIl49>y^ z0<8fAqDS#;dUMOwNArs_V7YfA^fgNAMo0?VdRy~)XQ?OlCa@sj01GSTL0!CuF~_$7 z3HKYm^gNEvm_DcJt(U)T?TLfYH9`scQEnnBCI(TE+Lpd=w6$lrSOuy^Wfg#G_)(JU z?ExAPSEbx5>*9UPImVRuF4{JcV$v23N7}mltsJEvs^B88V61qZ$QwjHAVOd2`?^v$ zx;}9egziQy;TVqDYe8fBqr;d&`gLyW>~a18M_e2^B|0f}O0=nilTo~#d+fA#m>cH+G{)I@7uHsBgg5Z9ji3D){r>io*6FVHjB_C(@zMB|xIB=; zLjL>JV2969v(ive!o;MwjFr2pww7uN!AVjC#w=80sm3Sg=9ZTim%YWMx#j8A`NfJi zJ+rvHI(H|rq#trvn}G9Xl3iR$hnsVYcazL6tyj(}Nl)~3cTnxflaaU1J=$<$r#R!D zrA>J|(8sv1+db9Sti~H+w@;`Q94P|`gBA&J9lrvi>5gvU&(R&T2x=PuB|Q&n=>tX) zwDms-6MgCgrTQ4(6`v95S+2CClc5SGfh$2JdQ#e+64(OD!tOAj`Aoo zAnj%wdI0{dN>WNiXXU}{?A*%Afh1KHSG~E);)74`dH3h;FD^f94IU9(l3PP8U=48} z1WsTE0^NxEj$d8>kVobSU6JrYn7ir*C#8?cENBJ^0;Sf~W9ZS{;fs?`#u38g100dM z!V?p?VE`u#rYpp-6k=q67`8%;>;YnsHGu9ra0KkO%?v^g!kKN05Tvc`=VhS-tD#WC z#+jKF1q})$%0;ESN?#K*^c%_P`_rF$GY?niR+O8tI#)^cxTLo9q9TjC;9cAyvPfhK zq^pzSQ30skaHuBgo-)+V{}cBMN)kA{JMm_cn|oa2P3cFC^k|K)(R$n`M(PY{(l3y@ZZBCD18D#b zaO=#`-6^Ti6;Q{^-hOmqUS-shKht`--oS}RtGA`bcT=zv%a#P(1RBz zr(`8lY2|igo!r!bCpHksuSvM4$pA@Q_rXXfWD8nAdZq>ob0mf;P;h?Ccp6jxU7 z%vZd7)0I05bBZ;9jubk;@ui7k{*-X?;k zYMT=8_ahqw>YTJe!7+iH?>h3bm2T;KC?_RwzxZJFDEq=kmpF;(!6QsZJMy0~vd1;O zszrd7{|~O=r~U7^#>FKsaNQuTk$OLRm?@Z{K!b#KGbL187Q{*Wp)m#*i0~cm&o{az z&SFqGlUS|5Uq@h3)ZV#~SX&VsAT!>l1*Um?tG~vl?%Dh%?fVU*a=e91=Sy z_c$_9A)KT<{uzh_2;i9rQHKm@5)Lfl!^V%b-`DC&;Ga6uQZSL}7uSsf$( zV>}=cDW^R=(I4ND4mpU3{959V(1T|nJwEqy^i&j0xPCTVK(Petb~sD*XVL%JlJ@0i zYkhqhzt<#XNdPRt@6YC>+c{&{0G!c#U*v z-{{xMM$5QXLki3JG%QF=3Sw7eK$488Ha58OOp`3GOPQCLy2&siRw=7O#*citSvFm| z>Y9+$VWOy*hT=V@;Y#mMzrf_bpic$)$juzo&#MRE0LnuO3CQUbzl$+2uIeRDd@G;3 z=akX$Qc?ojLIL8TZRf-;UFf!roIH5scn#pS11Dt{R@``|p~c)s++aWR3<8aaf|<^f zcKn+%i?I-xC%7)OI-)`DU1LZ(`}7XL44L05JVO8&F9?Vj-ce+WGI0O;uoX3hK9v;j z?}0hI5-8**o)94`keu$ifL^^?!_(M@>tMn-1l(0?9c@e~!eq=LK?9?5G}rr=A8 zoNkLmOppOfWsfX?ic234SX1~zQ1nuqB0_$Em?Ux?Bq_{?%}Au-4+J9A>J!j}l#SCg zZivWL8tiN%p3Z}JZnzXSS&{6X3P6faXv8v+DI%l+2+42q07HdRicM9@)334Btqs^ zy?+uL|60I5Wt6p5W>Q%lK_ISh(;ZULQokA~6i^teR7m_D4WSF{6Ny7Kc5bErJh)xJ zh?ta^-hGFE!}_}h8D|^9Fn}~@9*xVBcRi>VO*O+rRL7vmP9HUg&Z;+LVJJU%Y4D}N T*PJZ<*@*qvhI7Wie8>84k}FIgy`+)_}Tw;M8a4~q1Ah-lUEEZS-Brt%86)6r$_4H2l?DlL= z&!DPjAFW=R!a~wY5dg-PC`X~~T}f6P#YawLTX8JM(UElI9L0%jMV6C3iccabPG~Di zjvqNOV_W%rfA>~ZcW=)wNadfLliBU+>Z)6}?)}~0{k`w+K0h;4$?*4!zjx@%?cLeT z@9RhWSK#D1KGAPyGnpV0WLueK_nlqN+V9+Qj_+J6zfo8&WOXm!DsGgPOLkspO>C5x z%bXX3QfqRfvRv7iTAtdNUY@pV6Rnwz+2z@dx#hWy`Q`bIUCX=ddbzcGW6$!QjlIiz zH});>+t|Onf8)UN0lPQZI=FFY`OwDU<-_*7(z<8k$nuemdzbIE-&3voHtt`(f1|ow zwcpdN4{RJ=KDzP2~PjUaF{C*%f z#_wZ|kMjFzem@vI#P5e1PxJd@{5~Em@O#02pXB$$!H4+$A*=7>{5}yp!tX~KAE*2? z{9X(m<@clZ`xA`8W36X5KDqqKjpvr1qu<##G7BI6rp9_{A={r_-E4OnS2`Q@cKv)K zYYaIa#-KmYJ}ee8!`*|{xpwVYJ{Cy=jv9YUw*mW`E0#?zR@o{ z|JrM>EEM|Xjrzq#E$W2*19lcP*6Q1>PA$5y$wLOfhFx(9L)6ds~*Xv<@qtR)E{o<)}RMnqxiDbFHa|o4kO}hU&eiwtAtl zda<^)8P>Mj&DG7IQKRZcSZ_uBJvAWMT)SG^y4tz0*?zLtXkY5?I{n(Kubx_Zq58#B zpZ(MuUtU~X>^|%-J)T~xe$iihBE6=vt9gwne?|W}&3E)Y9D2DRd$AlI339#cO{Qv4 zxRtw^y_MOYxt8nX*7G+Dz1*$rwR|rhJtp+9Y0GrJ#?7^6uZ*wfK~a`ji5gXR-CW3K_6kSwW(3NR1cRyfB&o524n5{|1c9i zLN(v2Ke`n*FEIfgrR1Y)o2{S`MvrcUkDgnv)t-(%(*EeB;KQr6txHcl)>(V{{Ce1W zeC;D2``DvrAKhwhJ)-*Rt=1#k8y6n0Ki+)o(N$r0eB2Bhi(6O2hj`BsKG8gfOs<^W zo1M-UvW47qb~bBw&#a0X>rWt> z5ag~EI{6^40bDOIgp^w^u9x`bj)k>}{h908x1i`ygu+sH_2o{r8CBbxo$A&m6YE^7 zQSEG2>p@W6VE#5WnvjVgs@9|G>V;-22perH!6O$K`k_)FLEY+WwkcfaxWNqQ24^<6 z+d;KHQkWW}?Q{MGR_928v9&E$t7k9JWZ!C!VvV4lhg2PlxP96+xq9?ibX3KnMn|=~ z2GJLH<1(+On+@7E)Q)r8^nm|uj!~nvrW!_C&O46BmDj7sqUz;l=K>GZ-8-m~YeGEt zs)e}8VFPq)uG-Yl>#gk(rD)x`Mzz&k>+pk$o?3jYs&;5jtu?PyRd}sczuXAosxCKM zEj`0s_lVKa>PHtJTbSq->W-d*?s?qe2=}&)l8}hZ`>1@H~$Yiay+NwuU zt=2EsY}(XnOeM|E1{Bb+pkHQU*}d>#kg;D58|Rx5#9+BV|2sB?++k6-_jqb(IO3~V z;6}8ULnb>ftk0J6gcU_gZy4e95*&8;v`(SAWx7m8dq>I+&gSI*Tts~2ifv)dSLXwhyx%X5*vJR9mf znS~Sl(2TT(e2$Y2^DtlzUC%S$AeTWd$a7xo6@&c6O!(=b5ENV4jodY4qh5&_$qdxI zgA7l+ljEAmYyNtUxf>JOJRK=73G~J^YW=CzO)<$;rcURZ>QZQ|INL8=u7~aJwU^tM zHZL;vt;YHK>ecF2%qXj?P@r@5)r*GahA)k3yK%W1HP5%}o$U~$fm}!1tB`766jbcg z!wziKP`PSktNH|32=X6a?OZwG>OWDvRBvrJ78W7f6&_i=*lJvAv;hAEbQx9~_RDG= z6-D9mw7Ea=dG`~nEXQwyJa?}2i`L?P(Q51$)a!mhQh_}&tREulUD;ybx zgihzmkkC?oHe1PtuW~0rBtcJ-@2ZNw%i(Gz$bK%9&3r!7{z`$-yjTf8mxVEAGu=ff zX4Y8e3C1Q@1JU?38NR@E$5LMqRjuXT;%RUodoA~s-1lU@kZFIIn)1|i!`HMwsp*od z>9!|$&Lp#3_x00GBCC3l%n?!mT1TFUs>o_#9m2rCA<&4kLNOY#&=gteN|nF0*40Hj zVM>H^^fY`)hnIDj<*<-XFZ8pw&4a!5?eiN*HnnX@VYPBo9OPApZ`izfkD@=BJvMU?+7*^qboa=u~xc zEyZMLJROAuZiaASBhwc)w_Abe9`c!lu&@!heuL4l`_+cYhE);yx(GOempIyRt;SZ6 z6r#=vst3cv2GgP)Sxt4waAf3PZ(iLD!^UbSZ2=drRuO7_GyFTD%l7c9rl|fzMaq2k z@QI%0aCP=Z<|eZpkt++<9RXLe;0ij3{&m2t>)Zj0zzMi@ei}fn2}rr6ex8A6iWQsf zpmC*N`JASplaPyRt<8D|8W+_XCducF?rrc$aD_QKuUWHd7*jJK4iM*ZB+2|@<7!iF zG{rERLjuvi?g@d;O}5B{*%Y{o&$Otr6+OEcSHO$%)WcUvml^?B_IWB@-W4=pDdFJz zC7N0z7P3|*G)8fF=hp>lory!m>51@*{L(B={)E)e@rizgLn9+q6*V=xoJS#o2&2Lk zf>JPnl2#1L!6e_M#zgRFFcnOj3RiAS1~b9z+YsmFN-!79Q)0^0z|8V=uqW8d?-|PM z3-()?+2BBMkZW_nq2Msz^T9pA5x#c?_XhXzy*s!+sPerh_&{)!@4dlers`#v_c;}B zdB0QbmJc|UZuy{7<(3Zx8t%vY6P^^*Pw&cP&KeGyvgYKFXsfZ>MDm8)IuU&H+`16d zaQXt`s*&&v?1>kc2|0 zO{;a4mt8`XU?N#%5~X6HaJ$`N%4w2bt)f050E;rg3yhc4S2ZDZrP*1m*ux_o+Kw7) z+bvCPM6Ok)>=qKpXy=f>LMK2nttsTD8U!=kY*k}`q5)Wcx&a@)UWaj^>YBM7=lq9;#^=h~Cd@>3?9YS>ojO|#V$ zVTS){s8&u?SEN*XmDWVEXyruw=t>9Cpj~qVh`du<+itI}3{ch`-~Z&;_tT%v%QfRd zrns*dg9q~xg8 z>Hrbgp{dD8q%;EZsQv>k{;w=;wwc?2qa72PyVWETH2CI}{HVg98Hp6dn%>Z z;B*OJ*l7+sAq0}EB)C|IfnEsie)7TTHkz25+~jtHYV$nC!?=J~cH%egIHhb%n{CV& zps9_<$egwjZi~+u7r4_H@Umu`A<%q?+d;>nLJlW{Yj=LW!>~!Dk5zi?uF!ffQF;*E zM&cY4xZK>>-tg}e2(86%G{}`n$JKK?P39P}o#EiP;q&S?;%>VGLE3C{a3~d3#cA%; z2ddga{EQMqhaUlB{ZBt8t4LU11v<=_wYyX#RNjOshE3RCTcSw2>MTu{kzk{fl2?%I zjR4)Hs$@8rRfwTjx)~Bkie#k|Ro8C=I`6zoRe%nXB$5DN)(Yeap-`bL(BS8an3{}O@Ou9{uIO!k>fG{te z7x`(ljryp9_5h6T0w3lNv{h!XP0UvHwq!=S!Js!UHEEeJ6UHL5#9e9{VvuJ&k@aGt z5WFeVt%No@dY7vFXvJb69BR}qZ58+_=7gD4#z{c~RJ;jsSb~XKddc zao?$Xq9!?`)N)>!gx|zV>_ZvZ~}z-bBzo2 zOU=!22sEY*oix^t#w#9bPc6OiGR4rHB2ipWZ^r=|7!*k;0WMYpu06m= z@!v#%cB3H|39nS;V=zW`TPf&XN0tEq%II;;@mM@+5J)dqQt?svarYK}JSL;6na_`im&4i{&pCX-|aJ1=g9TCR!pt(HHp zW5JF^tos=psV8x$X0QYEy^fPq9=2MkGa)x?6F&gI%Ds}6?D&#=uTR=Dc6PJU%VYg3 z_3#DMxXy8^H(^hF-9N$i`t-Gl-URoidu6-#3;rJ8>oeENy)yS^dKJ6(>%Hvy?6pd- z!nN7nlwIp{ZSLAsZ;ESky=lAlM_ik~Hr<=%+I(+D*S?kwu}^b0$=N)0@47bAE(N*s z*=sYs8OrVI&H8drCFM9<-+gViH_QFqy-ALH@OZe|-cCxrODX)4R`a{qGUKht;|{uS9Gym=@s>hy7u;pcAWDy{(Mp+XY2c~&GqKEzu!jXKp^-ZG%sdxsb9d( zQty@=Y3UYmH6M$dyW|kT0j9evIKcU^CKD~)?$tMGsu zRDXZU<7f>zD|}Elc1v2p2~$h`nEly!UOIK9zw0*Hy+1!HYxEDeE4Q)Q{{Hbys=w(m`JLL92AF)@&1tQIkD4(o>moDaXG& zpJEB`1K-)%y!?d~oIa)LQqHdFNEy6{#ew5wDOaIf*`D8$r*7tIjsF0*3zC_}T6ah<`@-RQ*raWy;VR{jybukxK zdl|)h$hmNxqfM3kk~Pgujl8uFXR!u5JVZ_SjMU728P}2v^qJI|^U&ow=SJI)vr+*U zwc1N+zWg0(KHwe#r7LoF$U!toQDIGVhC?qK?T$O);MqOg%e*&zE!WFAFI|xPuFPjM z-y@G3;VjW}acS3Oyl66==j$&68&erHIndB#ecd#Zu_Q_p7o?&%{^AY1-l~MW%=F)Y z03=KrW3j~b2YNeLw}!(Xl23iaLEv72PCPO!#mrB zAbIzn)GLzGt*iHmHm3m?ZcP!2JEcU3)>WUM|od|#^Yj=`b zVrk0pZlb!HQqZnCD2d^YYENK^bj!6SZUPtg6I*rF#h0B-;@=|iL9`4T1i=laUGNKY zx`(#9fWBZ+4?$BNwgH=?jT2`3x-(|*l()8fqqSc5;+49TIa-U|;p9o@ThI;t*%;$u zUW`^Zw;IP6P9~jp_p3Ms!1#{*6r;m-d_isJ;k3$F3B^T8WKfIwxYG;&gfF_?I{p!? z<4NPap6Wq-yF3`fJ{{TAPZ@4wMcG-^NF>EX;0FkxkRD_B5K@y$L8q77Nt#4q)=YT%)JGO zVGb^{H&@7ZXJU$OrG^-bn2RwMF#yqTh*`G&;}H26^@eP$&fx?EBFt)Z%+Q_Q3{JFE zH8q`2;yFf2z@Xui0}vlK6^OiHns90^9zjBcnn?2kZPdZ>V%DW(unG9Uv53_aoyDg6 zRVvj4-*mOoB(zHT6Rjx-9$WI#pTl(}6HsdTb1y}45RSRY%@aI6U`f8*Xtf3=yhtcM zW=E|?;-(0+BzmA4Y!d2;LCh(;H0g}YMP5luIzd3%HiToV-nrl^t5?r&ibd8)bkXyO^l_^$!d>@&OvXSyIbVlz)Dpwd7xbORigjlCTAiHRyF_= z6|)FP03w&Ay|*6d%chQAbl$m+p!~oOPX_ARAbc6Qs|@$X00i$yGG95h^r_lsUi?D! z6V*8OtNNkpLyIkfd>=|lkfsz@UU* z`7)1M#kap)H6||~^IjLtG5*E&l0|Ab9>3^B^&vc^-~Glz3+bE26XLk7kc5DVI$ov= zzs#+UXn;aMGKag<@w`{}hNis)Ih*!UOBGSJjufdFBMXknbw7L>X`|y^3vgr?%ABB@ zDY~+r84s*_m6wROqInJg&&%*TTf{T$f;zA(sP#F9a8;y-~@(kdbj}1I9|JYjW2vowz z62x)teo;T!sWl^3y+9`yI}=Avc1d1P75#nv^O)0@}0-sZ4d8H0Sckl`|AYDkFH_8Gz%!Nfl~h9G489bULj} zbADhBdl6vGd4Cdk(OwS^vkNCN1_{RI!Z#V3en}zy?O-A2m|1phl!eU*?6u9dQviQF zL4e8WYSFR~o6BXpm^5-+Ay~j~+M_xAdnX!j^ zjeuZLtXHj$Tbo-Q)jz^Z+`gqon&w3CUuA<7Bc2_Y}_&xTonRU1>73rrK}f)cC!~ zoh(x^e*n}ykWmM2=5JZZboV#U8nSI*U}BiPQNj4h0KSoGcJ= zB%gQI*mRZ`jan@FW>`>JHCiCFN-E*i;IZK=ElOey#0l)RF5X#u$jyv|cZ8c529s*~ znWb-KtEhe}K*f}L3zvtj1Vo#3F7!(+vD7U;4q;Elh85ZHhq(41XdtFJ$&?BVM2XLQ zw!1gM8fSg6D#wq?eLUI&)*wz+sx{+qP-oY&ZMQd3`%tHWYF8|T9Z|szSF=s9iw&3WHB_sfV4(t(V_8iIyfVfyhm3uAD#KZCKI@UWVD!LKGbP>|hXkj@R28xNxs1|yHG z$5W1{B{sd>^=t@!TnA5j*e5&|Tzh46^CE#ZTQ)~ytG7r+eZavY?@CNg;3U3S08 zf_*HSdDuVlB8EH%dW%0K`W^Dx`+mo=+TeSqdy$z zQDOv-pIfDX{b?DDP*>sp(JyeYMKHM^$Q{aj30B8iLM=aIIa)_-@Ji1X#J~jetk_{` z3=7hbsNP}8OfPTD486b7sezkuRM==-Pj4PePtj`0s$;WwIb+SYi z-XBMfn6(9aF6K_eU|YCjF%gKwF77EVh?qQ}wFql5h$tv3smd8Nm=~xcut;PyX ztT3ch?uqeDqV+V#f*)c5*Re~A6OZL=74luv;$(uUMFVXGGHFZD=w#3_i2zD2?C2&|4pop-wD)Q|t_~xWbod1>H|d@o}6WMv6otBWhs?gFS|rqr&@07Z)lf z)M|l)Iby?4sp>E3Ai1MIc^29CMX~d+uHVy4I=La8`^nagd-1~-94$;Zw{7Vn*v_gk z*=JpqFLAa!X_KeMdPTSTX_ztfORiP_OoUI0M`oVYhQ}5pHH< zvDrPAkVGv{l!?ShqE-fulEj!CMn_rWlQ&|AOt_wh*d4Yg0+G6hb){E01mWt5#61j& z%RvV7YmhyWGL}mHy*HX0NONeEo3X6z+Tz4);h=mjF?z>{n~Z%jeFkEpyjv^gjLxX* zsZKn^p7JI2m~qt1Dp-j%4O}Y{;w2-lbLgCK5hRX?`RaUNuVGmD0?F{q9dCB?=Z8^I; z*PV-p)|XqDU2=bC+}A?(ESwWO$t)ZWKf+hPQmZ*DGD~HrYqd9tx0bxluZdbM*j%mE z!j4+AtwUD_&86@fhkn^njm}jw6oy~bjq5sG(m{H3_#--)KJ$*w-qYdV)!|R;Ac@PQ zkWh@^CF5+9yP9K{-!r64WG(A(ED3{BV zLCn;S82t(&vMFCsTTCoiTZF@85QY|*0a#8-R8U@nIq~nAK zJ%%$NU=;~3BnCqPq~2g;Y)&d8u1v4*z&4nUZpF7>+UUJxW{-k$oFl9nhT)!-nBiup za~2RKjV5o+fLd713L^uf377M)c)qb(7l5=XJchkEjx}%$gw$<~f%U^)7IzbEgZ{gg zbg(I#lnXb)Q5>l8tSB?L6&+93_*A)iX>Bye0f*m3oir>`~drH=-dCwZuPB~?_!X{b6Acm%!} z!x=t7-Y>bsV8o)htvFU5H-XmJiLl0gVrTVB-Z~siIp}FqNQCFC9^nAIRi*02{%M&W z0wzszEgbajyH=bzyR^zYwLg7}1fJ#-9pPXRcknnxdWE~2W+9PH$%0f^&YyDE1zz2%;T;6+-Vsh*JKTayeYn@oZZ91nikCFF_gL=W{nwwoQ z!4)xd0(iA<=@MekjTaAAr23@XAekOs{LwUk#UKjAh?0^GEs8jQ;dYyp8hiKEf)~va z!`t82YC+9bSeKe(w$|@>#h@yR1+hD=8f2aDofi$NA~k1_qYuZ9AuLm}lnu9Qs9wsv zjd&)nR~OSiUP%L4j1b3!>(-!Jb_U_}`Q9?**aP4Tq7*XWX6E)nVW+eEiFDbY?H(K?V}lQj=LAEv z)*|@2fB#eF1xZ7{%oLK0)xbzv2+)9o+`5?>g7utTa&sYh&?E~>OQh^w?q)o!AVs^O z73-{IOwlQJArJfG+_X10ulIZm_IE&$?mj+Do4u%HOG1d25ev0;rlu1!{Tjh`P9HZO zHeRWWZ`|%@7=f*XY8Siv2jQQN`;Zx!;$!%TgZ}r8K;O%duCFnyoNhK0)R^FIA^ZVPC*hVe{3gdoulR2Ey(;`N zb91&=!q+y@D?~pie%CAAoKpa=JczL|v;9+rOlQ8cYb{6i5SB3LUuQS(+avzT`Chpd z$RpCF+&;?uTe8uRm9cvtwf5i2^vXB)tIp2k&ADEA{eYq~R6p+U@>j~1$L2YnJb1Cf zx`1c=vsFqS>Ks}>d@;w>hxIJ!Z(1-`ND90Lf`K0!v}R-#<2kx2aMHTWfFp4@a!Y_2V#MZy=z^r_lwlY)FqFdR09bHk|n@){tL|&>h-%*jiEAFT$xD9D+_-$a207yy{N; zSlVq8+~f2#7^G1|y5=AYM3ZK#Wyv3=luN9{H9(`9Ekfikeev;=tSl4cr1YiaC1&bz zNhDR};Zmf)o-=QZ|er|^(jzc6L2;aGu zm6fBlX9N?IaGy zmImj}F9i^&{^<)GR#&~j!l(sR-KFJJ;zH#S2YrT9qfr_S!eq@su)%xY$Ev|0pS7z* zT}kyIxi{J}VBNJ}K0s17s^|g-#md zc>^2!0}lv$BG554CqPt1T@m5bMc3TBw#D28&St`ZCvef=Czbe+()iUoeWMk4q0X_K z0demA3HcIU{se-4wfctEmiW-Y(@yJv>_QngM!Z4klvr{$YVre$zF72nw`_3*jo!t6w1{R-m8Oz@9?A!l77MmIP?n^?^T8XkOg3)VJ?2l$#+S42~{no?T1wSXLXPv z-t5u+@{6yXF{4L+*Jm16&u!vOusoN}Oq=@QU(_uV1baGL(qUL! zW|bgbxvxkje1W@}V+E}XW5rmR#DQ8*cCa{|%Mr1^n_#H||Mqh>&AIYa=D2@^-?O9{ zJjj(2SICn#KPXkI`o#O6=MDOpXGp+SOaqn=EFKoqaNty{iD05JO%#Y`dxgx3;a{b6 zZ0WLYo0nsxGfEW6JgL?GULxe)X6SMSlpmA-1>6~D7v{``5&k(|5&n4{{(=ro9oBWY zsDpVgWTSFE1{-YY8g9hZyzsB-kT%KAOeeX;jT35;@U6VJkaPbkQ{{X)Upatdp_Iv1 zzAIF@RX)j|j7rb(iRAwnaw>e#I}!@skx=xGgp#=tGB_BV8=>so2$Md4Tg5vOrd;+m z^0~R(Z8JW1+pN#sHs^D<&HLPKyL|4p-L|akfl&UZ`Zo&bP2PE6hG|h1W(pxlG89{a zv2&~pyC@Rm4JS_6G^)BrLSy;ojEtGl8wz{MR}dHX%c_PSmmX&t6y(s7g5XAon5e54 ztS%!6aT$}zOhJ<>Ys+5ZbWC0#OXa@*-)ilxIX<$%pcxBR%q&G>IDsOu|0hxeV`p+Y z%q31w;0SRnW-5`9w>~j8&{Bw@Ng+wxw|7TSgCG64PRz^WcpYwx28Me0V$2s_vt$&c zl}j(3@`*IKXepSyo6EOKwqVyI3oY{TQgljg1rZ`+=W%le;nCP?wl>e71fTsH#lZ@k zuM0b%t@DSCBW-GOn6Ju=tmFD)H7MShEJFatr6HsN*a{kC5*Y#~oWduOcg?romX%0S z$Jo{<12pd4;``!0tci=)4mc;GY=UZm_q;H4m;jRj8iWX1lLb}zlyoNttP|A+Nn7KG zkX~GdWa*$QD{h7QfG#*r1aT-efDfa~J#Cy4ymFvg`qtzZUwi%R%daiH@#V9tvS#Q{ z-?DO?<`bRe(9xO<<3qQwM7W#>y~5UEi_2G-7I_aWLqX9p4U~L_f){$l@CC9R6tQKv z`~+oN|4$wRakC|2J4DbO=dierIzRgbjdH)_(5FA=Iu_Y#deW(dY8`omlhN(ZjewPE zBUSsP4nL(sQg`@^`uU&g@So}MH+1-$I;3357?POTABrLEvU<1K&|jSO<`~C3lrAZE;SDUhZb@R^}!y4GUK!VQaQRIQ>^C-k)Y# z5v1rs3i}GhbI~j%BES?=KVab_Fg;%5Guj2Q;y+dwN}OcO;;O(y*XY~bMQX8HZiD_H zClWp4He+BS=Rc0O$?&KQQs=e4!2*;uj5!y2GZ(vjJbL?u;i-JppVG+syCco*SM;=@ zXH=jaKDVqE1Zd5EclTh+U9rSItfs4z)^r1S<|aV5MzehZ%K>r$OEHv5;}-TKx9+>U z@Of>(-~@fQ8p^CZ(yNRTC4gNFe~`+RE_^Sk4qAlt`Ao-KO&NZdr!K1^cg=z^`UPzq zG1UG4f*MF1VGoS-Jp5bSn^Kq6j||BLwEn>j(;y-w2HBzRD&k)wMGB7Gm7@;BZpopx zSCN%B87n#tC}enhbFV^#Opv_rS(m-o7SV|Ax~9=_=aG$<^?E8eVIa8u~ymckr-Ix z24@Ip0-WK37lM>hM zEo0-9_KnOrSM-p8WYipNQql_6)Z80`Y3vh2a1wY8P9Nq3lyY;4>26D&ve7|VT;+Rx zJ42W**GZa8+GGd>Nt53xfneqC{ew^%fQy$g7Ki=(8kslvM91~U94jC|>F5Dv$Pk(2 z7lhK~z`t3LCE7ShPA2^=p1_OM=F5~ur+w(Ei!&d{UG5xJ!<3$FT;S=(l^+t+9I>pR zw6UYg0I?jPTm!kR<44b)>E81OKb$ZWuMyCMk)}#aT7QCU+p>U$;-}%C)xo%u7!m~i z@9KgWQNQ$>Noa#e(4QW7dldfHDm&bZ@Rzyv0kvPMvS#B)J z);H(7iZ_565M~+2{k(iYsWh@NBL+{JR>(eKOGA)Ro*u4^of}i;Tyq5;6KteVYwHyK zo7bFRU6Z4;10@rf@Wi*z#=GyHF@EgWis8MH(z^E;n|;a?QN`YPiPOapAnhfBXTp8# z39}qZqeuxeyUdU>S3vbeb?O7a(v%Y6FVPDi_Eo-E=H=uHH7oqjxf1?u-5n4oLh-3l z-1;%DeJq(9kX_b0CDKn!O%i521h$lbc&TSl0%B^*v?0`SNafDWos;YS%K`SB!cjCg z1&v$b#S|ki!GQ0;v@AhOx^u$KV{j!fN?`p6@^risZ9wu$S6<#;z$T=UliaD0;{?&2 ziZ~%REukG4BoFlG2ga(V7xicT6<=$A#{YIz+;tRxn_5q46peXS#1$CFWCjepZfGcF z=R3_OdV+(fGRs_TODG1-L|BWy5vSyygpAbh=m+x2(Sfv_F3GUOE7XU^QeY5e?9Vyb zN&+8#lC2Byhb-p9?~ynWuzS{f^9DKswa0)f-+kJH zOOsvL?uUC2lLtUXiL2r<5!+?;CmicwhqTb>W-5>qTg{S>@cRYQ38W3JEMU_WlUsw< z0*VE9oS<$L;5YQsL@*P^Mwrd-aQE{9rDHY)NU5as*_;-{YR&(U@aj8|0F(z)fPTkV z^@InLK;&k?4iK_+I7T3ZRHpjiMVQWjq&zqB-N@t4eAf58&3Ejl2$r30fU_#Q9 zEXCaiK85>vyX}JZ6=Y#iNOAPbF*08six$i`(9cHU5AcX-L<=+Ff2;GK(cz0a7}o7^ z21&=QYvf5_4=HCWHW^Jp>HRzjk-}fIGo{57psXniKG^7`_(J$wIuklBPl*U@_#H_M zH$Sa=Be-ZqSTS#~j?n9xpWnoqbgR|4XpsHHmZ6c$2 zP^3}ZDK=Aux`Km5>kP&VtwwPO>)cc98)bjtU+4bWg*{_U{2lJObpsk&<4obN>dfTT zU)GtSfJB5)93~W*4MiYAO&f>(8g_A##=jZrDEe=BtfOu8GA@2x4H?b836W$R}W=Br9qQGzFvh!9h z-W8B;<5FP$+!H>|E9(c5n@^2wLFe6v&d{HPFS+n0tb}P?iPUWy`q(-zd&H*2`n$pM ziw9j;<|@~)J>sp^<{##vzTjd4V(adw6x|(1Y4L(c-yww zSyV%}l0Y`vCrh1l!P1w|x;3I~(s(&}WA50LJK=sW4+%K=iKir_YsH7kbY8p3Ysae@9INk^F?Ssi;`iDj(9k|$L z>kaUhV~ZwYVgif`wE<@g>sT#f3DIqe+_Cp`g$aTXsGzEbJ)FL;Y6-B08e{oP#^xS( zS=sHrx857>D?wmdV`}M2VVI&otiHkI=$mqXi*`$t9PsC9Vpylg^vlFIzcj#BkT@(O z9z5p0Bt9nCLS{DUFXNh%wA#;XqaZkbtY;Pg?ChDP)d`5C{>0n&fR^$9=urG!nLV zGGH^WvB=TxJcm2snNC4lmUfD9GG%iF|bQZe z*(b^N7fQ^IVkKf3{YO55?FoC+tt(iCs)#FmWp-lY_DYCXCppm3Qrw2-KhRT4g*l zhnhRi)S{>UrkbmnqO`c(dxje8>x)$?L?`=GGviORn;$=v`5{Dp0(5QvL<3>IzCn>w zfi~sEj4!EtXr_yDIlPaj@Gu{TB_|Vq^l>O+y@kauxSDt_MR+7&ILnpo>dPB8M9q?F zoCLxG9H>>y`dpZw8nfbebRJyzCSI)AF10?XCK0K5ofk6FTAZ!Tg>c0l+H_JSbsRTG zwszB1f~7THq0JrLW7zk#_mULy^hpyaV&;)lld^^daaGG+z_+?%+Kcn(yDJ2{B^yE- z6HRI{YRgg_B7>448ZdA9oQ$LSWS?7A3WG&k;CDP#C`6k5Er&M8A9|$u5D5$)VU;53 z$T;<}kDqwr$>GPiu7nH6t=!Hz6F>Y!8X+9NZPATUJTxQiQN_qtS~cMn#N)2~2?mfh z?ffo}c^`7+()XqjD%gq}T2-mYYs;>zMDO6AicJqJJ1#8k|Qtdxfn`XI@fh8$pJ2`b>SKY;LuXP?&&NgN* z{@?X7sjq`Aac`d;M)<#-faTC^WrT z_KnW6687OY=ShT<+j@e1+)L)}B^F~1n-3ltXL?+RpR&R}F+Jj`8)JGbbQ>?4;m0wV z*q2~2J{u+?dCR#8v)Tn+RNomXV+NN@I2WEHy61V769_ebmdt|GFMH7-!cjUSvKwor zQQxw5_$pnThB5sALD2t4g8syay>ht_A{!GFl57kgKCHsOs6%Ra5SoO4$l>=jI(s?E z6lA<)59n+TpP5WW7%-0vp~(mfPlihvnurFnlk{@Y!!j0;m;C z37wB!pk|(1m~t|muxFez)QKiPqq`>Yozt02fJj%GROzCzegP~U-J0F3IsY<&9gy2i z80@S`fsz65%XJS7!ETIwO&G4&UTVoiKbjpCRc-*l=yNv!VE78hTy&y?hw%m^@D?`9 z8=3d^v;HT!B75ffjJ9)kE1lRanZ4A7+p338i7*xRWx2twD|Uo7Qs-||&*vzE<@5$> z$E}>%VT%k!fs*B+`itw6SYY!vSW`?ADr~aO-$7cb3f5UxUZroBN)fl?y`Pgp6aHRM z-1>t+?;om_nLTmk)4e?FqMjeqiu9dkvwBDCq9<-n>21_nTBk2LsYs<->1&xczoq=B z*UDEO>rFr-j$0cKQm(8g;#T_k?%VgZ?3+unB=^c`>rH;0Oc@J9V}oQoOVkh0(LsD0 z_W@XV7lFx{wH)VKj?KBT7ihN8@6<+_HLp7a(`>qiWr+c>KgXV%gJM8|S>?>^SZ)<) z)jctUP)@u{*~ZA@-T7CWZZGdxhQ-AFy|lfbefaDd+NSd~Zh2ukv>EURx@r@`R19mo zSHDYA~=z zX`0C)*cgpc3-SVm>O&1El_sQViIq*G6jVqv#P1^77Bf)SWZbS&hCuTo0qR_>WEFf~ zu{83ETsw-dZwx3Cawh#KA!k3x4Lw=huLDBM>!bS)1JsGp#*0NHL{2+ z$Dszxbx7rw$2&o7;TjxFUJX1L=J?ItWdERE!FwkZOGsRaBX( zhDaVg79Cx5RBysL5dJx>c6-De(3z1r8wQQ#kdG@FoaJ4cSlVryP;x$5@QmXeBTVD} zqJ~dtK=yNz0pNxFbU{F#F3TOx?&l<#9Re@pa}a3~IE(ISYMtg|Av!}T9Y@#Fn)5$3 z7b_0PFRzVb2vVgiwgG#-8b|ZWqL=u<6!sfG>Gq%<;LFUFpQcqqN~&S-2rvZax`2`6 zBva@f9O}3N0{rY7a;hYq=1B;as73eeXX7ZeMDa>lxR0$u2Qo2&+;o;0nSD#hjL=Gr zo3iiLy>(0SMJ%8hsj&$;(*A#@1`M?S@KF1QM3IHk5(%Boz+}%X%#ZbuG^xzRt4IcL z=850Y+5e%#AL{TkIv7zA8ij_YYQunJl2AnRDZB-eSbnkceyu3+Zjl4HL<*H-<=y4k z@(bm|<&u?MrK04I=Q7Xnv85_Q&X74KRl)YPpZD&NqIZXsygOvVuZt-AbrF*mCb_F$ zG@nBEKRV@8$2dD=HAPCaRkMzzBZpkrA#FWdaKr{u^kN3lq(e(EAq2sL5iik=lc3o0 z1F2pNx?AqxR5-7`d9)%#erRipbm@eTTu)=mglhtd86EHAWWeZ{H=|>2YrpN@1|5qT znA|$fpa-!wXGs#0_oQxpONW1|!w6yt1Ga@&dToY%qPnvNyfk}^+M+*wi{hT3qj=XQVXYfkW;$rvuXVYMDR=o}e`=55r z_iHE3++yYd=QGf>5=BXbc1B4Hkz>z?D9vyN4iApldOturl8{w!LA6-Li^_raG+jiz zG|2q~=i$e65Da5NW1_mL1Fj5k_b>F&GlS%hwU8GN(jQ!p^D|H6~jOAolAQx$}gNisW-RZNHK@{edNzf>jLM zv$A|CJ(V;4L;!ifpbvoj4p1JRmW(eQg^i6y(8RexlE`!&fU5VY9+S7Ht3l%YT`VX_ z>XCiI%_U~24{sU()xh$^1ZpDaLd`vbnlsAEobWCvhZvB(VZqcUgxYd6MShzI^nX*H z^SAgi_Q}W^i481Ao`1?ec?!WmCaK(@U4@xpH-wCEzCI27BlYY^95PrLu^7Ro+ zxzCNCRrdcLp8RXD<7-2BGBxm?A=ypS!>IN&CsOwb{KD4act_6hh6lM76E_n;c9NpL zp?7N1WfEexllY`k_TCC7ao()>t;<|LXzr=9y*%Gn>-8JMsl@ z$n<4%*OMn``lj=!BBnrE$#5|s=F}DFTh|`ya1dowPSe+<&TV^9eN~J5<&BA*4)OW` z_O3H~Tk=9UhTCn1(mq#-XVSNu;LKiUi^<%2G4 zhHXcY=;xA|C6VaxX(yDVW0Zv;q{f{e8JO)QueLTmg#r!r@(kRU~< zr@G;cDiR05c7@I4*u z4fgRpLq6OCe9s04gF}4J5zTfF-}Awd;9kCW1@{H_^Szsd?jPWLPjEE&Am4if3BJer zlds1sjO!o3CVMLNPip?u2Pmc%I7ta7VZDz$b8D1crd7AR*hoxlfOyR{_?HB2&n@F%y;S%aEiCqR~ zlhA!|m+rFB9ehB$l&VU$nyI&%UAgJ3(Qj-bo5wj;trUSyD*#<-~*-N^#-Zq z5oa)I)khM#o^}_jYI+@)vRg8p_<|Gnt^wWeZ5pRZ^$Ih@J1H;4&8x=MCl()b8X7LT zv>xZKa6UA?y`&YbV>ithPp%v3p(0SYW(f4jsukhrpA#YO$)Jzc>zRh{eVX zQwypL%i>ZyR%0vZ94GW`)t*T%?8)|5GnVWuOA1G@JW%Wy>lV+aNwHqntWnDObje22 zT=1`6ef=t7mdqCI$mF6GT0oBs%a+?o>3b~d4Zunb&}fazy)%+FkbIM*GeSp=y~~L| z+r{^cZtKd+65tX`M#Dh;q27C!zXO2(;e#Zw7jAAewJT-}b7G+I^tp|9p$yC=rPfPu zDgl5_pcHPaQKepT(Vt07M!e}>{65;KtY!ndAPiRJ16G-JqBQ3%K5#fSLF|E-Jt#g0 ztb`Y)1DS03mwF_V*)$$ov>5`cuSd*Rs-KbL-pa~a`#7fj6K-0L2ZMvoo$K6vN~vMYpNF22QbsvZn5rZwa)LP?Pm(EYx3cRC$-nCl}S27ObE7m zxP;A1yJySIY*#&do3CPUV~L@F(iIm%LNlDHI;q+d^3AsNfN?GN=M-?FX-XgTSsK^d@7S zjb=SwR!QYCQ&1>w8@Aw-EI97C^mb!MV}x`-0ah=@uv?x?$i~u{v#WAp>rdYjicj;2 zzRJOcYiw15Y_BZGvJ#Z@u{c(V!N~SHFZN1`{Rz(?IJ1jU_`H2jTr0H;E{uaRWs7Z{ zwAj{4pqi#Ey~Z>S=}c|LQfbVR^g2_U>s2_;o2G!n%oG`EA7>VJvDX9*XG0X@%FYb? z8{7*2D;;Em>lZZJ`qQ8V7|7-+Br_lkR1+%vCn}^xC;g&L*nZj6C8n1xVeU`(Np7o} z`|NgRvy65AHa>(SNIB{Il{>BlQpjDslR8u7;e^gAI{aDvJgdW$eh#Z-W|aRU$=~-; zB2ze$n=Z%{Tp?YQi$qP2-QC8jEh}9Td`gw}r*D01)C2>d?>tiP#2zWlwhPJ4HzXJu#jpG=t~=ww z$SeOoH;yLAl?9kPwSE4PV{Hsml1-a1M@L;C$@YDUu*^N zK*xqkCmmC#c+xr-eT9=7xple_p5>beiHlj>(gbMf*M2nlw{VlJ7sBT|MRPbQnxXJE zt24Jw2E`Y+FFOd16u`6fN>IF!yOF&`w-fi2ECb~qCSs^(HELdUN~-ZXDR-{R%vtXK zl^7A7q+!?>ZnqKo2lf~1TwpEO`3ojCm^c;hLlSdZb5ac}8gVK)Y7_^x#9b>!_?;ZP z5>tPErW`bma!$C1iEmz1*V`N&c>5GO#m1K8ECe2>6v)irIF1wfq@Fs-P;SI?4J0Zb zr+X|GJ|r_r#z-`xkNYPQA=^tIyoBAsn^$7g z&!R%6dm^1hBQzj&W+V^V`x3e(GA%UR!^bS-grsFJ=ED6q@|tHi@;6wL@J6PS1?`B- zvh*xi6}KJ^3NhL(6kRaQ5D-+S0pSQI0AVjc00fFnJ_y1M0YGJa1aU58*NsfL$AO}Z z=wP{N`^6U7WLs_`n$2-9B|bR-f@j|c2;$my0tztK81###hw#fLKcRtgyX@mD9TJ91 z*DXlbZat&6Xyla=iv<=R`Zn4_;Hlml7IiS8#XQ<%O3#D`IP?qWHaA-_Z8fw=$kJ^s zb4{A#u}9RT-D*;?3==Cr;7eKZhURcs9@?>aLj)?}Xa}i9fm;M+iJvK406R13dJKiT z^4a4gc5DI3Nkr7EIWbPwLC3DCR?2vHd<`Xk?%+3dzAnMe3D5QwdpYgK2BhJqY z2I@tIh^j$uGgNA5HfTl|w>hCcJHcdH{eJHc;0a#2b)(3_4;?0seEV;nM(FY|Ty!jv-1)w|_W88xY zJS0l!lVWW~Gt>rI!_JoQK!89=glU~At%@K3QiuULftnt$Z>^_4Mh16B>@m>slF|DV zDM>4~5`&I@7%;?TEwP0g-FfW+$!ZsdS;jU*?CBMLC3g@2mK&TmYzfx2~c> zpgNGmLcT6Wu38{`n++yD?KgNJHa>d(Ek^KK!ENS1uZsqW8&~&sB!?GOH(E36K6(C# zfBpvto`37DjC(c>z~;G$@MqAIv+MG#O+G^nY>erk2!XPBQn4LD!(9UAJskRzFUI-S zT{Gm7C`ic%?CRF%8a$`$i78WYnWtzC$dA^kjT3NbW>S+Dm zjZ803Tsj0}5@{r;B;rS#9V%&LhNSyDgaQ06Wq&{|QVql%3@{jJ5ti7HE)w=D}eSx9SZ{WPPJ3Gom?cM4Vho{h$(K^ zA}aAhvPM!!!UpC$zj4)|@fG9Z(DDX6w^{@n28H>3S2(OsxMT->JEmFbU=V z!dI9qigeI3g+rAMSs~$*=rdzh6Uy$1l7i`!`vfeF9V*a0OCQQRRV-bM^WzR)3rbhc<78rZ(n z3^&_q;P`H*l_dsM;A#HjI@F4|R+SJ9t~CUQI7g6A)ay{vmFSlo z^2xU|1OL>YM14tCpWzez8a%x>a}%|zL$cEj3vaK@cC-OIvahTyy{TrlH>0gdk%05) zn_3=~Sue04k<_@iayLs@mgm~LxmV)eXOVd4+Q_8W=6ZAZZrHw!W8(2K74U|oQJ)OI z60q>FT_KlAW_^k{Y!)GgU+u0z4Z#SA4+b`A%VGKq3+g5S$(kN@7St=+g^@%QzcptbcW z?uT5br}iAz=`Aw6|5k79oHEnC%pUIjGG+Gh{U39EM%UYNU+8VW%#~SPF%fxg$&B!3 z$T=HU8Cy$ccP8ElC(kC}-Fsj2qSIjd7iXA!ruta-L#JI<7|(6QrZqDY!H888@`6Gw zqs8vS%C47Wc#bEno{@wQlT$jx#x)7Hl%lRg;JcY@AS}!Q!5C@`|TMn#&|i zD4a9#Ktkdj7R)mxy0_SU^7iM9+89A}J@VT!qz{qzOrkJ*`*h3?~ zK)hXJtxoi=a*}xfk-5->D9bB4pk$bNR58^*FBRz=Cz;}W_8>+U?T=b=33W)RBNu0h z<>^YdW9L#9-LIUMfGS76EeMUBpar=$4)Rfo9?Uh`tBA7-$L^dP@-*f)ulMpNPd4pv z3gr?#Q~Ciu#HU^>@?E;}3%xA1nV-8hfxbU+os~T#Adt=C36?71)?l_yTr0l0U-ZbW zTQ{rQE2N`bf`XNy7ZVpt;a_4YGYgN&gqkC%<>a+WZ}Mgy+Bn&p41ZK9FFVB^G{aVz z;9%@c+F8ZuXQfwRo)@@kzjcTAxo2om^2~(0!xCq;unY~T^h)lyK4I(MGQos4zQhY( zK16E|Wo{CP8C0OtleDEs4~y5cP^5}_pVV@q$5xin0|6AiSJ3iQdhX~HOSz*LY`e-A zxHjD@I#&=Ld|z^5W~sY-Ngm{wk996LSKW?V-^xDvt?b7Wt30qbE72Q#o8^txz<0D1 z*I9v703*i#I97P@C ztSxE(2;{>&qwy~^pI@N13>IPgXS3JM<9J?@lZ1IIyYW0J6lO82GWWT{8VQ@x6#l}QC50rxWgO|vXtwAm=~UO&FWZgsQHQ47^&#MVTnBemgt=7)z< z1YsOjGKT9}wgAaJ+L8=d5si%u%|1othxg=}vh8;$-z$)Xkl!CTu|%VOYSo9nMPKgbs?~1pDzmJ-wNrzw#lf6pY#CmpUxn@;#r7dF?3OLV=xF`G8oU;>7n*|t$I(SZl`jz(m85%>%P>*k zoy7_fS?S=2JCS{=?n5>b4alXq$MoqVNWJET$s(!8tg7fa&6ax{>B3d*_J=T?#!MV8 zz}ZD<`PUBEiQF^TCGq4T$2;>tmA_;nGEgav(u{YIBtXuOch)=(h*B;(A`M1xBWcL{ z2(?_+Ao6@V{k)=pQ026qlupC~9o|2~8BD;eEbjZ!I2+YDkllP75{1=z?a_ zChr;uE_^^gkLmCrhao4h(V8heGvfMDWml7qLrc_Y(GwP%-QzocM|ZC}uIXl-U*iO4 zsK|n`GASnEehE7wF&5_~Pd|Bbl(P!aD0i_Cp0j9xNxlsb-Wg0OyJAm;=Wvti$?SCl zDO1x&UOJ1$#DKThbnLRaYFg{PIuj|l4Iax=4ygics24`zBG=hlf{RpSrPvo-_Cj&R z@$g_C^ssSN40@0S4E^alky^zSe9*&Dx&dcLG&#!XXCr>gd#v$RQZCU{K!D!m782_H z&QtqI^~5NsJbXiF{%I8&8Cey2M?DZh%s@Rgs@+4r-M0rcEKDz*;SUexnX@dAo*n0& z4DVMPY>BjV0Ox}gi*i%aT4?BLo=0;;rmeCwqYHB0{V1?;`Csm5mgVsC+P}*4@SyNWpsE6wI=sx1nYo<$KMkO-e~H#5X!(|X;>LSt90ib7>~4%HSLiszRGXhQ!7mO!tzS9a9Lik4XaDakclK z)4VcP0bL-j0Y&GaDCVvhc~a98)5QMtEjjcwAKL*sAp>2$K0q?mxeq{i@}ereU+BS|Cf77?GcNAz*0_E_wDJ|eJ8GPwO>`3Au|QbzKL z5>i;|79=eX#KRXy`rrb!1a2RJ*3aV%8Kqm&S$^ssuc1LqkJl|Z1o{%H8M1?=j&+c<^ zPa!ur!w646#KaTH8YL}u)KcYiM$3Rh;D{zebb`GtJJn+W=q#)@6Pg)_!p8-AznK0B z&RxilaIBxFL8Buf68|?e5{kEUW*+fDDfqViJIX(tFddP>ML3CYBpgfdtilh;2e;VD z)8RRu7B%V)u{?^e`8#TbYRSOCVz?}hhSwwpBVmIu!LY!BMJ1CCGr$U9weQ^-g$Lm&~qugtO(T+IG9CmEQCxyjS<` zQ}L49BRo7R#Q4X${6FjPkPaWyLG&_wRfpGf_@WM9(&3g4U)SMr9sZRLN}S+$j^rL2 z2QnVSNw}hPLhPhmJdUttl{!eA}?-{-y=CjCWWBw!a_w)T3K7T4xnSbX00Wce&#Q*>R literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/decorators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43ae84a5cb6daa25517ab3cace3e07909afde6e4 GIT binary patch literal 11496 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 P*L83S{N07W5SRWNTb70% literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/globals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2200e006600b2e366d093747e3e7e4c8b09266a6 GIT binary patch literal 1898 zcmZuyPmdcl6t`!RY&M%+M4=TuAejnOg4$%aV#PK>2&kyEmk6~vz)C1_#-5CKJ>!w> znf;@1VSD8}bdQKTA7+kls`v(6;MtRDcTp|HV?RH?_w(=l$+z3vJp|*AKkxqZcN?L< z+@={JEWU=H8N57q_s z+Hip?sgQIb>)>%9Kcdbt7R6F0mPAm#rTdsPC8RKW(OVz*b z6H2O6bMzb1TTnm$uo2`*Ni83hRF7gM88AFb^=NTCn;n?_?2D3p9?kOd(XNdTmd9G| z#ruyRkEWws`S3>aRbtKen0LRT0g7CY^+ zWqYEBIs{XbK}&bwTXknMCL%kVRXxaF(4?$v} zl^_)8TQEm%*$gN5@ONNQ!@q)_#4vykE1sC@AnQ}H^``5w-LuL1lD71Dx$6~6?aV;&CiB(QP`mKbTAhSi9sJ1U{*% zw#Ndy+aT2My2*3*hQQm<=aeitkO-(}>j&Kj%{oilUC7WL?qYq%*~L!>crw_iHf^Fg uWzZG1BexEf%VVDn+R^VXTyyuvXZOogu|o2%+#j2F(+@jg?@qVfZT|-p-VX!- literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1a6e5d3e6ad4faa5f0de76fa2ca29e3e77b4b92 GIT binary patch literal 11485 zcmc&)TWlQHd7j(O&aPGzMa#NXaVAPEX&sA_ljdTTapX&!I7Ml-QsR`6vpd|GC3m?y zyF4>Xk;E_$mK)1OjP!<}4}Bn8v_Ol#6exnCD9}6?DA4D5=tJ}5KBRpt{L+5ke`aS% zno0ZCA?M7T%bd%9zW;jmmD8u|2Ckp{+oiXEykrmW{7eed4 z(YzRJT82^gadig0&c@<6P)Veu;QNQJx|BRv?*6 z!HysJozZy59|uVq`CT;{`sq3whlAeg^+b9ZjZ+zA+S8+6x-PA{QIJkll=vzdj<(Qu zx*nwdqsR|OemqM3I6@iwJlf4_)Cnd@#D=}$cn}SvIAwoBzZd(ja#j8)#>CcpYwMBn z2hmnE@NaZSdX>ExD~UUipYDt!e?5pX(|GN9e?1zEeKZ;dX^H|L73gDtX$(gyYA#MG z68Ymn5c?oZIw~eEE#w0>)l|U9k&i_wKkW^pLtm>XNHD#Wq{V;WhrMnWjj@J;(j1w~ zFX?uStU?WrPikS^7%0F!?WY5Rf)Jlu+?FYQp3hb88aF0VYNY&OlqA7gq_<}+iX#

    This is a doc

    ') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('this is a fragment') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('

    This is a doc

    ') + + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('this is a fragment') + + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of
    , , and ",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("
    +    
    +    
    +  
    +  
    +    
    +""" +FOOTER = u"""\ + +
    + +
    +
    +

    Console Locked

    +

    + The console is locked and needs to be unlocked by entering the PIN. + You can find the PIN printed out on the standard output of your + shell that runs the server. +

    +

    PIN: + + +

    +
    +
    + + +""" + +PAGE_HTML = ( + HEADER + + u"""\ +

    %(exception_type)s

    +
    +

    %(exception)s

    +
    +

    Traceback (most recent call last)

    +%(summary)s +
    +
    +

    + + This is the Copy/Paste friendly version of the traceback. You can also paste this traceback into + a gist: + +

    + +
    +
    +
    + The debugger caught an exception in your WSGI application. You can now + look at the traceback which led to the error. + If you enable JavaScript you can also use additional features such as code + execution (if the evalex feature is enabled), automatic pasting of the + exceptions and much more. +
    +""" + + FOOTER + + """ + +""" +) + +CONSOLE_HTML = ( + HEADER + + u"""\ +

    Interactive Console

    +
    +In this console you can execute Python expressions in the context of the +application. The initial namespace was created by the debugger automatically. +
    +
    The Console requires JavaScript.
    +""" + + FOOTER +) + +SUMMARY_HTML = u"""\ +
    + %(title)s +
      %(frames)s
    + %(description)s +
    +""" + +FRAME_HTML = u"""\ +
    +

    File "%(filename)s", + line %(lineno)s, + in %(function_name)s

    +
    %(lines)s
    +
    +""" + +SOURCE_LINE_HTML = u"""\ + + %(lineno)s + %(code)s + +""" + + +def render_console_html(secret, evalex_trusted=True): + return CONSOLE_HTML % { + "evalex": "true", + "evalex_trusted": "true" if evalex_trusted else "false", + "console": "true", + "title": "Console", + "secret": secret, + "traceback_id": -1, + } + + +def get_current_traceback( + ignore_system_exceptions=False, show_hidden_frames=False, skip=0 +): + """Get the current exception info as `Traceback` object. Per default + calling this method will reraise system exceptions such as generator exit, + system exit or others. This behavior can be disabled by passing `False` + to the function as first parameter. + """ + exc_type, exc_value, tb = sys.exc_info() + if ignore_system_exceptions and exc_type in system_exceptions: + reraise(exc_type, exc_value, tb) + for _ in range_type(skip): + if tb.tb_next is None: + break + tb = tb.tb_next + tb = Traceback(exc_type, exc_value, tb) + if not show_hidden_frames: + tb.filter_hidden_frames() + return tb + + +class Line(object): + """Helper for the source renderer.""" + + __slots__ = ("lineno", "code", "in_frame", "current") + + def __init__(self, lineno, code): + self.lineno = lineno + self.code = code + self.in_frame = False + self.current = False + + @property + def classes(self): + rv = ["line"] + if self.in_frame: + rv.append("in-frame") + if self.current: + rv.append("current") + return rv + + def render(self): + return SOURCE_LINE_HTML % { + "classes": u" ".join(self.classes), + "lineno": self.lineno, + "code": escape(self.code), + } + + +class Traceback(object): + """Wraps a traceback.""" + + def __init__(self, exc_type, exc_value, tb): + self.exc_type = exc_type + self.exc_value = exc_value + self.tb = tb + + exception_type = exc_type.__name__ + if exc_type.__module__ not in {"builtins", "__builtin__", "exceptions"}: + exception_type = exc_type.__module__ + "." + exception_type + self.exception_type = exception_type + + self.groups = [] + memo = set() + while True: + self.groups.append(Group(exc_type, exc_value, tb)) + memo.add(id(exc_value)) + if PY2: + break + exc_value = exc_value.__cause__ or exc_value.__context__ + if exc_value is None or id(exc_value) in memo: + break + exc_type = type(exc_value) + tb = exc_value.__traceback__ + self.groups.reverse() + self.frames = [frame for group in self.groups for frame in group.frames] + + def filter_hidden_frames(self): + """Remove the frames according to the paste spec.""" + for group in self.groups: + group.filter_hidden_frames() + + self.frames[:] = [frame for group in self.groups for frame in group.frames] + + @property + def is_syntax_error(self): + """Is it a syntax error?""" + return isinstance(self.exc_value, SyntaxError) + + @property + def exception(self): + """String representation of the final exception.""" + return self.groups[-1].exception + + def log(self, logfile=None): + """Log the ASCII traceback into a file object.""" + if logfile is None: + logfile = sys.stderr + tb = self.plaintext.rstrip() + u"\n" + logfile.write(to_native(tb, "utf-8", "replace")) + + def paste(self): + """Create a paste and return the paste id.""" + data = json.dumps( + { + "description": "Werkzeug Internal Server Error", + "public": False, + "files": {"traceback.txt": {"content": self.plaintext}}, + } + ).encode("utf-8") + try: + from urllib2 import urlopen + except ImportError: + from urllib.request import urlopen + rv = urlopen("https://api.github.com/gists", data=data) + resp = json.loads(rv.read().decode("utf-8")) + rv.close() + return {"url": resp["html_url"], "id": resp["id"]} + + def render_summary(self, include_title=True): + """Render the traceback for the interactive console.""" + title = "" + classes = ["traceback"] + if not self.frames: + classes.append("noframe-traceback") + frames = [] + else: + library_frames = sum(frame.is_library for frame in self.frames) + mark_lib = 0 < library_frames < len(self.frames) + frames = [group.render(mark_lib=mark_lib) for group in self.groups] + + if include_title: + if self.is_syntax_error: + title = u"Syntax Error" + else: + title = u"Traceback (most recent call last):" + + if self.is_syntax_error: + description_wrapper = u"
    %s
    " + else: + description_wrapper = u"
    %s
    " + + return SUMMARY_HTML % { + "classes": u" ".join(classes), + "title": u"

    %s

    " % title if title else u"", + "frames": u"\n".join(frames), + "description": description_wrapper % escape(self.exception), + } + + def render_full(self, evalex=False, secret=None, evalex_trusted=True): + """Render the Full HTML page with the traceback info.""" + exc = escape(self.exception) + return PAGE_HTML % { + "evalex": "true" if evalex else "false", + "evalex_trusted": "true" if evalex_trusted else "false", + "console": "false", + "title": exc, + "exception": exc, + "exception_type": escape(self.exception_type), + "summary": self.render_summary(include_title=False), + "plaintext": escape(self.plaintext), + "plaintext_cs": re.sub("-{2,}", "-", self.plaintext), + "traceback_id": self.id, + "secret": secret, + } + + @cached_property + def plaintext(self): + return u"\n".join([group.render_text() for group in self.groups]) + + @property + def id(self): + return id(self) + + +class Group(object): + """A group of frames for an exception in a traceback. On Python 3, + if the exception has a ``__cause__`` or ``__context__``, there are + multiple exception groups. + """ + + def __init__(self, exc_type, exc_value, tb): + self.exc_type = exc_type + self.exc_value = exc_value + self.info = None + if not PY2: + if exc_value.__cause__ is not None: + self.info = ( + u"The above exception was the direct cause of the" + u" following exception" + ) + elif exc_value.__context__ is not None: + self.info = ( + u"During handling of the above exception, another" + u" exception occurred" + ) + + self.frames = [] + while tb is not None: + self.frames.append(Frame(exc_type, exc_value, tb)) + tb = tb.tb_next + + def filter_hidden_frames(self): + new_frames = [] + hidden = False + + for frame in self.frames: + hide = frame.hide + if hide in ("before", "before_and_this"): + new_frames = [] + hidden = False + if hide == "before_and_this": + continue + elif hide in ("reset", "reset_and_this"): + hidden = False + if hide == "reset_and_this": + continue + elif hide in ("after", "after_and_this"): + hidden = True + if hide == "after_and_this": + continue + elif hide or hidden: + continue + new_frames.append(frame) + + # if we only have one frame and that frame is from the codeop + # module, remove it. + if len(new_frames) == 1 and self.frames[0].module == "codeop": + del self.frames[:] + + # if the last frame is missing something went terrible wrong :( + elif self.frames[-1] in new_frames: + self.frames[:] = new_frames + + @property + def exception(self): + """String representation of the exception.""" + buf = traceback.format_exception_only(self.exc_type, self.exc_value) + rv = "".join(buf).strip() + return to_unicode(rv, "utf-8", "replace") + + def render(self, mark_lib=True): + out = [] + if self.info is not None: + out.append(u'
  • %s:
    ' % self.info) + for frame in self.frames: + out.append( + u"%s" + % ( + u' title="%s"' % escape(frame.info) if frame.info else u"", + frame.render(mark_lib=mark_lib), + ) + ) + return u"\n".join(out) + + def render_text(self): + out = [] + if self.info is not None: + out.append(u"\n%s:\n" % self.info) + out.append(u"Traceback (most recent call last):") + for frame in self.frames: + out.append(frame.render_text()) + out.append(self.exception) + return u"\n".join(out) + + +class Frame(object): + """A single frame in a traceback.""" + + def __init__(self, exc_type, exc_value, tb): + self.lineno = tb.tb_lineno + self.function_name = tb.tb_frame.f_code.co_name + self.locals = tb.tb_frame.f_locals + self.globals = tb.tb_frame.f_globals + + fn = inspect.getsourcefile(tb) or inspect.getfile(tb) + if fn[-4:] in (".pyo", ".pyc"): + fn = fn[:-1] + # if it's a file on the file system resolve the real filename. + if os.path.isfile(fn): + fn = os.path.realpath(fn) + self.filename = to_unicode(fn, get_filesystem_encoding()) + self.module = self.globals.get("__name__") + self.loader = self.globals.get("__loader__") + self.code = tb.tb_frame.f_code + + # support for paste's traceback extensions + self.hide = self.locals.get("__traceback_hide__", False) + info = self.locals.get("__traceback_info__") + if info is not None: + info = to_unicode(info, "utf-8", "replace") + self.info = info + + def render(self, mark_lib=True): + """Render a single frame in a traceback.""" + return FRAME_HTML % { + "id": self.id, + "filename": escape(self.filename), + "lineno": self.lineno, + "function_name": escape(self.function_name), + "lines": self.render_line_context(), + "library": "library" if mark_lib and self.is_library else "", + } + + @cached_property + def is_library(self): + return any( + self.filename.startswith(path) for path in sysconfig.get_paths().values() + ) + + def render_text(self): + return u' File "%s", line %s, in %s\n %s' % ( + self.filename, + self.lineno, + self.function_name, + self.current_line.strip(), + ) + + def render_line_context(self): + before, current, after = self.get_context_lines() + rv = [] + + def render_line(line, cls): + line = line.expandtabs().rstrip() + stripped_line = line.strip() + prefix = len(line) - len(stripped_line) + rv.append( + '
    %s%s
    ' + % (cls, " " * prefix, escape(stripped_line) or " ") + ) + + for line in before: + render_line(line, "before") + render_line(current, "current") + for line in after: + render_line(line, "after") + + return "\n".join(rv) + + def get_annotated_lines(self): + """Helper function that returns lines with extra information.""" + lines = [Line(idx + 1, x) for idx, x in enumerate(self.sourcelines)] + + # find function definition and mark lines + if hasattr(self.code, "co_firstlineno"): + lineno = self.code.co_firstlineno - 1 + while lineno > 0: + if _funcdef_re.match(lines[lineno].code): + break + lineno -= 1 + try: + offset = len(inspect.getblock([x.code + "\n" for x in lines[lineno:]])) + except TokenError: + offset = 0 + for line in lines[lineno : lineno + offset]: + line.in_frame = True + + # mark current line + try: + lines[self.lineno - 1].current = True + except IndexError: + pass + + return lines + + def eval(self, code, mode="single"): + """Evaluate code in the context of the frame.""" + if isinstance(code, string_types): + if PY2 and isinstance(code, text_type): # noqa + code = UTF8_COOKIE + code.encode("utf-8") + code = compile(code, "", mode) + return eval(code, self.globals, self.locals) + + @cached_property + def sourcelines(self): + """The sourcecode of the file as list of unicode strings.""" + # get sourcecode from loader or file + source = None + if self.loader is not None: + try: + if hasattr(self.loader, "get_source"): + source = self.loader.get_source(self.module) + elif hasattr(self.loader, "get_source_by_code"): + source = self.loader.get_source_by_code(self.code) + except Exception: + # we munch the exception so that we don't cause troubles + # if the loader is broken. + pass + + if source is None: + try: + f = open(to_native(self.filename, get_filesystem_encoding()), mode="rb") + except IOError: + return [] + try: + source = f.read() + finally: + f.close() + + # already unicode? return right away + if isinstance(source, text_type): + return source.splitlines() + + # yes. it should be ascii, but we don't want to reject too many + # characters in the debugger if something breaks + charset = "utf-8" + if source.startswith(UTF8_COOKIE): + source = source[3:] + else: + for idx, match in enumerate(_line_re.finditer(source)): + match = _coding_re.search(match.group()) + if match is not None: + charset = match.group(1) + break + if idx > 1: + break + + # on broken cookies we fall back to utf-8 too + charset = to_native(charset) + try: + codecs.lookup(charset) + except LookupError: + charset = "utf-8" + + return source.decode(charset, "replace").splitlines() + + def get_context_lines(self, context=5): + before = self.sourcelines[self.lineno - context - 1 : self.lineno - 1] + past = self.sourcelines[self.lineno : self.lineno + context] + return (before, self.current_line, past) + + @property + def current_line(self): + try: + return self.sourcelines[self.lineno - 1] + except IndexError: + return u"" + + @cached_property + def console(self): + return Console(self.globals, self.locals) + + @property + def id(self): + return id(self) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/exceptions.py b/backend/venv/lib/python3.7/site-packages/werkzeug/exceptions.py new file mode 100644 index 0000000..fb6528d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/exceptions.py @@ -0,0 +1,774 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.exceptions + ~~~~~~~~~~~~~~~~~~~ + + This module implements a number of Python exceptions you can raise from + within your views to trigger a standard non-200 response. + + + Usage Example + ------------- + + :: + + from werkzeug.wrappers import BaseRequest + from werkzeug.wsgi import responder + from werkzeug.exceptions import HTTPException, NotFound + + def view(request): + raise NotFound() + + @responder + def application(environ, start_response): + request = BaseRequest(environ) + try: + return view(request) + except HTTPException as e: + return e + + + As you can see from this example those exceptions are callable WSGI + applications. Because of Python 2.4 compatibility those do not extend + from the response objects but only from the python exception class. + + As a matter of fact they are not Werkzeug response objects. However you + can get a response object by calling ``get_response()`` on a HTTP + exception. + + Keep in mind that you have to pass an environment to ``get_response()`` + because some errors fetch additional information from the WSGI + environment. + + If you want to hook in a different exception page to say, a 404 status + code, you can add a second except for a specific subclass of an error:: + + @responder + def application(environ, start_response): + request = BaseRequest(environ) + try: + return view(request) + except NotFound, e: + return not_found(request) + except HTTPException, e: + return e + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import sys + +import werkzeug + +# Because of bootstrapping reasons we need to manually patch ourselves +# onto our parent module. +werkzeug.exceptions = sys.modules[__name__] + +from ._compat import implements_to_string +from ._compat import integer_types +from ._compat import iteritems +from ._compat import text_type +from ._internal import _get_environ +from .wrappers import Response + + +@implements_to_string +class HTTPException(Exception): + """Baseclass for all HTTP exceptions. This exception can be called as WSGI + application to render a default error page or you can catch the subclasses + of it independently and render nicer error messages. + """ + + code = None + description = None + + def __init__(self, description=None, response=None): + super(Exception, self).__init__() + if description is not None: + self.description = description + self.response = response + + @classmethod + def wrap(cls, exception, name=None): + """Create an exception that is a subclass of the calling HTTP + exception and the ``exception`` argument. + + The first argument to the class will be passed to the + wrapped ``exception``, the rest to the HTTP exception. If + ``self.args`` is not empty, the wrapped exception message is + added to the HTTP exception description. + + .. versionchanged:: 0.15 + The description includes the wrapped exception message. + """ + + class newcls(cls, exception): + def __init__(self, arg=None, *args, **kwargs): + super(cls, self).__init__(*args, **kwargs) + + if arg is None: + exception.__init__(self) + else: + exception.__init__(self, arg) + + def get_description(self, environ=None): + out = super(cls, self).get_description(environ=environ) + + if self.args: + out += "

    {}: {}

    ".format( + exception.__name__, escape(exception.__str__(self)) + ) + + return out + + newcls.__module__ = sys._getframe(1).f_globals.get("__name__") + newcls.__name__ = name or cls.__name__ + exception.__name__ + return newcls + + @property + def name(self): + """The status name.""" + return HTTP_STATUS_CODES.get(self.code, "Unknown Error") + + def get_description(self, environ=None): + """Get the description.""" + return u"

    %s

    " % escape(self.description) + + def get_body(self, environ=None): + """Get the HTML body.""" + return text_type( + ( + u'\n' + u"%(code)s %(name)s\n" + u"

    %(name)s

    \n" + u"%(description)s\n" + ) + % { + "code": self.code, + "name": escape(self.name), + "description": self.get_description(environ), + } + ) + + def get_headers(self, environ=None): + """Get a list of headers.""" + return [("Content-Type", "text/html")] + + def get_response(self, environ=None): + """Get a response object. If one was passed to the exception + it's returned directly. + + :param environ: the optional environ for the request. This + can be used to modify the response depending + on how the request looked like. + :return: a :class:`Response` object or a subclass thereof. + """ + if self.response is not None: + return self.response + if environ is not None: + environ = _get_environ(environ) + headers = self.get_headers(environ) + return Response(self.get_body(environ), self.code, headers) + + def __call__(self, environ, start_response): + """Call the exception as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + """ + response = self.get_response(environ) + return response(environ, start_response) + + def __str__(self): + code = self.code if self.code is not None else "???" + return "%s %s: %s" % (code, self.name, self.description) + + def __repr__(self): + code = self.code if self.code is not None else "???" + return "<%s '%s: %s'>" % (self.__class__.__name__, code, self.name) + + +class BadRequest(HTTPException): + """*400* `Bad Request` + + Raise if the browser sends something to the application the application + or server cannot handle. + """ + + code = 400 + description = ( + "The browser (or proxy) sent a request that this server could " + "not understand." + ) + + +class ClientDisconnected(BadRequest): + """Internal exception that is raised if Werkzeug detects a disconnected + client. Since the client is already gone at that point attempting to + send the error message to the client might not work and might ultimately + result in another exception in the server. Mainly this is here so that + it is silenced by default as far as Werkzeug is concerned. + + Since disconnections cannot be reliably detected and are unspecified + by WSGI to a large extent this might or might not be raised if a client + is gone. + + .. versionadded:: 0.8 + """ + + +class SecurityError(BadRequest): + """Raised if something triggers a security error. This is otherwise + exactly like a bad request error. + + .. versionadded:: 0.9 + """ + + +class BadHost(BadRequest): + """Raised if the submitted host is badly formatted. + + .. versionadded:: 0.11.2 + """ + + +class Unauthorized(HTTPException): + """*401* ``Unauthorized`` + + Raise if the user is not authorized to access a resource. + + The ``www_authenticate`` argument should be used to set the + ``WWW-Authenticate`` header. This is used for HTTP basic auth and + other schemes. Use :class:`~werkzeug.datastructures.WWWAuthenticate` + to create correctly formatted values. Strictly speaking a 401 + response is invalid if it doesn't provide at least one value for + this header, although real clients typically don't care. + + :param description: Override the default message used for the body + of the response. + :param www-authenticate: A single value, or list of values, for the + WWW-Authenticate header. + + .. versionchanged:: 0.15.3 + If the ``www_authenticate`` argument is not set, the + ``WWW-Authenticate`` header is not set. + + .. versionchanged:: 0.15.3 + The ``response`` argument was restored. + + .. versionchanged:: 0.15.1 + ``description`` was moved back as the first argument, restoring + its previous position. + + .. versionchanged:: 0.15.0 + ``www_authenticate`` was added as the first argument, ahead of + ``description``. + """ + + code = 401 + description = ( + "The server could not verify that you are authorized to access" + " the URL requested. You either supplied the wrong credentials" + " (e.g. a bad password), or your browser doesn't understand" + " how to supply the credentials required." + ) + + def __init__(self, description=None, response=None, www_authenticate=None): + HTTPException.__init__(self, description, response) + + if www_authenticate is not None: + if not isinstance(www_authenticate, (tuple, list)): + www_authenticate = (www_authenticate,) + + self.www_authenticate = www_authenticate + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.www_authenticate: + headers.append( + ("WWW-Authenticate", ", ".join([str(x) for x in self.www_authenticate])) + ) + return headers + + +class Forbidden(HTTPException): + """*403* `Forbidden` + + Raise if the user doesn't have the permission for the requested resource + but was authenticated. + """ + + code = 403 + description = ( + "You don't have the permission to access the requested" + " resource. It is either read-protected or not readable by the" + " server." + ) + + +class NotFound(HTTPException): + """*404* `Not Found` + + Raise if a resource does not exist and never existed. + """ + + code = 404 + description = ( + "The requested URL was not found on the server. If you entered" + " the URL manually please check your spelling and try again." + ) + + +class MethodNotAllowed(HTTPException): + """*405* `Method Not Allowed` + + Raise if the server used a method the resource does not handle. For + example `POST` if the resource is view only. Especially useful for REST. + + The first argument for this exception should be a list of allowed methods. + Strictly speaking the response would be invalid if you don't provide valid + methods in the header which you can do with that list. + """ + + code = 405 + description = "The method is not allowed for the requested URL." + + def __init__(self, valid_methods=None, description=None): + """Takes an optional list of valid http methods + starting with werkzeug 0.3 the list will be mandatory.""" + HTTPException.__init__(self, description) + self.valid_methods = valid_methods + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.valid_methods: + headers.append(("Allow", ", ".join(self.valid_methods))) + return headers + + +class NotAcceptable(HTTPException): + """*406* `Not Acceptable` + + Raise if the server can't return any content conforming to the + `Accept` headers of the client. + """ + + code = 406 + + description = ( + "The resource identified by the request is only capable of" + " generating response entities which have content" + " characteristics not acceptable according to the accept" + " headers sent in the request." + ) + + +class RequestTimeout(HTTPException): + """*408* `Request Timeout` + + Raise to signalize a timeout. + """ + + code = 408 + description = ( + "The server closed the network connection because the browser" + " didn't finish the request within the specified time." + ) + + +class Conflict(HTTPException): + """*409* `Conflict` + + Raise to signal that a request cannot be completed because it conflicts + with the current state on the server. + + .. versionadded:: 0.7 + """ + + code = 409 + description = ( + "A conflict happened while processing the request. The" + " resource might have been modified while the request was being" + " processed." + ) + + +class Gone(HTTPException): + """*410* `Gone` + + Raise if a resource existed previously and went away without new location. + """ + + code = 410 + description = ( + "The requested URL is no longer available on this server and" + " there is no forwarding address. If you followed a link from a" + " foreign page, please contact the author of this page." + ) + + +class LengthRequired(HTTPException): + """*411* `Length Required` + + Raise if the browser submitted data but no ``Content-Length`` header which + is required for the kind of processing the server does. + """ + + code = 411 + description = ( + "A request with this method requires a valid Content-" + "Length header." + ) + + +class PreconditionFailed(HTTPException): + """*412* `Precondition Failed` + + Status code used in combination with ``If-Match``, ``If-None-Match``, or + ``If-Unmodified-Since``. + """ + + code = 412 + description = ( + "The precondition on the request for the URL failed positive evaluation." + ) + + +class RequestEntityTooLarge(HTTPException): + """*413* `Request Entity Too Large` + + The status code one should return if the data submitted exceeded a given + limit. + """ + + code = 413 + description = "The data value transmitted exceeds the capacity limit." + + +class RequestURITooLarge(HTTPException): + """*414* `Request URI Too Large` + + Like *413* but for too long URLs. + """ + + code = 414 + description = ( + "The length of the requested URL exceeds the capacity limit for" + " this server. The request cannot be processed." + ) + + +class UnsupportedMediaType(HTTPException): + """*415* `Unsupported Media Type` + + The status code returned if the server is unable to handle the media type + the client transmitted. + """ + + code = 415 + description = ( + "The server does not support the media type transmitted in the request." + ) + + +class RequestedRangeNotSatisfiable(HTTPException): + """*416* `Requested Range Not Satisfiable` + + The client asked for an invalid part of the file. + + .. versionadded:: 0.7 + """ + + code = 416 + description = "The server cannot provide the requested range." + + def __init__(self, length=None, units="bytes", description=None): + """Takes an optional `Content-Range` header value based on ``length`` + parameter. + """ + HTTPException.__init__(self, description) + self.length = length + self.units = units + + def get_headers(self, environ=None): + headers = HTTPException.get_headers(self, environ) + if self.length is not None: + headers.append(("Content-Range", "%s */%d" % (self.units, self.length))) + return headers + + +class ExpectationFailed(HTTPException): + """*417* `Expectation Failed` + + The server cannot meet the requirements of the Expect request-header. + + .. versionadded:: 0.7 + """ + + code = 417 + description = "The server could not meet the requirements of the Expect header" + + +class ImATeapot(HTTPException): + """*418* `I'm a teapot` + + The server should return this if it is a teapot and someone attempted + to brew coffee with it. + + .. versionadded:: 0.7 + """ + + code = 418 + description = "This server is a teapot, not a coffee machine" + + +class UnprocessableEntity(HTTPException): + """*422* `Unprocessable Entity` + + Used if the request is well formed, but the instructions are otherwise + incorrect. + """ + + code = 422 + description = ( + "The request was well-formed but was unable to be followed due" + " to semantic errors." + ) + + +class Locked(HTTPException): + """*423* `Locked` + + Used if the resource that is being accessed is locked. + """ + + code = 423 + description = "The resource that is being accessed is locked." + + +class FailedDependency(HTTPException): + """*424* `Failed Dependency` + + Used if the method could not be performed on the resource + because the requested action depended on another action and that action failed. + """ + + code = 424 + description = ( + "The method could not be performed on the resource because the" + " requested action depended on another action and that action" + " failed." + ) + + +class PreconditionRequired(HTTPException): + """*428* `Precondition Required` + + The server requires this request to be conditional, typically to prevent + the lost update problem, which is a race condition between two or more + clients attempting to update a resource through PUT or DELETE. By requiring + each client to include a conditional header ("If-Match" or "If-Unmodified- + Since") with the proper value retained from a recent GET request, the + server ensures that each client has at least seen the previous revision of + the resource. + """ + + code = 428 + description = ( + "This request is required to be conditional; try using" + ' "If-Match" or "If-Unmodified-Since".' + ) + + +class TooManyRequests(HTTPException): + """*429* `Too Many Requests` + + The server is limiting the rate at which this user receives responses, and + this request exceeds that rate. (The server may use any convenient method + to identify users and their request rates). The server may include a + "Retry-After" header to indicate how long the user should wait before + retrying. + """ + + code = 429 + description = "This user has exceeded an allotted request count. Try again later." + + +class RequestHeaderFieldsTooLarge(HTTPException): + """*431* `Request Header Fields Too Large` + + The server refuses to process the request because the header fields are too + large. One or more individual fields may be too large, or the set of all + headers is too large. + """ + + code = 431 + description = "One or more header fields exceeds the maximum size." + + +class UnavailableForLegalReasons(HTTPException): + """*451* `Unavailable For Legal Reasons` + + This status code indicates that the server is denying access to the + resource as a consequence of a legal demand. + """ + + code = 451 + description = "Unavailable for legal reasons." + + +class InternalServerError(HTTPException): + """*500* `Internal Server Error` + + Raise if an internal server error occurred. This is a good fallback if an + unknown error occurred in the dispatcher. + """ + + code = 500 + description = ( + "The server encountered an internal error and was unable to" + " complete your request. Either the server is overloaded or" + " there is an error in the application." + ) + + +class NotImplemented(HTTPException): + """*501* `Not Implemented` + + Raise if the application does not support the action requested by the + browser. + """ + + code = 501 + description = "The server does not support the action requested by the browser." + + +class BadGateway(HTTPException): + """*502* `Bad Gateway` + + If you do proxying in your application you should return this status code + if you received an invalid response from the upstream server it accessed + in attempting to fulfill the request. + """ + + code = 502 + description = ( + "The proxy server received an invalid response from an upstream server." + ) + + +class ServiceUnavailable(HTTPException): + """*503* `Service Unavailable` + + Status code you should return if a service is temporarily unavailable. + """ + + code = 503 + description = ( + "The server is temporarily unable to service your request due" + " to maintenance downtime or capacity problems. Please try" + " again later." + ) + + +class GatewayTimeout(HTTPException): + """*504* `Gateway Timeout` + + Status code you should return if a connection to an upstream server + times out. + """ + + code = 504 + description = "The connection to an upstream server timed out." + + +class HTTPVersionNotSupported(HTTPException): + """*505* `HTTP Version Not Supported` + + The server does not support the HTTP protocol version used in the request. + """ + + code = 505 + description = ( + "The server does not support the HTTP protocol version used in the request." + ) + + +default_exceptions = {} +__all__ = ["HTTPException"] + + +def _find_exceptions(): + for _name, obj in iteritems(globals()): + try: + is_http_exception = issubclass(obj, HTTPException) + except TypeError: + is_http_exception = False + if not is_http_exception or obj.code is None: + continue + __all__.append(obj.__name__) + old_obj = default_exceptions.get(obj.code, None) + if old_obj is not None and issubclass(obj, old_obj): + continue + default_exceptions[obj.code] = obj + + +_find_exceptions() +del _find_exceptions + + +class Aborter(object): + """When passed a dict of code -> exception items it can be used as + callable that raises exceptions. If the first argument to the + callable is an integer it will be looked up in the mapping, if it's + a WSGI application it will be raised in a proxy exception. + + The rest of the arguments are forwarded to the exception constructor. + """ + + def __init__(self, mapping=None, extra=None): + if mapping is None: + mapping = default_exceptions + self.mapping = dict(mapping) + if extra is not None: + self.mapping.update(extra) + + def __call__(self, code, *args, **kwargs): + if not args and not kwargs and not isinstance(code, integer_types): + raise HTTPException(response=code) + if code not in self.mapping: + raise LookupError("no exception for %r" % code) + raise self.mapping[code](*args, **kwargs) + + +def abort(status, *args, **kwargs): + """Raises an :py:exc:`HTTPException` for the given status code or WSGI + application:: + + abort(404) # 404 Not Found + abort(Response('Hello World')) + + Can be passed a WSGI application or a status code. If a status code is + given it's looked up in the list of exceptions and will raise that + exception, if passed a WSGI application it will wrap it in a proxy WSGI + exception and raise that:: + + abort(404) + abort(Response('Hello World')) + + """ + return _aborter(status, *args, **kwargs) + + +_aborter = Aborter() + + +#: an exception that is used internally to signal both a key error and a +#: bad request. Used by a lot of the datastructures. +BadRequestKeyError = BadRequest.wrap(KeyError) + +# imported here because of circular dependencies of werkzeug.utils +from .http import HTTP_STATUS_CODES +from .utils import escape diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/filesystem.py b/backend/venv/lib/python3.7/site-packages/werkzeug/filesystem.py new file mode 100644 index 0000000..d016cae --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/filesystem.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.filesystem + ~~~~~~~~~~~~~~~~~~~ + + Various utilities for the local filesystem. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import sys +import warnings + +# We do not trust traditional unixes. +has_likely_buggy_unicode_filesystem = ( + sys.platform.startswith("linux") or "bsd" in sys.platform +) + + +def _is_ascii_encoding(encoding): + """Given an encoding this figures out if the encoding is actually ASCII (which + is something we don't actually want in most cases). This is necessary + because ASCII comes under many names such as ANSI_X3.4-1968. + """ + if encoding is None: + return False + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): + """The warning used by Werkzeug to signal a broken filesystem. Will only be + used once per runtime.""" + + +_warned_about_filesystem_encoding = False + + +def get_filesystem_encoding(): + """Returns the filesystem encoding that should be used. Note that this is + different from the Python understanding of the filesystem encoding which + might be deeply flawed. Do not use this value against Python's unicode APIs + because it might be different. See :ref:`filesystem-encoding` for the exact + behavior. + + The concept of a filesystem encoding in generally is not something you + should rely on. As such if you ever need to use this function except for + writing wrapper code reconsider. + """ + global _warned_about_filesystem_encoding + rv = sys.getfilesystemencoding() + if has_likely_buggy_unicode_filesystem and not rv or _is_ascii_encoding(rv): + if not _warned_about_filesystem_encoding: + warnings.warn( + "Detected a misconfigured UNIX filesystem: Will use" + " UTF-8 as filesystem encoding instead of {0!r}".format(rv), + BrokenFilesystemWarning, + ) + _warned_about_filesystem_encoding = True + return "utf-8" + return rv diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/formparser.py b/backend/venv/lib/python3.7/site-packages/werkzeug/formparser.py new file mode 100644 index 0000000..0ddc5c8 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/formparser.py @@ -0,0 +1,586 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.formparser + ~~~~~~~~~~~~~~~~~~~ + + This module implements the form parsing. It supports url-encoded forms + as well as non-nested multipart uploads. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import re +from functools import update_wrapper +from itertools import chain +from itertools import repeat +from itertools import tee + +from ._compat import BytesIO +from ._compat import text_type +from ._compat import to_native +from .datastructures import FileStorage +from .datastructures import Headers +from .datastructures import MultiDict +from .http import parse_options_header +from .urls import url_decode_stream +from .wsgi import get_content_length +from .wsgi import get_input_stream +from .wsgi import make_line_iter + +# there are some platforms where SpooledTemporaryFile is not available. +# In that case we need to provide a fallback. +try: + from tempfile import SpooledTemporaryFile +except ImportError: + from tempfile import TemporaryFile + + SpooledTemporaryFile = None + + +#: an iterator that yields empty strings +_empty_string_iter = repeat("") + +#: a regular expression for multipart boundaries +_multipart_boundary_re = re.compile("^[ -~]{0,200}[!-~]$") + +#: supported http encodings that are also available in python we support +#: for multipart messages. +_supported_multipart_encodings = frozenset(["base64", "quoted-printable"]) + + +def default_stream_factory( + total_content_length, filename, content_type, content_length=None +): + """The stream factory that is used per default.""" + max_size = 1024 * 500 + if SpooledTemporaryFile is not None: + return SpooledTemporaryFile(max_size=max_size, mode="wb+") + if total_content_length is None or total_content_length > max_size: + return TemporaryFile("wb+") + return BytesIO() + + +def parse_form_data( + environ, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + max_content_length=None, + cls=None, + silent=True, +): + """Parse the form data in the environ and return it as tuple in the form + ``(stream, form, files)``. You should only call this method if the + transport method is `POST`, `PUT`, or `PATCH`. + + If the mimetype of the data transmitted is `multipart/form-data` the + files multidict will be filled with `FileStorage` objects. If the + mimetype is unknown the input stream is wrapped and returned as first + argument, else the stream is empty. + + This is a shortcut for the common usage of :class:`FormDataParser`. + + Have a look at :ref:`dealing-with-request-data` for more details. + + .. versionadded:: 0.5 + The `max_form_memory_size`, `max_content_length` and + `cls` parameters were added. + + .. versionadded:: 0.5.1 + The optional `silent` flag was added. + + :param environ: the WSGI environment to be used for parsing. + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`~BaseResponse._get_file_stream`. + :param charset: The character set for URL and url encoded form data. + :param errors: The encoding error behavior. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + :return: A tuple in the form ``(stream, form, files)``. + """ + return FormDataParser( + stream_factory, + charset, + errors, + max_form_memory_size, + max_content_length, + cls, + silent, + ).parse_from_environ(environ) + + +def exhaust_stream(f): + """Helper decorator for methods that exhausts the stream on return.""" + + def wrapper(self, stream, *args, **kwargs): + try: + return f(self, stream, *args, **kwargs) + finally: + exhaust = getattr(stream, "exhaust", None) + if exhaust is not None: + exhaust() + else: + while 1: + chunk = stream.read(1024 * 64) + if not chunk: + break + + return update_wrapper(wrapper, f) + + +class FormDataParser(object): + """This class implements parsing of form data for Werkzeug. By itself + it can parse multipart and url encoded form data. It can be subclassed + and extended but for most mimetypes it is a better idea to use the + untouched stream and expose it as separate attributes on a request + object. + + .. versionadded:: 0.8 + + :param stream_factory: An optional callable that returns a new read and + writeable file descriptor. This callable works + the same as :meth:`~BaseResponse._get_file_stream`. + :param charset: The character set for URL and url encoded form data. + :param errors: The encoding error behavior. + :param max_form_memory_size: the maximum number of bytes to be accepted for + in-memory stored form data. If the data + exceeds the value specified an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param max_content_length: If this is provided and the transmitted data + is longer than this value an + :exc:`~exceptions.RequestEntityTooLarge` + exception is raised. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param silent: If set to False parsing errors will not be caught. + """ + + def __init__( + self, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + max_content_length=None, + cls=None, + silent=True, + ): + if stream_factory is None: + stream_factory = default_stream_factory + self.stream_factory = stream_factory + self.charset = charset + self.errors = errors + self.max_form_memory_size = max_form_memory_size + self.max_content_length = max_content_length + if cls is None: + cls = MultiDict + self.cls = cls + self.silent = silent + + def get_parse_func(self, mimetype, options): + return self.parse_functions.get(mimetype) + + def parse_from_environ(self, environ): + """Parses the information from the environment as form data. + + :param environ: the WSGI environment to be used for parsing. + :return: A tuple in the form ``(stream, form, files)``. + """ + content_type = environ.get("CONTENT_TYPE", "") + content_length = get_content_length(environ) + mimetype, options = parse_options_header(content_type) + return self.parse(get_input_stream(environ), mimetype, content_length, options) + + def parse(self, stream, mimetype, content_length, options=None): + """Parses the information from the given stream, mimetype, + content length and mimetype parameters. + + :param stream: an input stream + :param mimetype: the mimetype of the data + :param content_length: the content length of the incoming data + :param options: optional mimetype parameters (used for + the multipart boundary for instance) + :return: A tuple in the form ``(stream, form, files)``. + """ + if ( + self.max_content_length is not None + and content_length is not None + and content_length > self.max_content_length + ): + raise exceptions.RequestEntityTooLarge() + if options is None: + options = {} + + parse_func = self.get_parse_func(mimetype, options) + if parse_func is not None: + try: + return parse_func(self, stream, mimetype, content_length, options) + except ValueError: + if not self.silent: + raise + + return stream, self.cls(), self.cls() + + @exhaust_stream + def _parse_multipart(self, stream, mimetype, content_length, options): + parser = MultiPartParser( + self.stream_factory, + self.charset, + self.errors, + max_form_memory_size=self.max_form_memory_size, + cls=self.cls, + ) + boundary = options.get("boundary") + if boundary is None: + raise ValueError("Missing boundary") + if isinstance(boundary, text_type): + boundary = boundary.encode("ascii") + form, files = parser.parse(stream, boundary, content_length) + return stream, form, files + + @exhaust_stream + def _parse_urlencoded(self, stream, mimetype, content_length, options): + if ( + self.max_form_memory_size is not None + and content_length is not None + and content_length > self.max_form_memory_size + ): + raise exceptions.RequestEntityTooLarge() + form = url_decode_stream(stream, self.charset, errors=self.errors, cls=self.cls) + return stream, form, self.cls() + + #: mapping of mimetypes to parsing functions + parse_functions = { + "multipart/form-data": _parse_multipart, + "application/x-www-form-urlencoded": _parse_urlencoded, + "application/x-url-encoded": _parse_urlencoded, + } + + +def is_valid_multipart_boundary(boundary): + """Checks if the string given is a valid multipart boundary.""" + return _multipart_boundary_re.match(boundary) is not None + + +def _line_parse(line): + """Removes line ending characters and returns a tuple (`stripped_line`, + `is_terminated`). + """ + if line[-2:] in ["\r\n", b"\r\n"]: + return line[:-2], True + elif line[-1:] in ["\r", "\n", b"\r", b"\n"]: + return line[:-1], True + return line, False + + +def parse_multipart_headers(iterable): + """Parses multipart headers from an iterable that yields lines (including + the trailing newline symbol). The iterable has to be newline terminated. + + The iterable will stop at the line where the headers ended so it can be + further consumed. + + :param iterable: iterable of strings that are newline terminated + """ + result = [] + for line in iterable: + line = to_native(line) + line, line_terminated = _line_parse(line) + if not line_terminated: + raise ValueError("unexpected end of line in multipart header") + if not line: + break + elif line[0] in " \t" and result: + key, value = result[-1] + result[-1] = (key, value + "\n " + line[1:]) + else: + parts = line.split(":", 1) + if len(parts) == 2: + result.append((parts[0].strip(), parts[1].strip())) + + # we link the list to the headers, no need to create a copy, the + # list was not shared anyways. + return Headers(result) + + +_begin_form = "begin_form" +_begin_file = "begin_file" +_cont = "cont" +_end = "end" + + +class MultiPartParser(object): + def __init__( + self, + stream_factory=None, + charset="utf-8", + errors="replace", + max_form_memory_size=None, + cls=None, + buffer_size=64 * 1024, + ): + self.charset = charset + self.errors = errors + self.max_form_memory_size = max_form_memory_size + self.stream_factory = ( + default_stream_factory if stream_factory is None else stream_factory + ) + self.cls = MultiDict if cls is None else cls + + # make sure the buffer size is divisible by four so that we can base64 + # decode chunk by chunk + assert buffer_size % 4 == 0, "buffer size has to be divisible by 4" + # also the buffer size has to be at least 1024 bytes long or long headers + # will freak out the system + assert buffer_size >= 1024, "buffer size has to be at least 1KB" + + self.buffer_size = buffer_size + + def _fix_ie_filename(self, filename): + """Internet Explorer 6 transmits the full file name if a file is + uploaded. This function strips the full path if it thinks the + filename is Windows-like absolute. + """ + if filename[1:3] == ":\\" or filename[:2] == "\\\\": + return filename.split("\\")[-1] + return filename + + def _find_terminator(self, iterator): + """The terminator might have some additional newlines before it. + There is at least one application that sends additional newlines + before headers (the python setuptools package). + """ + for line in iterator: + if not line: + break + line = line.strip() + if line: + return line + return b"" + + def fail(self, message): + raise ValueError(message) + + def get_part_encoding(self, headers): + transfer_encoding = headers.get("content-transfer-encoding") + if ( + transfer_encoding is not None + and transfer_encoding in _supported_multipart_encodings + ): + return transfer_encoding + + def get_part_charset(self, headers): + # Figure out input charset for current part + content_type = headers.get("content-type") + if content_type: + mimetype, ct_params = parse_options_header(content_type) + return ct_params.get("charset", self.charset) + return self.charset + + def start_file_streaming(self, filename, headers, total_content_length): + if isinstance(filename, bytes): + filename = filename.decode(self.charset, self.errors) + filename = self._fix_ie_filename(filename) + content_type = headers.get("content-type") + try: + content_length = int(headers["content-length"]) + except (KeyError, ValueError): + content_length = 0 + container = self.stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + return filename, container + + def in_memory_threshold_reached(self, bytes): + raise exceptions.RequestEntityTooLarge() + + def validate_boundary(self, boundary): + if not boundary: + self.fail("Missing boundary") + if not is_valid_multipart_boundary(boundary): + self.fail("Invalid boundary: %s" % boundary) + if len(boundary) > self.buffer_size: # pragma: no cover + # this should never happen because we check for a minimum size + # of 1024 and boundaries may not be longer than 200. The only + # situation when this happens is for non debug builds where + # the assert is skipped. + self.fail("Boundary longer than buffer size") + + def parse_lines(self, file, boundary, content_length, cap_at_buffer=True): + """Generate parts of + ``('begin_form', (headers, name))`` + ``('begin_file', (headers, name, filename))`` + ``('cont', bytestring)`` + ``('end', None)`` + + Always obeys the grammar + parts = ( begin_form cont* end | + begin_file cont* end )* + """ + next_part = b"--" + boundary + last_part = next_part + b"--" + + iterator = chain( + make_line_iter( + file, + limit=content_length, + buffer_size=self.buffer_size, + cap_at_buffer=cap_at_buffer, + ), + _empty_string_iter, + ) + + terminator = self._find_terminator(iterator) + + if terminator == last_part: + return + elif terminator != next_part: + self.fail("Expected boundary at start of multipart data") + + while terminator != last_part: + headers = parse_multipart_headers(iterator) + + disposition = headers.get("content-disposition") + if disposition is None: + self.fail("Missing Content-Disposition header") + disposition, extra = parse_options_header(disposition) + transfer_encoding = self.get_part_encoding(headers) + name = extra.get("name") + filename = extra.get("filename") + + # if no content type is given we stream into memory. A list is + # used as a temporary container. + if filename is None: + yield _begin_form, (headers, name) + + # otherwise we parse the rest of the headers and ask the stream + # factory for something we can write in. + else: + yield _begin_file, (headers, name, filename) + + buf = b"" + for line in iterator: + if not line: + self.fail("unexpected end of stream") + + if line[:2] == b"--": + terminator = line.rstrip() + if terminator in (next_part, last_part): + break + + if transfer_encoding is not None: + if transfer_encoding == "base64": + transfer_encoding = "base64_codec" + try: + line = codecs.decode(line, transfer_encoding) + except Exception: + self.fail("could not decode transfer encoded chunk") + + # we have something in the buffer from the last iteration. + # this is usually a newline delimiter. + if buf: + yield _cont, buf + buf = b"" + + # If the line ends with windows CRLF we write everything except + # the last two bytes. In all other cases however we write + # everything except the last byte. If it was a newline, that's + # fine, otherwise it does not matter because we will write it + # the next iteration. this ensures we do not write the + # final newline into the stream. That way we do not have to + # truncate the stream. However we do have to make sure that + # if something else than a newline is in there we write it + # out. + if line[-2:] == b"\r\n": + buf = b"\r\n" + cutoff = -2 + else: + buf = line[-1:] + cutoff = -1 + yield _cont, line[:cutoff] + + else: # pragma: no cover + raise ValueError("unexpected end of part") + + # if we have a leftover in the buffer that is not a newline + # character we have to flush it, otherwise we will chop of + # certain values. + if buf not in (b"", b"\r", b"\n", b"\r\n"): + yield _cont, buf + + yield _end, None + + def parse_parts(self, file, boundary, content_length): + """Generate ``('file', (name, val))`` and + ``('form', (name, val))`` parts. + """ + in_memory = 0 + + for ellt, ell in self.parse_lines(file, boundary, content_length): + if ellt == _begin_file: + headers, name, filename = ell + is_file = True + guard_memory = False + filename, container = self.start_file_streaming( + filename, headers, content_length + ) + _write = container.write + + elif ellt == _begin_form: + headers, name = ell + is_file = False + container = [] + _write = container.append + guard_memory = self.max_form_memory_size is not None + + elif ellt == _cont: + _write(ell) + # if we write into memory and there is a memory size limit we + # count the number of bytes in memory and raise an exception if + # there is too much data in memory. + if guard_memory: + in_memory += len(ell) + if in_memory > self.max_form_memory_size: + self.in_memory_threshold_reached(in_memory) + + elif ellt == _end: + if is_file: + container.seek(0) + yield ( + "file", + (name, FileStorage(container, filename, name, headers=headers)), + ) + else: + part_charset = self.get_part_charset(headers) + yield ( + "form", + (name, b"".join(container).decode(part_charset, self.errors)), + ) + + def parse(self, file, boundary, content_length): + formstream, filestream = tee( + self.parse_parts(file, boundary, content_length), 2 + ) + form = (p[1] for p in formstream if p[0] == "form") + files = (p[1] for p in filestream if p[0] == "file") + return self.cls(form), self.cls(files) + + +from . import exceptions diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/http.py b/backend/venv/lib/python3.7/site-packages/werkzeug/http.py new file mode 100644 index 0000000..af32007 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/http.py @@ -0,0 +1,1303 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.http + ~~~~~~~~~~~~~ + + Werkzeug comes with a bunch of utilities that help Werkzeug to deal with + HTTP data. Most of the classes and functions provided by this module are + used by the wrappers, but they are useful on their own, too, especially if + the response and request objects are not used. + + This covers some of the more HTTP centric features of WSGI, some other + utilities such as cookie handling are documented in the `werkzeug.utils` + module. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import base64 +import re +import warnings +from datetime import datetime +from datetime import timedelta +from hashlib import md5 +from time import gmtime +from time import time + +from ._compat import integer_types +from ._compat import iteritems +from ._compat import PY2 +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._internal import _cookie_parse_impl +from ._internal import _cookie_quote +from ._internal import _make_cookie_domain + +try: + from email.utils import parsedate_tz +except ImportError: + from email.Utils import parsedate_tz + +try: + from urllib.request import parse_http_list as _parse_list_header + from urllib.parse import unquote_to_bytes as _unquote +except ImportError: + from urllib2 import parse_http_list as _parse_list_header + from urllib2 import unquote as _unquote + +_cookie_charset = "latin1" +_basic_auth_charset = "utf-8" +# for explanation of "media-range", etc. see Sections 5.3.{1,2} of RFC 7231 +_accept_re = re.compile( + r""" + ( # media-range capturing-parenthesis + [^\s;,]+ # type/subtype + (?:[ \t]*;[ \t]* # ";" + (?: # parameter non-capturing-parenthesis + [^\s;,q][^\s;,]* # token that doesn't start with "q" + | # or + q[^\s;,=][^\s;,]* # token that is more than just "q" + ) + )* # zero or more parameters + ) # end of media-range + (?:[ \t]*;[ \t]*q= # weight is a "q" parameter + (\d*(?:\.\d+)?) # qvalue capturing-parentheses + [^,]* # "extension" accept params: who cares? + )? # accept params are optional + """, + re.VERBOSE, +) +_token_chars = frozenset( + "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~" +) +_etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') +_unsafe_header_chars = set('()<>@,;:"/[]?={} \t') +_option_header_piece_re = re.compile( + r""" + ;\s*,?\s* # newlines were replaced with commas + (?P + "[^"\\]*(?:\\.[^"\\]*)*" # quoted string + | + [^\s;,=*]+ # token + ) + (?:\*(?P\d+))? # *1, optional continuation index + \s* + (?: # optionally followed by =value + (?: # equals sign, possibly with encoding + \*\s*=\s* # * indicates extended notation + (?: # optional encoding + (?P[^\s]+?) + '(?P[^\s]*?)' + )? + | + =\s* # basic notation + ) + (?P + "[^"\\]*(?:\\.[^"\\]*)*" # quoted string + | + [^;,]+ # token + )? + )? + \s* + """, + flags=re.VERBOSE, +) +_option_header_start_mime_type = re.compile(r",\s*([^;,\s]+)([;,]\s*.+)?") + +_entity_headers = frozenset( + [ + "allow", + "content-encoding", + "content-language", + "content-length", + "content-location", + "content-md5", + "content-range", + "content-type", + "expires", + "last-modified", + ] +) +_hop_by_hop_headers = frozenset( + [ + "connection", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailer", + "transfer-encoding", + "upgrade", + ] +) + + +HTTP_STATUS_CODES = { + 100: "Continue", + 101: "Switching Protocols", + 102: "Processing", + 200: "OK", + 201: "Created", + 202: "Accepted", + 203: "Non Authoritative Information", + 204: "No Content", + 205: "Reset Content", + 206: "Partial Content", + 207: "Multi Status", + 226: "IM Used", # see RFC 3229 + 300: "Multiple Choices", + 301: "Moved Permanently", + 302: "Found", + 303: "See Other", + 304: "Not Modified", + 305: "Use Proxy", + 307: "Temporary Redirect", + 308: "Permanent Redirect", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", # unused + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 409: "Conflict", + 410: "Gone", + 411: "Length Required", + 412: "Precondition Failed", + 413: "Request Entity Too Large", + 414: "Request URI Too Long", + 415: "Unsupported Media Type", + 416: "Requested Range Not Satisfiable", + 417: "Expectation Failed", + 418: "I'm a teapot", # see RFC 2324 + 421: "Misdirected Request", # see RFC 7540 + 422: "Unprocessable Entity", + 423: "Locked", + 424: "Failed Dependency", + 426: "Upgrade Required", + 428: "Precondition Required", # see RFC 6585 + 429: "Too Many Requests", + 431: "Request Header Fields Too Large", + 449: "Retry With", # proprietary MS extension + 451: "Unavailable For Legal Reasons", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + 505: "HTTP Version Not Supported", + 507: "Insufficient Storage", + 510: "Not Extended", +} + + +def wsgi_to_bytes(data): + """coerce wsgi unicode represented bytes to real ones""" + if isinstance(data, bytes): + return data + return data.encode("latin1") # XXX: utf8 fallback? + + +def bytes_to_wsgi(data): + assert isinstance(data, bytes), "data must be bytes" + if isinstance(data, str): + return data + else: + return data.decode("latin1") + + +def quote_header_value(value, extra_chars="", allow_token=True): + """Quote a header value if necessary. + + .. versionadded:: 0.5 + + :param value: the value to quote. + :param extra_chars: a list of extra characters to skip quoting. + :param allow_token: if this is enabled token values are returned + unchanged. + """ + if isinstance(value, bytes): + value = bytes_to_wsgi(value) + value = str(value) + if allow_token: + token_chars = _token_chars | set(extra_chars) + if set(value).issubset(token_chars): + return value + return '"%s"' % value.replace("\\", "\\\\").replace('"', '\\"') + + +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + .. versionadded:: 0.5 + + :param value: the header value to unquote. + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != "\\\\": + return value.replace("\\\\", "\\").replace('\\"', '"') + return value + + +def dump_options_header(header, options): + """The reverse function to :func:`parse_options_header`. + + :param header: the header to dump + :param options: a dict of options to append. + """ + segments = [] + if header is not None: + segments.append(header) + for key, value in iteritems(options): + if value is None: + segments.append(key) + else: + segments.append("%s=%s" % (key, quote_header_value(value))) + return "; ".join(segments) + + +def dump_header(iterable, allow_token=True): + """Dump an HTTP header again. This is the reversal of + :func:`parse_list_header`, :func:`parse_set_header` and + :func:`parse_dict_header`. This also quotes strings that include an + equals sign unless you pass it as dict of key, value pairs. + + >>> dump_header({'foo': 'bar baz'}) + 'foo="bar baz"' + >>> dump_header(('foo', 'bar baz')) + 'foo, "bar baz"' + + :param iterable: the iterable or dict of values to quote. + :param allow_token: if set to `False` tokens as values are disallowed. + See :func:`quote_header_value` for more details. + """ + if isinstance(iterable, dict): + items = [] + for key, value in iteritems(iterable): + if value is None: + items.append(key) + else: + items.append( + "%s=%s" % (key, quote_header_value(value, allow_token=allow_token)) + ) + else: + items = [quote_header_value(x, allow_token=allow_token) for x in iterable] + return ", ".join(items) + + +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +def parse_dict_header(value, cls=dict): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict (or any other mapping object created from + the type with a dict like interface provided by the `cls` argument): + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + .. versionchanged:: 0.9 + Added support for `cls` argument. + + :param value: a string with a dict header. + :param cls: callable to use for storage of parsed results. + :return: an instance of `cls` + """ + result = cls() + if not isinstance(value, text_type): + # XXX: validate + value = bytes_to_wsgi(value) + for item in _parse_list_header(value): + if "=" not in item: + result[item] = None + continue + name, value = item.split("=", 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +def parse_options_header(value, multiple=False): + """Parse a ``Content-Type`` like header into a tuple with the content + type and the options: + + >>> parse_options_header('text/html; charset=utf8') + ('text/html', {'charset': 'utf8'}) + + This should not be used to parse ``Cache-Control`` like headers that use + a slightly different format. For these headers use the + :func:`parse_dict_header` function. + + .. versionchanged:: 0.15 + :rfc:`2231` parameter continuations are handled. + + .. versionadded:: 0.5 + + :param value: the header to parse. + :param multiple: Whether try to parse and return multiple MIME types + :return: (mimetype, options) or (mimetype, options, mimetype, options, …) + if multiple=True + """ + if not value: + return "", {} + + result = [] + + value = "," + value.replace("\n", ",") + while value: + match = _option_header_start_mime_type.match(value) + if not match: + break + result.append(match.group(1)) # mimetype + options = {} + # Parse options + rest = match.group(2) + continued_encoding = None + while rest: + optmatch = _option_header_piece_re.match(rest) + if not optmatch: + break + option, count, encoding, language, option_value = optmatch.groups() + # Continuations don't have to supply the encoding after the + # first line. If we're in a continuation, track the current + # encoding to use for subsequent lines. Reset it when the + # continuation ends. + if not count: + continued_encoding = None + else: + if not encoding: + encoding = continued_encoding + continued_encoding = encoding + option = unquote_header_value(option) + if option_value is not None: + option_value = unquote_header_value(option_value, option == "filename") + if encoding is not None: + option_value = _unquote(option_value).decode(encoding) + if count: + # Continuations append to the existing value. For + # simplicity, this ignores the possibility of + # out-of-order indices, which shouldn't happen anyway. + options[option] = options.get(option, "") + option_value + else: + options[option] = option_value + rest = rest[optmatch.end() :] + result.append(options) + if multiple is False: + return tuple(result) + value = rest + + return tuple(result) if result else ("", {}) + + +def parse_accept_header(value, cls=None): + """Parses an HTTP Accept-* header. This does not implement a complete + valid algorithm but one that supports at least value and quality + extraction. + + Returns a new :class:`Accept` object (basically a list of ``(value, quality)`` + tuples sorted by the quality with some additional accessor methods). + + The second parameter can be a subclass of :class:`Accept` that is created + with the parsed values and returned. + + :param value: the accept header string to be parsed. + :param cls: the wrapper class for the return value (can be + :class:`Accept` or a subclass thereof) + :return: an instance of `cls`. + """ + if cls is None: + cls = Accept + + if not value: + return cls(None) + + result = [] + for match in _accept_re.finditer(value): + quality = match.group(2) + if not quality: + quality = 1 + else: + quality = max(min(float(quality), 1), 0) + result.append((match.group(1), quality)) + return cls(result) + + +def parse_cache_control_header(value, on_update=None, cls=None): + """Parse a cache control header. The RFC differs between response and + request cache control, this method does not. It's your responsibility + to not use the wrong control statements. + + .. versionadded:: 0.5 + The `cls` was added. If not specified an immutable + :class:`~werkzeug.datastructures.RequestCacheControl` is returned. + + :param value: a cache control header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.CacheControl` + object is changed. + :param cls: the class for the returned object. By default + :class:`~werkzeug.datastructures.RequestCacheControl` is used. + :return: a `cls` object. + """ + if cls is None: + cls = RequestCacheControl + if not value: + return cls(None, on_update) + return cls(parse_dict_header(value), on_update) + + +def parse_set_header(value, on_update=None): + """Parse a set-like header and return a + :class:`~werkzeug.datastructures.HeaderSet` object: + + >>> hs = parse_set_header('token, "quoted value"') + + The return value is an object that treats the items case-insensitively + and keeps the order of the items: + + >>> 'TOKEN' in hs + True + >>> hs.index('quoted value') + 1 + >>> hs + HeaderSet(['token', 'quoted value']) + + To create a header from the :class:`HeaderSet` again, use the + :func:`dump_header` function. + + :param value: a set header to be parsed. + :param on_update: an optional callable that is called every time a + value on the :class:`~werkzeug.datastructures.HeaderSet` + object is changed. + :return: a :class:`~werkzeug.datastructures.HeaderSet` + """ + if not value: + return HeaderSet(None, on_update) + return HeaderSet(parse_list_header(value), on_update) + + +def parse_authorization_header(value): + """Parse an HTTP basic/digest authorization header transmitted by the web + browser. The return value is either `None` if the header was invalid or + not given, otherwise an :class:`~werkzeug.datastructures.Authorization` + object. + + :param value: the authorization header to parse. + :return: a :class:`~werkzeug.datastructures.Authorization` object or `None`. + """ + if not value: + return + value = wsgi_to_bytes(value) + try: + auth_type, auth_info = value.split(None, 1) + auth_type = auth_type.lower() + except ValueError: + return + if auth_type == b"basic": + try: + username, password = base64.b64decode(auth_info).split(b":", 1) + except Exception: + return + return Authorization( + "basic", + { + "username": to_unicode(username, _basic_auth_charset), + "password": to_unicode(password, _basic_auth_charset), + }, + ) + elif auth_type == b"digest": + auth_map = parse_dict_header(auth_info) + for key in "username", "realm", "nonce", "uri", "response": + if key not in auth_map: + return + if "qop" in auth_map: + if not auth_map.get("nc") or not auth_map.get("cnonce"): + return + return Authorization("digest", auth_map) + + +def parse_www_authenticate_header(value, on_update=None): + """Parse an HTTP WWW-Authenticate header into a + :class:`~werkzeug.datastructures.WWWAuthenticate` object. + + :param value: a WWW-Authenticate header to parse. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.WWWAuthenticate` + object is changed. + :return: a :class:`~werkzeug.datastructures.WWWAuthenticate` object. + """ + if not value: + return WWWAuthenticate(on_update=on_update) + try: + auth_type, auth_info = value.split(None, 1) + auth_type = auth_type.lower() + except (ValueError, AttributeError): + return WWWAuthenticate(value.strip().lower(), on_update=on_update) + return WWWAuthenticate(auth_type, parse_dict_header(auth_info), on_update) + + +def parse_if_range_header(value): + """Parses an if-range header which can be an etag or a date. Returns + a :class:`~werkzeug.datastructures.IfRange` object. + + .. versionadded:: 0.7 + """ + if not value: + return IfRange() + date = parse_date(value) + if date is not None: + return IfRange(date=date) + # drop weakness information + return IfRange(unquote_etag(value)[0]) + + +def parse_range_header(value, make_inclusive=True): + """Parses a range header into a :class:`~werkzeug.datastructures.Range` + object. If the header is missing or malformed `None` is returned. + `ranges` is a list of ``(start, stop)`` tuples where the ranges are + non-inclusive. + + .. versionadded:: 0.7 + """ + if not value or "=" not in value: + return None + + ranges = [] + last_end = 0 + units, rng = value.split("=", 1) + units = units.strip().lower() + + for item in rng.split(","): + item = item.strip() + if "-" not in item: + return None + if item.startswith("-"): + if last_end < 0: + return None + try: + begin = int(item) + except ValueError: + return None + end = None + last_end = -1 + elif "-" in item: + begin, end = item.split("-", 1) + begin = begin.strip() + end = end.strip() + if not begin.isdigit(): + return None + begin = int(begin) + if begin < last_end or last_end < 0: + return None + if end: + if not end.isdigit(): + return None + end = int(end) + 1 + if begin >= end: + return None + else: + end = None + last_end = end + ranges.append((begin, end)) + + return Range(units, ranges) + + +def parse_content_range_header(value, on_update=None): + """Parses a range header into a + :class:`~werkzeug.datastructures.ContentRange` object or `None` if + parsing is not possible. + + .. versionadded:: 0.7 + + :param value: a content range header to be parsed. + :param on_update: an optional callable that is called every time a value + on the :class:`~werkzeug.datastructures.ContentRange` + object is changed. + """ + if value is None: + return None + try: + units, rangedef = (value or "").strip().split(None, 1) + except ValueError: + return None + + if "/" not in rangedef: + return None + rng, length = rangedef.split("/", 1) + if length == "*": + length = None + elif length.isdigit(): + length = int(length) + else: + return None + + if rng == "*": + return ContentRange(units, None, None, length, on_update=on_update) + elif "-" not in rng: + return None + + start, stop = rng.split("-", 1) + try: + start = int(start) + stop = int(stop) + 1 + except ValueError: + return None + + if is_byte_range_valid(start, stop, length): + return ContentRange(units, start, stop, length, on_update=on_update) + + +def quote_etag(etag, weak=False): + """Quote an etag. + + :param etag: the etag to quote. + :param weak: set to `True` to tag it "weak". + """ + if '"' in etag: + raise ValueError("invalid etag") + etag = '"%s"' % etag + if weak: + etag = "W/" + etag + return etag + + +def unquote_etag(etag): + """Unquote a single etag: + + >>> unquote_etag('W/"bar"') + ('bar', True) + >>> unquote_etag('"bar"') + ('bar', False) + + :param etag: the etag identifier to unquote. + :return: a ``(etag, weak)`` tuple. + """ + if not etag: + return None, None + etag = etag.strip() + weak = False + if etag.startswith(("W/", "w/")): + weak = True + etag = etag[2:] + if etag[:1] == etag[-1:] == '"': + etag = etag[1:-1] + return etag, weak + + +def parse_etags(value): + """Parse an etag header. + + :param value: the tag header to parse + :return: an :class:`~werkzeug.datastructures.ETags` object. + """ + if not value: + return ETags() + strong = [] + weak = [] + end = len(value) + pos = 0 + while pos < end: + match = _etag_re.match(value, pos) + if match is None: + break + is_weak, quoted, raw = match.groups() + if raw == "*": + return ETags(star_tag=True) + elif quoted: + raw = quoted + if is_weak: + weak.append(raw) + else: + strong.append(raw) + pos = match.end() + return ETags(strong, weak) + + +def generate_etag(data): + """Generate an etag for some data.""" + return md5(data).hexdigest() + + +def parse_date(value): + """Parse one of the following date formats into a datetime object: + + .. sourcecode:: text + + Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 + Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 + Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format + + If parsing fails the return value is `None`. + + :param value: a string with a supported date format. + :return: a :class:`datetime.datetime` object. + """ + if value: + t = parsedate_tz(value.strip()) + if t is not None: + try: + year = t[0] + # unfortunately that function does not tell us if two digit + # years were part of the string, or if they were prefixed + # with two zeroes. So what we do is to assume that 69-99 + # refer to 1900, and everything below to 2000 + if year >= 0 and year <= 68: + year += 2000 + elif year >= 69 and year <= 99: + year += 1900 + return datetime(*((year,) + t[1:7])) - timedelta(seconds=t[-1] or 0) + except (ValueError, OverflowError): + return None + + +def _dump_date(d, delim): + """Used for `http_date` and `cookie_date`.""" + if d is None: + d = gmtime() + elif isinstance(d, datetime): + d = d.utctimetuple() + elif isinstance(d, (integer_types, float)): + d = gmtime(d) + return "%s, %02d%s%s%s%s %02d:%02d:%02d GMT" % ( + ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")[d.tm_wday], + d.tm_mday, + delim, + ( + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + )[d.tm_mon - 1], + delim, + str(d.tm_year), + d.tm_hour, + d.tm_min, + d.tm_sec, + ) + + +def cookie_date(expires=None): + """Formats the time to ensure compatibility with Netscape's cookie + standard. + + Accepts a floating point number expressed in seconds since the epoch in, a + datetime object or a timetuple. All times in UTC. The :func:`parse_date` + function can be used to parse such a date. + + Outputs a string in the format ``Wdy, DD-Mon-YYYY HH:MM:SS GMT``. + + :param expires: If provided that date is used, otherwise the current. + """ + return _dump_date(expires, "-") + + +def http_date(timestamp=None): + """Formats the time to match the RFC1123 date format. + + Accepts a floating point number expressed in seconds since the epoch in, a + datetime object or a timetuple. All times in UTC. The :func:`parse_date` + function can be used to parse such a date. + + Outputs a string in the format ``Wdy, DD Mon YYYY HH:MM:SS GMT``. + + :param timestamp: If provided that date is used, otherwise the current. + """ + return _dump_date(timestamp, " ") + + +def parse_age(value=None): + """Parses a base-10 integer count of seconds into a timedelta. + + If parsing fails, the return value is `None`. + + :param value: a string consisting of an integer represented in base-10 + :return: a :class:`datetime.timedelta` object or `None`. + """ + if not value: + return None + try: + seconds = int(value) + except ValueError: + return None + if seconds < 0: + return None + try: + return timedelta(seconds=seconds) + except OverflowError: + return None + + +def dump_age(age=None): + """Formats the duration as a base-10 integer. + + :param age: should be an integer number of seconds, + a :class:`datetime.timedelta` object, or, + if the age is unknown, `None` (default). + """ + if age is None: + return + if isinstance(age, timedelta): + # do the equivalent of Python 2.7's timedelta.total_seconds(), + # but disregarding fractional seconds + age = age.seconds + (age.days * 24 * 3600) + + age = int(age) + if age < 0: + raise ValueError("age cannot be negative") + + return str(age) + + +def is_resource_modified( + environ, etag=None, data=None, last_modified=None, ignore_if_range=True +): + """Convenience method for conditional requests. + + :param environ: the WSGI environment of the request to be checked. + :param etag: the etag for the response for comparison. + :param data: or alternatively the data of the response to automatically + generate an etag using :func:`generate_etag`. + :param last_modified: an optional date of the last modification. + :param ignore_if_range: If `False`, `If-Range` header will be taken into + account. + :return: `True` if the resource was modified, otherwise `False`. + """ + if etag is None and data is not None: + etag = generate_etag(data) + elif data is not None: + raise TypeError("both data and etag given") + if environ["REQUEST_METHOD"] not in ("GET", "HEAD"): + return False + + unmodified = False + if isinstance(last_modified, string_types): + last_modified = parse_date(last_modified) + + # ensure that microsecond is zero because the HTTP spec does not transmit + # that either and we might have some false positives. See issue #39 + if last_modified is not None: + last_modified = last_modified.replace(microsecond=0) + + if_range = None + if not ignore_if_range and "HTTP_RANGE" in environ: + # https://tools.ietf.org/html/rfc7233#section-3.2 + # A server MUST ignore an If-Range header field received in a request + # that does not contain a Range header field. + if_range = parse_if_range_header(environ.get("HTTP_IF_RANGE")) + + if if_range is not None and if_range.date is not None: + modified_since = if_range.date + else: + modified_since = parse_date(environ.get("HTTP_IF_MODIFIED_SINCE")) + + if modified_since and last_modified and last_modified <= modified_since: + unmodified = True + + if etag: + etag, _ = unquote_etag(etag) + if if_range is not None and if_range.etag is not None: + unmodified = parse_etags(if_range.etag).contains(etag) + else: + if_none_match = parse_etags(environ.get("HTTP_IF_NONE_MATCH")) + if if_none_match: + # https://tools.ietf.org/html/rfc7232#section-3.2 + # "A recipient MUST use the weak comparison function when comparing + # entity-tags for If-None-Match" + unmodified = if_none_match.contains_weak(etag) + + # https://tools.ietf.org/html/rfc7232#section-3.1 + # "Origin server MUST use the strong comparison function when + # comparing entity-tags for If-Match" + if_match = parse_etags(environ.get("HTTP_IF_MATCH")) + if if_match: + unmodified = not if_match.is_strong(etag) + + return not unmodified + + +def remove_entity_headers(headers, allowed=("expires", "content-location")): + """Remove all entity headers from a list or :class:`Headers` object. This + operation works in-place. `Expires` and `Content-Location` headers are + by default not removed. The reason for this is :rfc:`2616` section + 10.3.5 which specifies some entity headers that should be sent. + + .. versionchanged:: 0.5 + added `allowed` parameter. + + :param headers: a list or :class:`Headers` object. + :param allowed: a list of headers that should still be allowed even though + they are entity headers. + """ + allowed = set(x.lower() for x in allowed) + headers[:] = [ + (key, value) + for key, value in headers + if not is_entity_header(key) or key.lower() in allowed + ] + + +def remove_hop_by_hop_headers(headers): + """Remove all HTTP/1.1 "Hop-by-Hop" headers from a list or + :class:`Headers` object. This operation works in-place. + + .. versionadded:: 0.5 + + :param headers: a list or :class:`Headers` object. + """ + headers[:] = [ + (key, value) for key, value in headers if not is_hop_by_hop_header(key) + ] + + +def is_entity_header(header): + """Check if a header is an entity header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an entity header, `False` otherwise. + """ + return header.lower() in _entity_headers + + +def is_hop_by_hop_header(header): + """Check if a header is an HTTP/1.1 "Hop-by-Hop" header. + + .. versionadded:: 0.5 + + :param header: the header to test. + :return: `True` if it's an HTTP/1.1 "Hop-by-Hop" header, `False` otherwise. + """ + return header.lower() in _hop_by_hop_headers + + +def parse_cookie(header, charset="utf-8", errors="replace", cls=None): + """Parse a cookie. Either from a string or WSGI environ. + + Per default encoding errors are ignored. If you want a different behavior + you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a + :exc:`HTTPUnicodeError` is raised. + + .. versionchanged:: 0.5 + This function now returns a :class:`TypeConversionDict` instead of a + regular dict. The `cls` parameter was added. + + :param header: the header to be used to parse the cookie. Alternatively + this can be a WSGI environment. + :param charset: the charset for the cookie values. + :param errors: the error behavior for the charset decoding. + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`TypeConversionDict` is + used. + """ + if isinstance(header, dict): + header = header.get("HTTP_COOKIE", "") + elif header is None: + header = "" + + # If the value is an unicode string it's mangled through latin1. This + # is done because on PEP 3333 on Python 3 all headers are assumed latin1 + # which however is incorrect for cookies, which are sent in page encoding. + # As a result we + if isinstance(header, text_type): + header = header.encode("latin1", "replace") + + if cls is None: + cls = TypeConversionDict + + def _parse_pairs(): + for key, val in _cookie_parse_impl(header): + key = to_unicode(key, charset, errors, allow_none_charset=True) + if not key: + continue + val = to_unicode(val, charset, errors, allow_none_charset=True) + yield try_coerce_native(key), val + + return cls(_parse_pairs()) + + +def dump_cookie( + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + charset="utf-8", + sync_expires=True, + max_size=4093, + samesite=None, +): + """Creates a new Set-Cookie header without the ``Set-Cookie`` prefix + The parameters are the same as in the cookie Morsel object in the + Python standard library but it accepts unicode data, too. + + On Python 3 the return value of this function will be a unicode + string, on Python 2 it will be a native string. In both cases the + return value is usually restricted to ascii as the vast majority of + values are properly escaped, but that is no guarantee. If a unicode + string is returned it's tunneled through latin1 as required by + PEP 3333. + + The return value is not ASCII safe if the key contains unicode + characters. This is technically against the specification but + happens in the wild. It's strongly recommended to not use + non-ASCII values for the keys. + + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. Additionally `timedelta` objects + are accepted, too. + :param expires: should be a `datetime` object or unix timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: Use this if you want to set a cross-domain cookie. For + example, ``domain=".example.com"`` will set a cookie + that is readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: The cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param charset: the encoding for unicode values. + :param sync_expires: automatically set expires if max_age is defined + but expires not. + :param max_size: Warn if the final header value exceeds this size. The + default, 4093, should be safely `supported by most browsers + `_. Set to 0 to disable this check. + :param samesite: Limits the scope of the cookie such that it will only + be attached to requests if those requests are "same-site". + + .. _`cookie`: http://browsercookielimits.squawky.net/ + """ + key = to_bytes(key, charset) + value = to_bytes(value, charset) + + if path is not None: + path = iri_to_uri(path, charset) + domain = _make_cookie_domain(domain) + if isinstance(max_age, timedelta): + max_age = (max_age.days * 60 * 60 * 24) + max_age.seconds + if expires is not None: + if not isinstance(expires, string_types): + expires = cookie_date(expires) + elif max_age is not None and sync_expires: + expires = to_bytes(cookie_date(time() + max_age)) + + samesite = samesite.title() if samesite else None + if samesite not in ("Strict", "Lax", None): + raise ValueError("invalid SameSite value; must be 'Strict', 'Lax' or None") + + buf = [key + b"=" + _cookie_quote(value)] + + # XXX: In theory all of these parameters that are not marked with `None` + # should be quoted. Because stdlib did not quote it before I did not + # want to introduce quoting there now. + for k, v, q in ( + (b"Domain", domain, True), + (b"Expires", expires, False), + (b"Max-Age", max_age, False), + (b"Secure", secure, None), + (b"HttpOnly", httponly, None), + (b"Path", path, False), + (b"SameSite", samesite, False), + ): + if q is None: + if v: + buf.append(k) + continue + + if v is None: + continue + + tmp = bytearray(k) + if not isinstance(v, (bytes, bytearray)): + v = to_bytes(text_type(v), charset) + if q: + v = _cookie_quote(v) + tmp += b"=" + v + buf.append(bytes(tmp)) + + # The return value will be an incorrectly encoded latin1 header on + # Python 3 for consistency with the headers object and a bytestring + # on Python 2 because that's how the API makes more sense. + rv = b"; ".join(buf) + if not PY2: + rv = rv.decode("latin1") + + # Warn if the final value of the cookie is less than the limit. If the + # cookie is too large, then it may be silently ignored, which can be quite + # hard to debug. + cookie_size = len(rv) + + if max_size and cookie_size > max_size: + value_size = len(value) + warnings.warn( + 'The "{key}" cookie is too large: the value was {value_size} bytes' + " but the header required {extra_size} extra bytes. The final size" + " was {cookie_size} bytes but the limit is {max_size} bytes." + " Browsers may silently ignore cookies larger than this.".format( + key=key, + value_size=value_size, + extra_size=cookie_size - value_size, + cookie_size=cookie_size, + max_size=max_size, + ), + stacklevel=2, + ) + + return rv + + +def is_byte_range_valid(start, stop, length): + """Checks if a given byte content range is valid for the given length. + + .. versionadded:: 0.7 + """ + if (start is None) != (stop is None): + return False + elif start is None: + return length is None or length >= 0 + elif length is None: + return 0 <= start < stop + elif start >= stop: + return False + return 0 <= start < length + + +# circular dependency fun +from .datastructures import Accept +from .datastructures import Authorization +from .datastructures import ContentRange +from .datastructures import ETags +from .datastructures import HeaderSet +from .datastructures import IfRange +from .datastructures import Range +from .datastructures import RequestCacheControl +from .datastructures import TypeConversionDict +from .datastructures import WWWAuthenticate +from .urls import iri_to_uri + +# DEPRECATED +from .datastructures import CharsetAccept as _CharsetAccept +from .datastructures import Headers as _Headers +from .datastructures import LanguageAccept as _LanguageAccept +from .datastructures import MIMEAccept as _MIMEAccept + + +class MIMEAccept(_MIMEAccept): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.http.MIMEAccept' has moved to 'werkzeug" + ".datastructures.MIMEAccept' as of version 0.5. This old" + " import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(MIMEAccept, self).__init__(*args, **kwargs) + + +class CharsetAccept(_CharsetAccept): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.http.CharsetAccept' has moved to 'werkzeug" + ".datastructures.CharsetAccept' as of version 0.5. This old" + " import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(CharsetAccept, self).__init__(*args, **kwargs) + + +class LanguageAccept(_LanguageAccept): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.http.LanguageAccept' has moved to 'werkzeug" + ".datastructures.LanguageAccept' as of version 0.5. This" + " old import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(LanguageAccept, self).__init__(*args, **kwargs) + + +class Headers(_Headers): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.http.Headers' has moved to 'werkzeug" + ".datastructures.Headers' as of version 0.5. This old" + " import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(Headers, self).__init__(*args, **kwargs) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/local.py b/backend/venv/lib/python3.7/site-packages/werkzeug/local.py new file mode 100644 index 0000000..9a6088c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/local.py @@ -0,0 +1,421 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.local + ~~~~~~~~~~~~~~ + + This module implements context-local objects. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import copy +from functools import update_wrapper + +from ._compat import implements_bool +from ._compat import PY2 +from .wsgi import ClosingIterator + +# since each thread has its own greenlet we can just use those as identifiers +# for the context. If greenlets are not available we fall back to the +# current thread ident depending on where it is. +try: + from greenlet import getcurrent as get_ident +except ImportError: + try: + from thread import get_ident + except ImportError: + from _thread import get_ident + + +def release_local(local): + """Releases the contents of the local for the current context. + This makes it possible to use locals without a manager. + + Example:: + + >>> loc = Local() + >>> loc.foo = 42 + >>> release_local(loc) + >>> hasattr(loc, 'foo') + False + + With this function one can release :class:`Local` objects as well + as :class:`LocalStack` objects. However it is not possible to + release data held by proxies that way, one always has to retain + a reference to the underlying local object in order to be able + to release it. + + .. versionadded:: 0.6.1 + """ + local.__release_local__() + + +class Local(object): + __slots__ = ("__storage__", "__ident_func__") + + def __init__(self): + object.__setattr__(self, "__storage__", {}) + object.__setattr__(self, "__ident_func__", get_ident) + + def __iter__(self): + return iter(self.__storage__.items()) + + def __call__(self, proxy): + """Create a proxy for a name.""" + return LocalProxy(self, proxy) + + def __release_local__(self): + self.__storage__.pop(self.__ident_func__(), None) + + def __getattr__(self, name): + try: + return self.__storage__[self.__ident_func__()][name] + except KeyError: + raise AttributeError(name) + + def __setattr__(self, name, value): + ident = self.__ident_func__() + storage = self.__storage__ + try: + storage[ident][name] = value + except KeyError: + storage[ident] = {name: value} + + def __delattr__(self, name): + try: + del self.__storage__[self.__ident_func__()][name] + except KeyError: + raise AttributeError(name) + + +class LocalStack(object): + """This class works similar to a :class:`Local` but keeps a stack + of objects instead. This is best explained with an example:: + + >>> ls = LocalStack() + >>> ls.push(42) + >>> ls.top + 42 + >>> ls.push(23) + >>> ls.top + 23 + >>> ls.pop() + 23 + >>> ls.top + 42 + + They can be force released by using a :class:`LocalManager` or with + the :func:`release_local` function but the correct way is to pop the + item from the stack after using. When the stack is empty it will + no longer be bound to the current context (and as such released). + + By calling the stack without arguments it returns a proxy that resolves to + the topmost item on the stack. + + .. versionadded:: 0.6.1 + """ + + def __init__(self): + self._local = Local() + + def __release_local__(self): + self._local.__release_local__() + + def _get__ident_func__(self): + return self._local.__ident_func__ + + def _set__ident_func__(self, value): + object.__setattr__(self._local, "__ident_func__", value) + + __ident_func__ = property(_get__ident_func__, _set__ident_func__) + del _get__ident_func__, _set__ident_func__ + + def __call__(self): + def _lookup(): + rv = self.top + if rv is None: + raise RuntimeError("object unbound") + return rv + + return LocalProxy(_lookup) + + def push(self, obj): + """Pushes a new item to the stack""" + rv = getattr(self._local, "stack", None) + if rv is None: + self._local.stack = rv = [] + rv.append(obj) + return rv + + def pop(self): + """Removes the topmost item from the stack, will return the + old value or `None` if the stack was already empty. + """ + stack = getattr(self._local, "stack", None) + if stack is None: + return None + elif len(stack) == 1: + release_local(self._local) + return stack[-1] + else: + return stack.pop() + + @property + def top(self): + """The topmost item on the stack. If the stack is empty, + `None` is returned. + """ + try: + return self._local.stack[-1] + except (AttributeError, IndexError): + return None + + +class LocalManager(object): + """Local objects cannot manage themselves. For that you need a local + manager. You can pass a local manager multiple locals or add them later + by appending them to `manager.locals`. Every time the manager cleans up, + it will clean up all the data left in the locals for this context. + + The `ident_func` parameter can be added to override the default ident + function for the wrapped locals. + + .. versionchanged:: 0.6.1 + Instead of a manager the :func:`release_local` function can be used + as well. + + .. versionchanged:: 0.7 + `ident_func` was added. + """ + + def __init__(self, locals=None, ident_func=None): + if locals is None: + self.locals = [] + elif isinstance(locals, Local): + self.locals = [locals] + else: + self.locals = list(locals) + if ident_func is not None: + self.ident_func = ident_func + for local in self.locals: + object.__setattr__(local, "__ident_func__", ident_func) + else: + self.ident_func = get_ident + + def get_ident(self): + """Return the context identifier the local objects use internally for + this context. You cannot override this method to change the behavior + but use it to link other context local objects (such as SQLAlchemy's + scoped sessions) to the Werkzeug locals. + + .. versionchanged:: 0.7 + You can pass a different ident function to the local manager that + will then be propagated to all the locals passed to the + constructor. + """ + return self.ident_func() + + def cleanup(self): + """Manually clean up the data in the locals for this context. Call + this at the end of the request or use `make_middleware()`. + """ + for local in self.locals: + release_local(local) + + def make_middleware(self, app): + """Wrap a WSGI application so that cleaning up happens after + request end. + """ + + def application(environ, start_response): + return ClosingIterator(app(environ, start_response), self.cleanup) + + return application + + def middleware(self, func): + """Like `make_middleware` but for decorating functions. + + Example usage:: + + @manager.middleware + def application(environ, start_response): + ... + + The difference to `make_middleware` is that the function passed + will have all the arguments copied from the inner application + (name, docstring, module). + """ + return update_wrapper(self.make_middleware(func), func) + + def __repr__(self): + return "<%s storages: %d>" % (self.__class__.__name__, len(self.locals)) + + +@implements_bool +class LocalProxy(object): + """Acts as a proxy for a werkzeug local. Forwards all operations to + a proxied object. The only operations not supported for forwarding + are right handed operands and any kind of assignment. + + Example usage:: + + from werkzeug.local import Local + l = Local() + + # these are proxies + request = l('request') + user = l('user') + + + from werkzeug.local import LocalStack + _response_local = LocalStack() + + # this is a proxy + response = _response_local() + + Whenever something is bound to l.user / l.request the proxy objects + will forward all operations. If no object is bound a :exc:`RuntimeError` + will be raised. + + To create proxies to :class:`Local` or :class:`LocalStack` objects, + call the object as shown above. If you want to have a proxy to an + object looked up by a function, you can (as of Werkzeug 0.6.1) pass + a function to the :class:`LocalProxy` constructor:: + + session = LocalProxy(lambda: get_current_request().session) + + .. versionchanged:: 0.6.1 + The class can be instantiated with a callable as well now. + """ + + __slots__ = ("__local", "__dict__", "__name__", "__wrapped__") + + def __init__(self, local, name=None): + object.__setattr__(self, "_LocalProxy__local", local) + object.__setattr__(self, "__name__", name) + if callable(local) and not hasattr(local, "__release_local__"): + # "local" is a callable that is not an instance of Local or + # LocalManager: mark it as a wrapped function. + object.__setattr__(self, "__wrapped__", local) + + def _get_current_object(self): + """Return the current object. This is useful if you want the real + object behind the proxy at a time for performance reasons or because + you want to pass the object into a different context. + """ + if not hasattr(self.__local, "__release_local__"): + return self.__local() + try: + return getattr(self.__local, self.__name__) + except AttributeError: + raise RuntimeError("no object bound to %s" % self.__name__) + + @property + def __dict__(self): + try: + return self._get_current_object().__dict__ + except RuntimeError: + raise AttributeError("__dict__") + + def __repr__(self): + try: + obj = self._get_current_object() + except RuntimeError: + return "<%s unbound>" % self.__class__.__name__ + return repr(obj) + + def __bool__(self): + try: + return bool(self._get_current_object()) + except RuntimeError: + return False + + def __unicode__(self): + try: + return unicode(self._get_current_object()) # noqa + except RuntimeError: + return repr(self) + + def __dir__(self): + try: + return dir(self._get_current_object()) + except RuntimeError: + return [] + + def __getattr__(self, name): + if name == "__members__": + return dir(self._get_current_object()) + return getattr(self._get_current_object(), name) + + def __setitem__(self, key, value): + self._get_current_object()[key] = value + + def __delitem__(self, key): + del self._get_current_object()[key] + + if PY2: + __getslice__ = lambda x, i, j: x._get_current_object()[i:j] + + def __setslice__(self, i, j, seq): + self._get_current_object()[i:j] = seq + + def __delslice__(self, i, j): + del self._get_current_object()[i:j] + + __setattr__ = lambda x, n, v: setattr(x._get_current_object(), n, v) + __delattr__ = lambda x, n: delattr(x._get_current_object(), n) + __str__ = lambda x: str(x._get_current_object()) + __lt__ = lambda x, o: x._get_current_object() < o + __le__ = lambda x, o: x._get_current_object() <= o + __eq__ = lambda x, o: x._get_current_object() == o + __ne__ = lambda x, o: x._get_current_object() != o + __gt__ = lambda x, o: x._get_current_object() > o + __ge__ = lambda x, o: x._get_current_object() >= o + __cmp__ = lambda x, o: cmp(x._get_current_object(), o) # noqa + __hash__ = lambda x: hash(x._get_current_object()) + __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw) + __len__ = lambda x: len(x._get_current_object()) + __getitem__ = lambda x, i: x._get_current_object()[i] + __iter__ = lambda x: iter(x._get_current_object()) + __contains__ = lambda x, i: i in x._get_current_object() + __add__ = lambda x, o: x._get_current_object() + o + __sub__ = lambda x, o: x._get_current_object() - o + __mul__ = lambda x, o: x._get_current_object() * o + __floordiv__ = lambda x, o: x._get_current_object() // o + __mod__ = lambda x, o: x._get_current_object() % o + __divmod__ = lambda x, o: x._get_current_object().__divmod__(o) + __pow__ = lambda x, o: x._get_current_object() ** o + __lshift__ = lambda x, o: x._get_current_object() << o + __rshift__ = lambda x, o: x._get_current_object() >> o + __and__ = lambda x, o: x._get_current_object() & o + __xor__ = lambda x, o: x._get_current_object() ^ o + __or__ = lambda x, o: x._get_current_object() | o + __div__ = lambda x, o: x._get_current_object().__div__(o) + __truediv__ = lambda x, o: x._get_current_object().__truediv__(o) + __neg__ = lambda x: -(x._get_current_object()) + __pos__ = lambda x: +(x._get_current_object()) + __abs__ = lambda x: abs(x._get_current_object()) + __invert__ = lambda x: ~(x._get_current_object()) + __complex__ = lambda x: complex(x._get_current_object()) + __int__ = lambda x: int(x._get_current_object()) + __long__ = lambda x: long(x._get_current_object()) # noqa + __float__ = lambda x: float(x._get_current_object()) + __oct__ = lambda x: oct(x._get_current_object()) + __hex__ = lambda x: hex(x._get_current_object()) + __index__ = lambda x: x._get_current_object().__index__() + __coerce__ = lambda x, o: x._get_current_object().__coerce__(x, o) + __enter__ = lambda x: x._get_current_object().__enter__() + __exit__ = lambda x, *a, **kw: x._get_current_object().__exit__(*a, **kw) + __radd__ = lambda x, o: o + x._get_current_object() + __rsub__ = lambda x, o: o - x._get_current_object() + __rmul__ = lambda x, o: o * x._get_current_object() + __rdiv__ = lambda x, o: o / x._get_current_object() + if PY2: + __rtruediv__ = lambda x, o: x._get_current_object().__rtruediv__(o) + else: + __rtruediv__ = __rdiv__ + __rfloordiv__ = lambda x, o: o // x._get_current_object() + __rmod__ = lambda x, o: o % x._get_current_object() + __rdivmod__ = lambda x, o: x._get_current_object().__rdivmod__(o) + __copy__ = lambda x: copy.copy(x._get_current_object()) + __deepcopy__ = lambda x, memo: copy.deepcopy(x._get_current_object(), memo) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py new file mode 100644 index 0000000..5e049f5 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__init__.py @@ -0,0 +1,25 @@ +""" +Middleware +========== + +A WSGI middleware is a WSGI application that wraps another application +in order to observe or change its behavior. Werkzeug provides some +middleware for common use cases. + +.. toctree:: + :maxdepth: 1 + + proxy_fix + shared_data + dispatcher + http_proxy + lint + profiler + +The :doc:`interactive debugger ` is also a middleware that can +be applied manually, although it is typically used automatically with +the :doc:`development server `. + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78ed27708b4ce2d29929bd12991387087fe09b74 GIT binary patch literal 762 zcmYjP&1xGl5Z>g{Ajku>g))~O0<||u8=NeONz+2C~GyIJ<9Hy&k&l}kQpk1w5l&-Bi9cCf2n z@k8;&Xl-$+B8rPA5#l}EUVr)w%~KRi0=03f5UeQ`8Sj8q3q#-G2itsq3-8I1{&Z%}NFu;^2L({SH5A(Sd% z8VfNVbNP}YVo?ZSDH^rX7^p7bNDLk>xmwGGSq)aI8LpOEks54mQczU#@PkbJr;>oiU^hf{z literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a36eb32ff21718f85aecabbe81d9b3bf2972c63 GIT binary patch literal 2451 zcmZ`)+inv_7~X^9gl%Y1i+Z4{G)jeNq$Ccs2(X|cgcgE`u}CUZtJP|}GfpP#iJ7$% z)6ErJ^(o-8Z_(%QZLj(YT=n~BvvxRiE$__E%zym8|DQW&&jt>juWw!W{qF_G`G-F0 zr-8|B{LPnm38&}WbA&6rmyYnH`@-*e!ryV08~j%s3^wvSRuL~$ma@Cb3D?61dUA`yT zsrXjdAQHicX2?`xK8E#;I{YS;DeW0#=qlE>}r_}n+1{KzLtgt_<00~{9kS?_$tU@SQIlV!?(H4!f&Ew@D*h*QhGck;a>noN8 ziQ3yQfUqef7vMw+S|b)pJwYwm{oUPem0itZIg;^8KyDGus^}0Llpc*~rO4hQeub)G zeQrQya5c`VI$L7^I+#+f&Mz2j@svCw^q7!&oQ)xRr~oIpAaf38os?LmeI+0e$Wv3G zhNBa&Dn&D52&H9I#ADVUzZ({av9`weu*jmA8{qOmFoK{RW%*cBzS``{`ua821*ozx zK^yHurbf2eot?X@->+`Qd}w44q4!K5AG6!|no}WP(pRZu(XXZaSp9uS_ViW z(6eN&mCb;o{MwpQAd9hD>JDXV0y!jFwh5nvIM619-|K5+qBcl#HLzful*E+80^KFO zRIr3vF>tRCx+~XX|rvfo65gj%YiyV(Y;N@st9Y-plYS26A>=-(CFd6iN86I zSLv2c=#*Z*s2t3I7f^9K%ihFCc#~#jdfA^ejEo1GWHl-I%h7Wf-W;`ZtwtbgYs7VH zki}>!rj_Vc{~!#no2%)yk@z7B^U;;{VsL%$K*yH{S8v>C?Y452uTnvRU90jMS81-U zw4O-)^tl}FwGQja>?Vpw#6Ms(@7LrL* z8x%-kL0VqW6y9WBrXz)$uJR6Nz>SSu6KsmhD@S+6S%!IXbwfF3YqlI zXJ`W|<#AY@4O5;-3w!lyk^#UF0m3l6j4yKmFUMVU8(!ej&-2c?=e%>?BGwlEADl`9 z@vcb<$xawff-p?b#$%cV80vYL)1T0b*m&wizG=$ZxA+_ST3CQn l4ZGG^_Vs62nl!Wi0s5s~JSA*(Rngt7Jou538cI;Z{|_Bn;&cE2 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483c20fe247066e97663b326e0f8de65cb8bc546 GIT binary patch literal 6366 zcmbVQO>o>sc5YxWKLp7UCCid1%Qj3)E6*;)p=G;d&&pa`HZ5t(J7PpS@=n&lfYUuB zNDMIQ#_-RWs#K&cX;bAY<(d;&l}qlqC8ty>x9lNDTys*6Ir_BUYhZ??>@8PEn|bx zPp>iEn*1#b&9B)V#%(_Ngz-sHeOzdr;^qpgP3_0_ZBO|f=kDt2va>9s-97u`mmb?* zSa7^S9CZRusYW9k_8Xt`Kx+vwoMkTvM6B#a;CDo*M8mng z^7*y*u6-7G110PikOFJIFj3Zww7L{-`!Wje3Xcn^&~nyS?ncyi*Y@<^hVDT7#6Sja z-;+v=J{}FCm_BCKMeO=ve-OJWmcr|yt<(v85yl-_Z1faR`2?@}ISRp`0M;_O(JJss zZt>z1qh;|DFF#?eBCqfX{Fk^*f=W+m;T-MS`;RhXy3LW|(LktJIfD=za6G5)#T!l> zIbP_9-B`%b3mhfnwvh9Vj0UkEt~*h@A*Ai#8BfOyG&)|tzhLX0)eT=cy|JL34hTkJ zu;=tiQJKz0v*#U8VY(MPm_uY}pr(Ss&|MTb8(s*Nac6B$4|uq8=U&d%f^(nPA-Z~~ zns?NovjLKt!j4!|QD;lUV_xTpmoSQ*HKCdDK^9BL#Bkv43Ax~C=G8_t2)HJq8OLxK z0C&2Pbhy|SLDcU-NAr#!5*qn2!WVuis>95gZB)pACVP)JVY=v>+lb?Sqh5da`i+G}{N8PRu(qZAc)LjnUG~CEk@$Pk+-=YXUYP#>)}A zemv$YcZG~K;sYZ^*Bb=dyxZ+Byg-R|d&Cdz|2P}%_S{WEtXp&Kw)0Ltvv#y?+6B?f zvB@}h3I_8rIh&?sv&| z#-hnEOA8#3lI@Qc`83?iAj8@Af`Rx++E9-ivA^RJ9AN``>R4tO+#cuiQ|%8h8Bb!h zu9E>T;6yuuf}=WPS~>3IvKepw&uZ-3;gPzO3fxW<#sJ5Y%QvzR)5d^>m6b0)%g2!J z{g6y#Bif-Au{pm>8p?s!KdF`6qM=a=Yb!ruKbeMd^tcBNLpoyD>-7WR?;3yd5~LIeKZu z+>Nw9lK&ku8+eq;chf+C^m+tP4Q=BZ=JAD44ATZfuj73nr@L;&@iXC11YEL0;*W)Xt; zA)5sx!QnJ8o**9kJ%Q*6$^x8mHNp^zihYrBNmIQM|6R`yMq)t@1BEIwZq5Zq8Uu`d zU(4VHr35c1d+QWY&_n+g-U43LKtajW6ZQv|7zuM(Y&>OMoxDA%B<6v6$UbL}jmOki zND3&e#6nr*47o$G*)c$Y9{MM;D|prWC=zy{NgtXvthzwO1MzU|36LI|Z| z^`5M+ZMyD<>VxpcHh;h4_P4Ju#@!FsH)Zf{_k)i#W9k&?5Ic~uP@Wsqtt7`MXKk= zuDftEh=A4V*1`!IV{w!ANR#go(RWZJ>>KBI=Fk|L9GWE29~$S_GnSZ-jjs8Z(9a`N zC&q<+tA0h*zc=bl$gK!N_4~C#YA!6M##U-<*9>_U^t9~cE2w=xadTaSVz)1EeNC%T zZfmjqU;H%d<9W4GT7aLX7Nsp|5q{89X*u`I)IM@8G-jSqE2fqbL096u!Q>lMyh(*a z1*vt!CUKZnMq+E?OHH9*Mx|UbOyiD5kg8I>5K7dLf4~?V{SDqCfyw&GM|1y8&nYDR}pZ%^dEQO!wk+15JZH$~bHnPdj(Ma%q9um6norUo; z@o7GLaE4|b0;T@eNJ1%NRi z7zQ&yJu$oH-h*7R(4$HyN=C`382g{T?8|*ZP!}ov7%`7!1V@cW6l-Q`BmD}6K9Hrw zP7oorAuh*J#=47`)0&_Z%e{MlWmQ&*Kf;y$BCzv{lCPqkRzJJnTwQ9ex?e6e@2uYa z0+d;EzY5|=t>bH7>it6^r&pyHs;-dNmckD5;&44JYs?dT74Z!*VqXTt*pAgSz5h&|8vBG3AN?-aV?=@K=N2X@+w$R zglSiHr|m0h+Li=%6mxHT{0`#kj<*M~aOa9T5uV0YM0l#L=+ci_(UJ9JxIVI!*pCD8 zQYs^j~aPD^xQ z6Y|uetAey7b>vSA@Y1vtsY9D5gc0i5j^8IG+T2Bw8H& zh5V34e57fL-Hyoa1LOzPP@;Q@fx;ezr=l>mF)t@vJC&A2b}5%uF-*qpm?AlOYm(B> z7#9E}q!E<4Ih6f^s28xI)Xs@ZB7|ykVc+0&zNTn%dEhjY~y0V z*7X_Gsb*n>g(Qedi&~6o!K9j10hm@mY05lnR*fpgo&k-DX`%&*6W$BvOtywuMQar; z)navO|Jwh_Qn4Y*tFUYB4&$xM7Fy+BQK7TBV^Ybw^l%bMCX31l=D$Icjt7ib@Bc8j z8x8D`H_$_-M7H-CUiE7f2$RU{D6QFKLkl6FZR+$4fqxDNRUDR*!a*S^9vbo@QXeb9 zH@*r(YneT|i14gq9);YR*=$WLf4X|tz1RHWJ~nxjt!g*4wS_6VS&+ZO%C&MPhE>$% zS5%N0WV5tDw0uqmLrQMx*2Z=J3u6@-DUw^GWS)gStN8z+2u2f{h#Yj_kdr8CWug>% zJ>j~k?Yg+283a_Ha@|J*FUWh!uFIp2>&iKrNKDJWrs9YxT_XdP6DTN#>*!E<-!kn} zm4R-p&B!$xK~CDL5-h?Qa05Dkvt=+vsYR9(SnwgGtwcja%i2-veg*&(zdYxwLXK+u<$ZQk_F#!MsN&uPK=H48&J0{0Ujxx*<)MQmXc{jqAd?=9Jq;Yk|2R@=yih< z5hztNbYe}Vobn+x*O8{CD$X^hIpmnb9CAwKgvu=^Rpso1FUj})y@3?z)YPO=-RQT! z_wP%8I5APxa6R+xi7)=~yr%sZ3)yAk<$c^yP1iI}Thu(=GunE`STuCaGd-(qcC1B9 z-b;8dEtcfHjQ8?lS>7w{O2=Nb<=t+Nb*hV1c^_+!cWR56cykJ~R@)Pu$;C-syQ2k; zrTP2TtLmYy@h7d5N$bzF!1!Fds(IsH?JLcz`BPiw;(nATyh)TNrF_79&YSY~f2A)T zM9Ts1AX*OkhtTsd%7?teC?A&c5tNU3M^Qd1<)glZnq%H^)EsBcmcDolH7C4hQ1guR zIqp4sTbp^_{X2l9dgu1l>&{IT#$hvTJ2zTE?5pa#yIj@k!fGpWI-%EV`%YJd8!gX| z9M|czJg@EFbCvJJt8VOceYG5_PUJ*x(26&m=BnRZkDM?-vtM2ESKWU7(F z$HzfDnZa#Gp@Z!OvWF<__|<0E>0m$C78Y(gzEYvWW_!(5$BmpI49@tSF7~bbs2c_m z&WPhUub+LxiDEbIMNTus!Rys(z3#X@z^&~@(cGNC?&BO5)#_X`>~5;o%4$64oIiW^ zZRe)jZu@amox=frOg!g&c>AL>ub;Wpc6*UueL|X@(T5iI`ou^I2lLZJjTTVj#-TzV z^XAXa;?1rfpy#vG0lV|TDcEZld}7e{~~fD(lA2xyP$^E1}a zZZrb7<2M?^YNL_R58i8y#@(LVPFpICh8H#)jepV<*OkW)YPPFd8*c2+Zn$c8Ic)Q6 zvmG_NwAN@`h~5m|-tgXNHo6<<&&JCaR@PMe-13|6yfeEn+ii8vv;yF(-9F>L?Y4q$ z>-_8;U#<83-pcH~?4=;x*)}M@4t$Mc_2+R%M1ZYJ`HzDSsp?1IBSbd}A64UlC-|7; zV;>(m5R$k3tUG|mN!;1iSbk#S(d2^{|4X5o-f|OON&SG4)amEDq9|HFMcG zqQ%x0rJx498uR@ZreBVxLG^cgEs#Eloun0=c2>gJVbe@$Xpzu{CYlt%lkA)j16@>_ zAz1EyJT$|lwP6*oZ?3of4Zl5d79L|*6M@i3=6?k>5rwp-*K|Xl($#UiH(8NgT z(HnRa1nC)HX&_37aQs_d$t&Z(C4|sjIl75AjGa<>~8&dNziR0=96pZ%kbaPNZ$6byK~CwsO%n(ALZ~YoPxkh5(D6FrRORasPQ3Roy(tGaXPMAhqO%uvIE}e#l$uadKw}b0>R$6uGSVuSS)XcQg3nF*fuRE8*fYP4*6DiK&n@#}CD-cuMQ-QOr!VYGJ zkmi(iMKYby)iL}%ksY632ty1DHXX<#hzbZg2y}>5-`ivTI;hcX`$0m7Bti8I9z%=! zn*j`^;Hs5q2eQ;p&;lz#i;m!tP@Q2KdetEP@n;+TsZrc<#@+FD0~7oR-d@V_W~d9> z@fO&z=~cG$UxMP+thG{#K|94@H3Z&p!X9-U6fyK~hLleue^;bY zB;qvNFrZ$*Df)lC6UX^N(22wvFu^q)*NIwv-&v)&OcZcVXi=}*4OJ|dKJB<|?r>$* zX~omn-G10m;zWBBK)Sj5Oj$YDeL)1nu?0w|%T(zJ zJ=nw^yQegvPO^U?T}80IggOxdq{x&cjGQF+X4*R#I-52p4AL>>n9TDQUN);hzqSVP zdt0-#*nl~BHZcc*dOfy0FgV#e);x=SK2HQsX}u3|Vh_74S>7p%fvK6KJjD7I4|RZQA?ogLXx+zKJ`(DB9o0{U_-w zA>lt#UkRWxI)4s37&(U=f#>B`a}_nRN}-~-e_s4IabLn6@sz|g%n6tbr0YkV;HM3 z+Nw~8B1LR!ZEjfo8Ruft2pDr2zlHjUQc=^(x}{ITv@PS;Kepr81(nfy;l+R6Lh%H~ zAfa+uWe=vO+WZE0CPa5zWxEYQ2pzOMTDh z&y5HA0|OF8TPttr56pqFR`JZ(hI48>fa~d%;IjV1{kH}Nv|$~+OApF}(xWlpt~7vG zzFtwc;_9HZrQ?6xs|-pAJk*H0ySMIW15*_nNx~@h491zR8 zH;z^Qb6|NjIKh9wh>3xo&6CbCS=0n4&{IRuR~J;I={i=Cy=+pItFu;`ON@bPbWByRjH=G-wZ851~3fHK{alWe`- zKl$_kdJdxt^{>KTkKr$#xgqD3kSi%V=yjIBCkVhRAd0s)Iv*%E{y=E(5XNDe(T*ZoZ>;0?Fk+i6+JZXRQahswpa5e@IU5FLI>;{PTl~~6#;qoF&1E47Qu)mhECEXfLOi}`IfXUp)=+o zBuu*_Sy6RxjpQosNhsYL^=|9VZ6p}78g$E!RHRk%Aw{YKlEiC~a@=+ya`Jw? z;BGG@A^Neq66Mv(ZzD|uA@=F58#(-Lr1CM9i+SfHGF5~Wi-_V#msCqo>P3t^5_5CNEX;kG1=hbz6IDpl5NUG~S0tk5oP`|C1xzUFh|RP+ zGCLGOXO`Mwa~-Lj?j~YcK{6Gm6WC^1gnE%hsKY};sHP)fu0uLUab5k(uc&%n!e?sdBvXfCjSniXzF8{@+mv1jL zKEAwg?URod$8TT0_1WcHjrk8gzML0sesXJ}UlVGEof(0J`qhHA`{PAW1V)4uI=wcs za;pp=_V*VxNMAPnDC$p0mFfkJFlhSymv1Hc7%<<+IiU1taZtO9)u9ez%iFgB(qLdW zF(po3P6ihM5YU{fpUtMN<3yKkUB9^?#~VV5-uz(UTI2fsl}}`fAN1M&ndy-()3689 z1cO+{d2|@r(A7EYuK(I}KE?mp8Ga(|uAxOlj9APc5f!DxIH;r$P=C&z<55$!y0K&y z7stA8yowwQM8tOOGn`10P3h48#z+avr9ockJ{$TUItg#og*Dg+beC$P{aIt1v;+9o ze|854ZJRoGA!!Wc&doB+gAqqve}u4sXFLWQ9oHVfp&20b>sjk&R3BJ0yrcJGIPV^e zWzX`;-@tfC98IqRQ}{Emla;d5vh*7p=~w1lFv!7H>zevoX&)bHuM7-i0&N(@zm>LH z(RTlrV!Zbslwz3Y=ry)J7X2$$<~}CChW{ZWCW{e+5)A$Fg9`e?DTu4+|2^K3(ct^H zx+=?veIp~vkH#Ov<$xLgowQ9AZFj$;BS3>4BX7jDffM>tadUp$hz)0pN(qmOz$S2KNNE!0pdhmx5=ymN^@i*^e>Lz)M09hM|k-gmAg7IJc^xQFi^obzYsd^%Ey`p>2_ zurBpIaQ1Z1{VP<3>H1m6B-@ata-d+n9$*zh9R|zzYyo*D$pTT~Uc!eX5k9_v6P#Hx z1-$(GP2tCxeG+dPmLh!C5sRZcth6G5`v{+31}IVqz~c=|vVV1$)mQKsR$EZ?*eYbA zq9dCzcCzgVv3&+e)aQI$W4oR0KwV{#8Ilg-E=Vp8OR~+KlHyR7mWG?($o#Hj;NR#X zCSaIr$~c7k7({`gTMRnFiI{@0m@=yRG5FxNege-VjcA!Q^9WktVi^4wcNH8s&B#i* z;-?bgEo%5Xyg)sIZyuBC4RLDk4-Ci=1f11}@@C@gt=NEar8I%dO}T--6;Jyc19C>j zc{blsJC@XnlWnMFNDCvnPbXVupv1^#;JP)eYbLy@eiuVMBLr58ekXk=ioT+9C+CM2 zO~e_aZ`_&f8~2j?<$J!nF190#ILLR#ubc?E!8TnRr`K(|5z<;@zKjt~ybBjU`5#u+W5?`mef6QP}RqsXdy0#{fGRt7V;1s}w=dkFbJ#q@d!66g}dQ z(%2f713$*7H1H-QrF`ycm5=R8Mm11(jg;cx1(ZUp<43h&n>FJVQi#;CW)C%z5^_!k zw90ZdLfWP^79-}xNaUz3CZI>2?Kfm**o4{FQ-vqsCj4F(%QvHJ@G-Km@Tn0Y3*c?8 zBJmEPgO9L~RCeMPoS1Fy|7qvmY73u8$*^^f#YaS9l7l7d&aEWVpGYSMAQvN^`QAL| zOdBP$t}OMJC@Gqog%rplU^Y%6QMw&)hV#!)$?|}zOOO*=WKJ-p2_601uB;}TVVoBu z6#}@4265j1WN#-3J zlpg92wJj40t~#Gc{TDt+y;L|7vAYf6hDT9N@rwycfdw%~S35 zy^YqyL|w**W5{v`dnfspWuPmDa!WD7 zjZ7oL8Zs%D08oH59bblx@EO{~MhXzf6YwDLC;&1a(uRU$16ZwxY3-H?Akhk_F!3ki zLrmgxnI%Dn3rh6_)yvtyU5gmKZUaemJ>(0|`gazZ)JEW`OsLkCa9g$uGziC(t9Y zamg9BX+bDaRaFhkIHLD2?BJ3tt5d&7N!gCxtM4)SOm*kU?qDIwflC5Tjj<^1Xq#^g z@<7^(ZsxfaQ=IBkK0-d$`Jgm?>f|b5lX$XB^sE=+l@>Z9bTueohQ6mP8)eHla2V%9 z9BYrW&13HjdhPtuPCf#VQwWkM%a!b%%Z^AOk@>P8W-R_4x1?C?!RlWHSy7uA0=jvwHn7=37IZh z^b7^S!y3NaY`2!`^7W%WM;EOaVSdyLZ ucHE(TG5Kcmy-DT7(qoe^?*5LO<7fY>W!&GQ{y$=zWKk&fE@7v literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8288eafb860c7e99f4e40f613d7c879db2a336dc GIT binary patch literal 4628 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"`` (default): + The host header is automatically rewritten to the URL of the + target. + ``None``: + The host header is unmodified from the client request. + Any other value: + The host header is overwritten with the value. + ``headers``: + A dictionary of headers to be sent with the request to the + target. The default is ``{}``. + ``ssl_context``: + A :class:`ssl.SSLContext` defining how to verify requests if the + target is HTTPS. The default is ``None``. + + In the example above, everything under ``"/static/"`` is proxied to + the server on port 5001. The host header is rewritten to the target, + and the ``"/static/"`` prefix is removed from the URLs. + + :param app: The WSGI application to wrap. + :param targets: Proxy target configurations. See description above. + :param chunk_size: Size of chunks to read from input stream and + write to target. + :param timeout: Seconds before an operation to a target fails. + + .. versionadded:: 0.14 + """ + + def __init__(self, app, targets, chunk_size=2 << 13, timeout=10): + def _set_defaults(opts): + opts.setdefault("remove_prefix", False) + opts.setdefault("host", "") + opts.setdefault("headers", {}) + opts.setdefault("ssl_context", None) + return opts + + self.app = app + self.targets = dict( + ("/%s/" % k.strip("/"), _set_defaults(v)) for k, v in targets.items() + ) + self.chunk_size = chunk_size + self.timeout = timeout + + def proxy_to(self, opts, path, prefix): + target = url_parse(opts["target"]) + + def application(environ, start_response): + headers = list(EnvironHeaders(environ).items()) + headers[:] = [ + (k, v) + for k, v in headers + if not is_hop_by_hop_header(k) + and k.lower() not in ("content-length", "host") + ] + headers.append(("Connection", "close")) + + if opts["host"] == "": + headers.append(("Host", target.ascii_host)) + elif opts["host"] is None: + headers.append(("Host", environ["HTTP_HOST"])) + else: + headers.append(("Host", opts["host"])) + + headers.extend(opts["headers"].items()) + remote_path = path + + if opts["remove_prefix"]: + remote_path = "%s/%s" % ( + target.path.rstrip("/"), + remote_path[len(prefix) :].lstrip("/"), + ) + + content_length = environ.get("CONTENT_LENGTH") + chunked = False + + if content_length not in ("", None): + headers.append(("Content-Length", content_length)) + elif content_length is not None: + headers.append(("Transfer-Encoding", "chunked")) + chunked = True + + try: + if target.scheme == "http": + con = client.HTTPConnection( + target.ascii_host, target.port or 80, timeout=self.timeout + ) + elif target.scheme == "https": + con = client.HTTPSConnection( + target.ascii_host, + target.port or 443, + timeout=self.timeout, + context=opts["ssl_context"], + ) + else: + raise RuntimeError( + "Target scheme must be 'http' or 'https', got '{}'.".format( + target.scheme + ) + ) + + con.connect() + remote_url = url_quote(remote_path) + querystring = environ["QUERY_STRING"] + + if querystring: + remote_url = remote_url + "?" + querystring + + con.putrequest(environ["REQUEST_METHOD"], remote_url, skip_host=True) + + for k, v in headers: + if k.lower() == "connection": + v = "close" + + con.putheader(k, v) + + con.endheaders() + stream = get_input_stream(environ) + + while 1: + data = stream.read(self.chunk_size) + + if not data: + break + + if chunked: + con.send(b"%x\r\n%s\r\n" % (len(data), data)) + else: + con.send(data) + + resp = con.getresponse() + except socket.error: + from ..exceptions import BadGateway + + return BadGateway()(environ, start_response) + + start_response( + "%d %s" % (resp.status, resp.reason), + [ + (k.title(), v) + for k, v in resp.getheaders() + if not is_hop_by_hop_header(k) + ], + ) + + def read(): + while 1: + try: + data = resp.read(self.chunk_size) + except socket.error: + break + + if not data: + break + + yield data + + return read() + + return application + + def __call__(self, environ, start_response): + path = environ["PATH_INFO"] + app = self.app + + for prefix, opts in self.targets.items(): + if path.startswith(prefix): + app = self.proxy_to(opts, path, prefix) + break + + return app(environ, start_response) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py new file mode 100644 index 0000000..98f9581 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/lint.py @@ -0,0 +1,408 @@ +""" +WSGI Protocol Linter +==================== + +This module provides a middleware that performs sanity checks on the +behavior of the WSGI server and application. It checks that the +:pep:`3333` WSGI spec is properly implemented. It also warns on some +common HTTP errors such as non-empty responses for 304 status codes. + +.. autoclass:: LintMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from warnings import warn + +from .._compat import implements_iterator +from .._compat import PY2 +from .._compat import string_types +from ..datastructures import Headers +from ..http import is_entity_header +from ..wsgi import FileWrapper + +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse + + +class WSGIWarning(Warning): + """Warning class for WSGI warnings.""" + + +class HTTPWarning(Warning): + """Warning class for HTTP warnings.""" + + +def check_string(context, obj, stacklevel=3): + if type(obj) is not str: + warn( + "'%s' requires strings, got '%s'" % (context, type(obj).__name__), + WSGIWarning, + ) + + +class InputStream(object): + def __init__(self, stream): + self._stream = stream + + def read(self, *args): + if len(args) == 0: + warn( + "WSGI does not guarantee an EOF marker on the input stream, thus making" + " calls to 'wsgi.input.read()' unsafe. Conforming servers may never" + " return from this call.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) != 1: + warn( + "Too many parameters passed to 'wsgi.input.read()'.", + WSGIWarning, + stacklevel=2, + ) + return self._stream.read(*args) + + def readline(self, *args): + if len(args) == 0: + warn( + "Calls to 'wsgi.input.readline()' without arguments are unsafe. Use" + " 'wsgi.input.read()' instead.", + WSGIWarning, + stacklevel=2, + ) + elif len(args) == 1: + warn( + "'wsgi.input.readline()' was called with a size hint. WSGI does not" + " support this, although it's available on all major servers.", + WSGIWarning, + stacklevel=2, + ) + else: + raise TypeError("Too many arguments passed to 'wsgi.input.readline()'.") + return self._stream.readline(*args) + + def __iter__(self): + try: + return iter(self._stream) + except TypeError: + warn("'wsgi.input' is not iterable.", WSGIWarning, stacklevel=2) + return iter(()) + + def close(self): + warn("The application closed the input stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class ErrorStream(object): + def __init__(self, stream): + self._stream = stream + + def write(self, s): + check_string("wsgi.error.write()", s) + self._stream.write(s) + + def flush(self): + self._stream.flush() + + def writelines(self, seq): + for line in seq: + self.write(line) + + def close(self): + warn("The application closed the error stream!", WSGIWarning, stacklevel=2) + self._stream.close() + + +class GuardedWrite(object): + def __init__(self, write, chunks): + self._write = write + self._chunks = chunks + + def __call__(self, s): + check_string("write()", s) + self._write.write(s) + self._chunks.append(len(s)) + + +@implements_iterator +class GuardedIterator(object): + def __init__(self, iterator, headers_set, chunks): + self._iterator = iterator + if PY2: + self._next = iter(iterator).next + else: + self._next = iter(iterator).__next__ + self.closed = False + self.headers_set = headers_set + self.chunks = chunks + + def __iter__(self): + return self + + def __next__(self): + if self.closed: + warn("Iterated over closed 'app_iter'.", WSGIWarning, stacklevel=2) + + rv = self._next() + + if not self.headers_set: + warn( + "The application returned before it started the response.", + WSGIWarning, + stacklevel=2, + ) + + check_string("application iterator items", rv) + self.chunks.append(len(rv)) + return rv + + def close(self): + self.closed = True + + if hasattr(self._iterator, "close"): + self._iterator.close() + + if self.headers_set: + status_code, headers = self.headers_set + bytes_sent = sum(self.chunks) + content_length = headers.get("content-length", type=int) + + if status_code == 304: + for key, _value in headers: + key = key.lower() + if key not in ("expires", "content-location") and is_entity_header( + key + ): + warn( + "Entity header %r found in 304 response." % key, HTTPWarning + ) + if bytes_sent: + warn("304 responses must not have a body.", HTTPWarning) + elif 100 <= status_code < 200 or status_code == 204: + if content_length != 0: + warn( + "%r responses must have an empty content length." % status_code, + HTTPWarning, + ) + if bytes_sent: + warn( + "%r responses must not have a body." % status_code, HTTPWarning + ) + elif content_length is not None and content_length != bytes_sent: + warn( + "Content-Length and the number of bytes sent to the client do not" + " match.", + WSGIWarning, + ) + + def __del__(self): + if not self.closed: + try: + warn( + "Iterator was garbage collected before it was closed.", WSGIWarning + ) + except Exception: + pass + + +class LintMiddleware(object): + """Warns about common errors in the WSGI and HTTP behavior of the + server and wrapped application. Some of the issues it check are: + + - invalid status codes + - non-bytestrings sent to the WSGI server + - strings returned from the WSGI application + - non-empty conditional responses + - unquoted etags + - relative URLs in the Location header + - unsafe calls to wsgi.input + - unclosed iterators + + Error information is emitted using the :mod:`warnings` module. + + :param app: The WSGI application to wrap. + + .. code-block:: python + + from werkzeug.middleware.lint import LintMiddleware + app = LintMiddleware(app) + """ + + def __init__(self, app): + self.app = app + + def check_environ(self, environ): + if type(environ) is not dict: + warn( + "WSGI environment is not a standard Python dict.", + WSGIWarning, + stacklevel=4, + ) + for key in ( + "REQUEST_METHOD", + "SERVER_NAME", + "SERVER_PORT", + "wsgi.version", + "wsgi.input", + "wsgi.errors", + "wsgi.multithread", + "wsgi.multiprocess", + "wsgi.run_once", + ): + if key not in environ: + warn( + "Required environment key %r not found" % key, + WSGIWarning, + stacklevel=3, + ) + if environ["wsgi.version"] != (1, 0): + warn("Environ is not a WSGI 1.0 environ.", WSGIWarning, stacklevel=3) + + script_name = environ.get("SCRIPT_NAME", "") + path_info = environ.get("PATH_INFO", "") + + if script_name and script_name[0] != "/": + warn( + "'SCRIPT_NAME' does not start with a slash: %r" % script_name, + WSGIWarning, + stacklevel=3, + ) + + if path_info and path_info[0] != "/": + warn( + "'PATH_INFO' does not start with a slash: %r" % path_info, + WSGIWarning, + stacklevel=3, + ) + + def check_start_response(self, status, headers, exc_info): + check_string("status", status) + status_code = status.split(None, 1)[0] + + if len(status_code) != 3 or not status_code.isdigit(): + warn(WSGIWarning("Status code must be three digits"), stacklevel=3) + + if len(status) < 4 or status[3] != " ": + warn( + WSGIWarning( + "Invalid value for status %r. Valid " + "status strings are three digits, a space " + "and a status explanation" + ), + stacklevel=3, + ) + + status_code = int(status_code) + + if status_code < 100: + warn(WSGIWarning("status code < 100 detected"), stacklevel=3) + + if type(headers) is not list: + warn(WSGIWarning("header list is not a list"), stacklevel=3) + + for item in headers: + if type(item) is not tuple or len(item) != 2: + warn(WSGIWarning("Headers must tuple 2-item tuples"), stacklevel=3) + name, value = item + if type(name) is not str or type(value) is not str: + warn(WSGIWarning("header items must be strings"), stacklevel=3) + if name.lower() == "status": + warn( + WSGIWarning( + "The status header is not supported due to " + "conflicts with the CGI spec." + ), + stacklevel=3, + ) + + if exc_info is not None and not isinstance(exc_info, tuple): + warn(WSGIWarning("invalid value for exc_info"), stacklevel=3) + + headers = Headers(headers) + self.check_headers(headers) + + return status_code, headers + + def check_headers(self, headers): + etag = headers.get("etag") + + if etag is not None: + if etag.startswith(("W/", "w/")): + if etag.startswith("w/"): + warn( + HTTPWarning("weak etag indicator should be upcase."), + stacklevel=4, + ) + + etag = etag[2:] + + if not (etag[:1] == etag[-1:] == '"'): + warn(HTTPWarning("unquoted etag emitted."), stacklevel=4) + + location = headers.get("location") + + if location is not None: + if not urlparse(location).netloc: + warn( + HTTPWarning("absolute URLs required for location header"), + stacklevel=4, + ) + + def check_iterator(self, app_iter): + if isinstance(app_iter, string_types): + warn( + "The application returned astring. The response will send one character" + " at a time to the client, which will kill performance. Return a list" + " or iterable instead.", + WSGIWarning, + stacklevel=3, + ) + + def __call__(self, *args, **kwargs): + if len(args) != 2: + warn("A WSGI app takes two arguments.", WSGIWarning, stacklevel=2) + + if kwargs: + warn( + "A WSGI app does not take keyword arguments.", WSGIWarning, stacklevel=2 + ) + + environ, start_response = args + + self.check_environ(environ) + environ["wsgi.input"] = InputStream(environ["wsgi.input"]) + environ["wsgi.errors"] = ErrorStream(environ["wsgi.errors"]) + + # Hook our own file wrapper in so that applications will always + # iterate to the end and we can check the content length. + environ["wsgi.file_wrapper"] = FileWrapper + + headers_set = [] + chunks = [] + + def checking_start_response(*args, **kwargs): + if len(args) not in (2, 3): + warn( + "Invalid number of arguments: %s, expected 2 or 3." % len(args), + WSGIWarning, + stacklevel=2, + ) + + if kwargs: + warn("'start_response' does not take keyword arguments.", WSGIWarning) + + status, headers = args[:2] + + if len(args) == 3: + exc_info = args[2] + else: + exc_info = None + + headers_set[:] = self.check_start_response(status, headers, exc_info) + return GuardedWrite(start_response(status, headers, exc_info), chunks) + + app_iter = self.app(environ, checking_start_response) + self.check_iterator(app_iter) + return GuardedIterator(app_iter, headers_set, chunks) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py new file mode 100644 index 0000000..32a14d9 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/profiler.py @@ -0,0 +1,132 @@ +""" +Application Profiler +==================== + +This module provides a middleware that profiles each request with the +:mod:`cProfile` module. This can help identify bottlenecks in your code +that may be slowing down your application. + +.. autoclass:: ProfilerMiddleware + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from __future__ import print_function + +import os.path +import sys +import time +from pstats import Stats + +try: + from cProfile import Profile +except ImportError: + from profile import Profile + + +class ProfilerMiddleware(object): + """Wrap a WSGI application and profile the execution of each + request. Responses are buffered so that timings are more exact. + + If ``stream`` is given, :class:`pstats.Stats` are written to it + after each request. If ``profile_dir`` is given, :mod:`cProfile` + data files are saved to that directory, one file per request. + + The filename can be customized by passing ``filename_format``. If + it is a string, it will be formatted using :meth:`str.format` with + the following fields available: + + - ``{method}`` - The request method; GET, POST, etc. + - ``{path}`` - The request path or 'root' should one not exist. + - ``{elapsed}`` - The elapsed time of the request. + - ``{time}`` - The time of the request. + + If it is a callable, it will be called with the WSGI ``environ`` + dict and should return a filename. + + :param app: The WSGI application to wrap. + :param stream: Write stats to this stream. Disable with ``None``. + :param sort_by: A tuple of columns to sort stats by. See + :meth:`pstats.Stats.sort_stats`. + :param restrictions: A tuple of restrictions to filter stats by. See + :meth:`pstats.Stats.print_stats`. + :param profile_dir: Save profile data files to this directory. + :param filename_format: Format string for profile data file names, + or a callable returning a name. See explanation above. + + .. code-block:: python + + from werkzeug.middleware.profiler import ProfilerMiddleware + app = ProfilerMiddleware(app) + + .. versionchanged:: 0.15 + Stats are written even if ``profile_dir`` is given, and can be + disable by passing ``stream=None``. + + .. versionadded:: 0.15 + Added ``filename_format``. + + .. versionadded:: 0.9 + Added ``restrictions`` and ``profile_dir``. + """ + + def __init__( + self, + app, + stream=sys.stdout, + sort_by=("time", "calls"), + restrictions=(), + profile_dir=None, + filename_format="{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof", + ): + self._app = app + self._stream = stream + self._sort_by = sort_by + self._restrictions = restrictions + self._profile_dir = profile_dir + self._filename_format = filename_format + + def __call__(self, environ, start_response): + response_body = [] + + def catching_start_response(status, headers, exc_info=None): + start_response(status, headers, exc_info) + return response_body.append + + def runapp(): + app_iter = self._app(environ, catching_start_response) + response_body.extend(app_iter) + + if hasattr(app_iter, "close"): + app_iter.close() + + profile = Profile() + start = time.time() + profile.runcall(runapp) + body = b"".join(response_body) + elapsed = time.time() - start + + if self._profile_dir is not None: + if callable(self._filename_format): + filename = self._filename_format(environ) + else: + filename = self._filename_format.format( + method=environ["REQUEST_METHOD"], + path=( + environ.get("PATH_INFO").strip("/").replace("/", ".") or "root" + ), + elapsed=elapsed * 1000.0, + time=time.time(), + ) + filename = os.path.join(self._profile_dir, filename) + profile.dump_stats(filename) + + if self._stream is not None: + stats = Stats(profile, stream=self._stream) + stats.sort_stats(*self._sort_by) + print("-" * 80, file=self._stream) + print("PATH: {!r}".format(environ.get("PATH_INFO", "")), file=self._stream) + stats.print_stats(*self._restrictions) + print("-" * 80 + "\n", file=self._stream) + + return [body] diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py new file mode 100644 index 0000000..dc1dacc --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/proxy_fix.py @@ -0,0 +1,228 @@ +""" +X-Forwarded-For Proxy Fix +========================= + +This module provides a middleware that adjusts the WSGI environ based on +``X-Forwarded-`` headers that proxies in front of an application may +set. + +When an application is running behind a proxy server, WSGI may see the +request as coming from that server rather than the real client. Proxies +set various headers to track where the request actually came from. + +This middleware should only be applied if the application is actually +behind such a proxy, and should be configured with the number of proxies +that are chained in front of it. Not all proxies set all the headers. +Since incoming headers can be faked, you must set how many proxies are +setting each header so the middleware knows what to trust. + +.. autoclass:: ProxyFix + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import warnings + + +class ProxyFix(object): + """Adjust the WSGI environ based on ``X-Forwarded-`` that proxies in + front of the application may set. + + - ``X-Forwarded-For`` sets ``REMOTE_ADDR``. + - ``X-Forwarded-Proto`` sets ``wsgi.url_scheme``. + - ``X-Forwarded-Host`` sets ``HTTP_HOST``, ``SERVER_NAME``, and + ``SERVER_PORT``. + - ``X-Forwarded-Port`` sets ``HTTP_HOST`` and ``SERVER_PORT``. + - ``X-Forwarded-Prefix`` sets ``SCRIPT_NAME``. + + You must tell the middleware how many proxies set each header so it + knows what values to trust. It is a security issue to trust values + that came from the client rather than a proxy. + + The original values of the headers are stored in the WSGI + environ as ``werkzeug.proxy_fix.orig``, a dict. + + :param app: The WSGI application to wrap. + :param x_for: Number of values to trust for ``X-Forwarded-For``. + :param x_proto: Number of values to trust for ``X-Forwarded-Proto``. + :param x_host: Number of values to trust for ``X-Forwarded-Host``. + :param x_port: Number of values to trust for ``X-Forwarded-Port``. + :param x_prefix: Number of values to trust for + ``X-Forwarded-Prefix``. + :param num_proxies: Deprecated, use ``x_for`` instead. + + .. code-block:: python + + from werkzeug.middleware.proxy_fix import ProxyFix + # App is behind one proxy that sets the -For and -Host headers. + app = ProxyFix(app, x_for=1, x_host=1) + + .. versionchanged:: 0.15 + All headers support multiple values. The ``num_proxies`` + argument is deprecated. Each header is configured with a + separate number of trusted proxies. + + .. versionchanged:: 0.15 + Original WSGI environ values are stored in the + ``werkzeug.proxy_fix.orig`` dict. ``orig_remote_addr``, + ``orig_wsgi_url_scheme``, and ``orig_http_host`` are deprecated + and will be removed in 1.0. + + .. versionchanged:: 0.15 + Support ``X-Forwarded-Port`` and ``X-Forwarded-Prefix``. + + .. versionchanged:: 0.15 + ``X-Fowarded-Host`` and ``X-Forwarded-Port`` modify + ``SERVER_NAME`` and ``SERVER_PORT``. + """ + + def __init__( + self, app, num_proxies=None, x_for=1, x_proto=0, x_host=0, x_port=0, x_prefix=0 + ): + self.app = app + self.x_for = x_for + self.x_proto = x_proto + self.x_host = x_host + self.x_port = x_port + self.x_prefix = x_prefix + self.num_proxies = num_proxies + + @property + def num_proxies(self): + """The number of proxies setting ``X-Forwarded-For`` in front + of the application. + + .. deprecated:: 0.15 + A separate number of trusted proxies is configured for each + header. ``num_proxies`` maps to ``x_for``. This method will + be removed in 1.0. + + :internal: + """ + warnings.warn( + "'num_proxies' is deprecated as of version 0.15 and will be" + " removed in version 1.0. Use 'x_for' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.x_for + + @num_proxies.setter + def num_proxies(self, value): + if value is not None: + warnings.warn( + "'num_proxies' is deprecated as of version 0.15 and" + " will be removed in version 1.0. Use 'x_for' instead.", + DeprecationWarning, + stacklevel=2, + ) + self.x_for = value + + def get_remote_addr(self, forwarded_for): + """Get the real ``remote_addr`` by looking backwards ``x_for`` + number of values in the ``X-Forwarded-For`` header. + + :param forwarded_for: List of values parsed from the + ``X-Forwarded-For`` header. + :return: The real ``remote_addr``, or ``None`` if there were not + at least ``x_for`` values. + + .. deprecated:: 0.15 + This is handled internally for each header. This method will + be removed in 1.0. + + .. versionchanged:: 0.9 + Use ``num_proxies`` instead of always picking the first + value. + + .. versionadded:: 0.8 + """ + warnings.warn( + "'get_remote_addr' is deprecated as of version 0.15 and" + " will be removed in version 1.0. It is now handled" + " internally for each header.", + DeprecationWarning, + ) + return self._get_trusted_comma(self.x_for, ",".join(forwarded_for)) + + def _get_trusted_comma(self, trusted, value): + """Get the real value from a comma-separated header based on the + configured number of trusted proxies. + + :param trusted: Number of values to trust in the header. + :param value: Header value to parse. + :return: The real value, or ``None`` if there are fewer values + than the number of trusted proxies. + + .. versionadded:: 0.15 + """ + if not (trusted and value): + return + values = [x.strip() for x in value.split(",")] + if len(values) >= trusted: + return values[-trusted] + + def __call__(self, environ, start_response): + """Modify the WSGI environ based on the various ``Forwarded`` + headers before calling the wrapped application. Store the + original environ values in ``werkzeug.proxy_fix.orig_{key}``. + """ + environ_get = environ.get + orig_remote_addr = environ_get("REMOTE_ADDR") + orig_wsgi_url_scheme = environ_get("wsgi.url_scheme") + orig_http_host = environ_get("HTTP_HOST") + environ.update( + { + "werkzeug.proxy_fix.orig": { + "REMOTE_ADDR": orig_remote_addr, + "wsgi.url_scheme": orig_wsgi_url_scheme, + "HTTP_HOST": orig_http_host, + "SERVER_NAME": environ_get("SERVER_NAME"), + "SERVER_PORT": environ_get("SERVER_PORT"), + "SCRIPT_NAME": environ_get("SCRIPT_NAME"), + }, + # todo: remove deprecated keys + "werkzeug.proxy_fix.orig_remote_addr": orig_remote_addr, + "werkzeug.proxy_fix.orig_wsgi_url_scheme": orig_wsgi_url_scheme, + "werkzeug.proxy_fix.orig_http_host": orig_http_host, + } + ) + + x_for = self._get_trusted_comma(self.x_for, environ_get("HTTP_X_FORWARDED_FOR")) + if x_for: + environ["REMOTE_ADDR"] = x_for + + x_proto = self._get_trusted_comma( + self.x_proto, environ_get("HTTP_X_FORWARDED_PROTO") + ) + if x_proto: + environ["wsgi.url_scheme"] = x_proto + + x_host = self._get_trusted_comma( + self.x_host, environ_get("HTTP_X_FORWARDED_HOST") + ) + if x_host: + environ["HTTP_HOST"] = x_host + parts = x_host.split(":", 1) + environ["SERVER_NAME"] = parts[0] + if len(parts) == 2: + environ["SERVER_PORT"] = parts[1] + + x_port = self._get_trusted_comma( + self.x_port, environ_get("HTTP_X_FORWARDED_PORT") + ) + if x_port: + host = environ.get("HTTP_HOST") + if host: + parts = host.split(":", 1) + host = parts[0] if len(parts) == 2 else host + environ["HTTP_HOST"] = "%s:%s" % (host, x_port) + environ["SERVER_PORT"] = x_port + + x_prefix = self._get_trusted_comma( + self.x_prefix, environ_get("HTTP_X_FORWARDED_PREFIX") + ) + if x_prefix: + environ["SCRIPT_NAME"] = x_prefix + + return self.app(environ, start_response) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py new file mode 100644 index 0000000..a902281 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/middleware/shared_data.py @@ -0,0 +1,260 @@ +""" +Serve Shared Static Files +========================= + +.. autoclass:: SharedDataMiddleware + :members: is_allowed + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +import mimetypes +import os +import posixpath +from datetime import datetime +from io import BytesIO +from time import mktime +from time import time +from zlib import adler32 + +from .._compat import PY2 +from .._compat import string_types +from ..filesystem import get_filesystem_encoding +from ..http import http_date +from ..http import is_resource_modified +from ..wsgi import get_path_info +from ..wsgi import wrap_file + + +class SharedDataMiddleware(object): + + """A WSGI middleware that provides static content for development + environments or simple server setups. Usage is quite simple:: + + import os + from werkzeug.wsgi import SharedDataMiddleware + + app = SharedDataMiddleware(app, { + '/static': os.path.join(os.path.dirname(__file__), 'static') + }) + + The contents of the folder ``./shared`` will now be available on + ``http://example.com/shared/``. This is pretty useful during development + because a standalone media server is not required. One can also mount + files on the root folder and still continue to use the application because + the shared data middleware forwards all unhandled requests to the + application, even if the requests are below one of the shared folders. + + If `pkg_resources` is available you can also tell the middleware to serve + files from package data:: + + app = SharedDataMiddleware(app, { + '/static': ('myapplication', 'static') + }) + + This will then serve the ``static`` folder in the `myapplication` + Python package. + + The optional `disallow` parameter can be a list of :func:`~fnmatch.fnmatch` + rules for files that are not accessible from the web. If `cache` is set to + `False` no caching headers are sent. + + Currently the middleware does not support non ASCII filenames. If the + encoding on the file system happens to be the encoding of the URI it may + work but this could also be by accident. We strongly suggest using ASCII + only file names for static files. + + The middleware will guess the mimetype using the Python `mimetype` + module. If it's unable to figure out the charset it will fall back + to `fallback_mimetype`. + + .. versionchanged:: 0.5 + The cache timeout is configurable now. + + .. versionadded:: 0.6 + The `fallback_mimetype` parameter was added. + + :param app: the application to wrap. If you don't want to wrap an + application you can pass it :exc:`NotFound`. + :param exports: a list or dict of exported files and folders. + :param disallow: a list of :func:`~fnmatch.fnmatch` rules. + :param fallback_mimetype: the fallback mimetype for unknown files. + :param cache: enable or disable caching headers. + :param cache_timeout: the cache timeout in seconds for the headers. + """ + + def __init__( + self, + app, + exports, + disallow=None, + cache=True, + cache_timeout=60 * 60 * 12, + fallback_mimetype="text/plain", + ): + self.app = app + self.exports = [] + self.cache = cache + self.cache_timeout = cache_timeout + + if hasattr(exports, "items"): + exports = exports.items() + + for key, value in exports: + if isinstance(value, tuple): + loader = self.get_package_loader(*value) + elif isinstance(value, string_types): + if os.path.isfile(value): + loader = self.get_file_loader(value) + else: + loader = self.get_directory_loader(value) + else: + raise TypeError("unknown def %r" % value) + + self.exports.append((key, loader)) + + if disallow is not None: + from fnmatch import fnmatch + + self.is_allowed = lambda x: not fnmatch(x, disallow) + + self.fallback_mimetype = fallback_mimetype + + def is_allowed(self, filename): + """Subclasses can override this method to disallow the access to + certain files. However by providing `disallow` in the constructor + this method is overwritten. + """ + return True + + def _opener(self, filename): + return lambda: ( + open(filename, "rb"), + datetime.utcfromtimestamp(os.path.getmtime(filename)), + int(os.path.getsize(filename)), + ) + + def get_file_loader(self, filename): + return lambda x: (os.path.basename(filename), self._opener(filename)) + + def get_package_loader(self, package, package_path): + from pkg_resources import DefaultProvider, ResourceManager, get_provider + + loadtime = datetime.utcnow() + provider = get_provider(package) + manager = ResourceManager() + filesystem_bound = isinstance(provider, DefaultProvider) + + def loader(path): + if path is None: + return None, None + + path = posixpath.join(package_path, path) + + if not provider.has_resource(path): + return None, None + + basename = posixpath.basename(path) + + if filesystem_bound: + return ( + basename, + self._opener(provider.get_resource_filename(manager, path)), + ) + + s = provider.get_resource_string(manager, path) + return basename, lambda: (BytesIO(s), loadtime, len(s)) + + return loader + + def get_directory_loader(self, directory): + def loader(path): + if path is not None: + path = os.path.join(directory, path) + else: + path = directory + + if os.path.isfile(path): + return os.path.basename(path), self._opener(path) + + return None, None + + return loader + + def generate_etag(self, mtime, file_size, real_filename): + if not isinstance(real_filename, bytes): + real_filename = real_filename.encode(get_filesystem_encoding()) + + return "wzsdm-%d-%s-%s" % ( + mktime(mtime.timetuple()), + file_size, + adler32(real_filename) & 0xFFFFFFFF, + ) + + def __call__(self, environ, start_response): + cleaned_path = get_path_info(environ) + + if PY2: + cleaned_path = cleaned_path.encode(get_filesystem_encoding()) + + # sanitize the path for non unix systems + cleaned_path = cleaned_path.strip("/") + + for sep in os.sep, os.altsep: + if sep and sep != "/": + cleaned_path = cleaned_path.replace(sep, "/") + + path = "/" + "/".join(x for x in cleaned_path.split("/") if x and x != "..") + file_loader = None + + for search_path, loader in self.exports: + if search_path == path: + real_filename, file_loader = loader(None) + + if file_loader is not None: + break + + if not search_path.endswith("/"): + search_path += "/" + + if path.startswith(search_path): + real_filename, file_loader = loader(path[len(search_path) :]) + + if file_loader is not None: + break + + if file_loader is None or not self.is_allowed(real_filename): + return self.app(environ, start_response) + + guessed_type = mimetypes.guess_type(real_filename) + mime_type = guessed_type[0] or self.fallback_mimetype + f, mtime, file_size = file_loader() + + headers = [("Date", http_date())] + + if self.cache: + timeout = self.cache_timeout + etag = self.generate_etag(mtime, file_size, real_filename) + headers += [ + ("Etag", '"%s"' % etag), + ("Cache-Control", "max-age=%d, public" % timeout), + ] + + if not is_resource_modified(environ, etag, last_modified=mtime): + f.close() + start_response("304 Not Modified", headers) + return [] + + headers.append(("Expires", http_date(time() + timeout))) + else: + headers.append(("Cache-Control", "public")) + + headers.extend( + ( + ("Content-Type", mime_type), + ("Content-Length", str(file_size)), + ("Last-Modified", http_date(mtime)), + ) + ) + start_response("200 OK", headers) + return wrap_file(environ, f) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py b/backend/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py new file mode 100644 index 0000000..696b456 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/posixemulation.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +r""" + werkzeug.posixemulation + ~~~~~~~~~~~~~~~~~~~~~~~ + + Provides a POSIX emulation for some features that are relevant to + web applications. The main purpose is to simplify support for + systems such as Windows NT that are not 100% POSIX compatible. + + Currently this only implements a :func:`rename` function that + follows POSIX semantics. Eg: if the target file already exists it + will be replaced without asking. + + This module was introduced in 0.6.1 and is not a public interface. + It might become one in later versions of Werkzeug. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import errno +import os +import random +import sys +import time + +from ._compat import to_unicode +from .filesystem import get_filesystem_encoding + +can_rename_open_file = False + +if os.name == "nt": + try: + import ctypes + + _MOVEFILE_REPLACE_EXISTING = 0x1 + _MOVEFILE_WRITE_THROUGH = 0x8 + _MoveFileEx = ctypes.windll.kernel32.MoveFileExW + + def _rename(src, dst): + src = to_unicode(src, get_filesystem_encoding()) + dst = to_unicode(dst, get_filesystem_encoding()) + if _rename_atomic(src, dst): + return True + retry = 0 + rv = False + while not rv and retry < 100: + rv = _MoveFileEx( + src, dst, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH + ) + if not rv: + time.sleep(0.001) + retry += 1 + return rv + + # new in Vista and Windows Server 2008 + _CreateTransaction = ctypes.windll.ktmw32.CreateTransaction + _CommitTransaction = ctypes.windll.ktmw32.CommitTransaction + _MoveFileTransacted = ctypes.windll.kernel32.MoveFileTransactedW + _CloseHandle = ctypes.windll.kernel32.CloseHandle + can_rename_open_file = True + + def _rename_atomic(src, dst): + ta = _CreateTransaction(None, 0, 0, 0, 0, 1000, "Werkzeug rename") + if ta == -1: + return False + try: + retry = 0 + rv = False + while not rv and retry < 100: + rv = _MoveFileTransacted( + src, + dst, + None, + None, + _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH, + ta, + ) + if rv: + rv = _CommitTransaction(ta) + break + else: + time.sleep(0.001) + retry += 1 + return rv + finally: + _CloseHandle(ta) + + except Exception: + + def _rename(src, dst): + return False + + def _rename_atomic(src, dst): + return False + + def rename(src, dst): + # Try atomic or pseudo-atomic rename + if _rename(src, dst): + return + # Fall back to "move away and replace" + try: + os.rename(src, dst) + except OSError as e: + if e.errno != errno.EEXIST: + raise + old = "%s-%08x" % (dst, random.randint(0, sys.maxsize)) + os.rename(dst, old) + os.rename(src, dst) + try: + os.unlink(old) + except Exception: + pass + + +else: + rename = os.rename + can_rename_open_file = True diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/routing.py b/backend/venv/lib/python3.7/site-packages/werkzeug/routing.py new file mode 100644 index 0000000..6b1dd98 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/routing.py @@ -0,0 +1,2026 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.routing + ~~~~~~~~~~~~~~~~ + + When it comes to combining multiple controller or view functions (however + you want to call them) you need a dispatcher. A simple way would be + applying regular expression tests on the ``PATH_INFO`` and calling + registered callback functions that return the value then. + + This module implements a much more powerful system than simple regular + expression matching because it can also convert values in the URLs and + build URLs. + + Here a simple example that creates an URL map for an application with + two subdomains (www and kb) and some URL rules: + + >>> m = Map([ + ... # Static URLs + ... Rule('/', endpoint='static/index'), + ... Rule('/about', endpoint='static/about'), + ... Rule('/help', endpoint='static/help'), + ... # Knowledge Base + ... Subdomain('kb', [ + ... Rule('/', endpoint='kb/index'), + ... Rule('/browse/', endpoint='kb/browse'), + ... Rule('/browse//', endpoint='kb/browse'), + ... Rule('/browse//', endpoint='kb/browse') + ... ]) + ... ], default_subdomain='www') + + If the application doesn't use subdomains it's perfectly fine to not set + the default subdomain and not use the `Subdomain` rule factory. The endpoint + in the rules can be anything, for example import paths or unique + identifiers. The WSGI application can use those endpoints to get the + handler for that URL. It doesn't have to be a string at all but it's + recommended. + + Now it's possible to create a URL adapter for one of the subdomains and + build URLs: + + >>> c = m.bind('example.com') + >>> c.build("kb/browse", dict(id=42)) + 'http://kb.example.com/browse/42/' + >>> c.build("kb/browse", dict()) + 'http://kb.example.com/browse/' + >>> c.build("kb/browse", dict(id=42, page=3)) + 'http://kb.example.com/browse/42/3' + >>> c.build("static/about") + '/about' + >>> c.build("static/index", force_external=True) + 'http://www.example.com/' + + >>> c = m.bind('example.com', subdomain='kb') + >>> c.build("static/about") + 'http://www.example.com/about' + + The first argument to bind is the server name *without* the subdomain. + Per default it will assume that the script is mounted on the root, but + often that's not the case so you can provide the real mount point as + second argument: + + >>> c = m.bind('example.com', '/applications/example') + + The third argument can be the subdomain, if not given the default + subdomain is used. For more details about binding have a look at the + documentation of the `MapAdapter`. + + And here is how you can match URLs: + + >>> c = m.bind('example.com') + >>> c.match("/") + ('static/index', {}) + >>> c.match("/about") + ('static/about', {}) + >>> c = m.bind('example.com', '/', 'kb') + >>> c.match("/") + ('kb/index', {}) + >>> c.match("/browse/42/23") + ('kb/browse', {'id': 42, 'page': 23}) + + If matching fails you get a `NotFound` exception, if the rule thinks + it's a good idea to redirect (for example because the URL was defined + to have a slash at the end but the request was missing that slash) it + will raise a `RequestRedirect` exception. Both are subclasses of the + `HTTPException` so you can use those errors as responses in the + application. + + If matching succeeded but the URL rule was incompatible to the given + method (for example there were only rules for `GET` and `HEAD` and + routing system tried to match a `POST` request) a `MethodNotAllowed` + exception is raised. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import ast +import difflib +import posixpath +import re +import uuid +from pprint import pformat +from threading import Lock + +from ._compat import implements_to_string +from ._compat import iteritems +from ._compat import itervalues +from ._compat import native_string_result +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import wsgi_decoding_dance +from ._internal import _encode_idna +from ._internal import _get_environ +from .datastructures import ImmutableDict +from .datastructures import MultiDict +from .exceptions import BadHost +from .exceptions import HTTPException +from .exceptions import MethodNotAllowed +from .exceptions import NotFound +from .urls import _fast_url_quote +from .urls import url_encode +from .urls import url_join +from .urls import url_quote +from .utils import cached_property +from .utils import format_string +from .utils import redirect +from .wsgi import get_host + +_rule_re = re.compile( + r""" + (?P[^<]*) # static rule data + < + (?: + (?P[a-zA-Z_][a-zA-Z0-9_]*) # converter name + (?:\((?P.*?)\))? # converter arguments + \: # variable delimiter + )? + (?P[a-zA-Z_][a-zA-Z0-9_]*) # variable name + > + """, + re.VERBOSE, +) +_simple_rule_re = re.compile(r"<([^>]+)>") +_converter_args_re = re.compile( + r""" + ((?P\w+)\s*=\s*)? + (?P + True|False| + \d+.\d+| + \d+.| + \d+| + [\w\d_.]+| + [urUR]?(?P"[^"]*?"|'[^']*') + )\s*, + """, + re.VERBOSE | re.UNICODE, +) + + +_PYTHON_CONSTANTS = {"None": None, "True": True, "False": False} + + +def _pythonize(value): + if value in _PYTHON_CONSTANTS: + return _PYTHON_CONSTANTS[value] + for convert in int, float: + try: + return convert(value) + except ValueError: + pass + if value[:1] == value[-1:] and value[0] in "\"'": + value = value[1:-1] + return text_type(value) + + +def parse_converter_args(argstr): + argstr += "," + args = [] + kwargs = {} + + for item in _converter_args_re.finditer(argstr): + value = item.group("stringval") + if value is None: + value = item.group("value") + value = _pythonize(value) + if not item.group("name"): + args.append(value) + else: + name = item.group("name") + kwargs[name] = value + + return tuple(args), kwargs + + +def parse_rule(rule): + """Parse a rule and return it as generator. Each iteration yields tuples + in the form ``(converter, arguments, variable)``. If the converter is + `None` it's a static url part, otherwise it's a dynamic one. + + :internal: + """ + pos = 0 + end = len(rule) + do_match = _rule_re.match + used_names = set() + while pos < end: + m = do_match(rule, pos) + if m is None: + break + data = m.groupdict() + if data["static"]: + yield None, None, data["static"] + variable = data["variable"] + converter = data["converter"] or "default" + if variable in used_names: + raise ValueError("variable name %r used twice." % variable) + used_names.add(variable) + yield converter, data["args"] or None, variable + pos = m.end() + if pos < end: + remaining = rule[pos:] + if ">" in remaining or "<" in remaining: + raise ValueError("malformed url rule: %r" % rule) + yield None, None, remaining + + +class RoutingException(Exception): + """Special exceptions that require the application to redirect, notifying + about missing urls, etc. + + :internal: + """ + + +class RequestRedirect(HTTPException, RoutingException): + """Raise if the map requests a redirect. This is for example the case if + `strict_slashes` are activated and an url that requires a trailing slash. + + The attribute `new_url` contains the absolute destination url. + """ + + code = 308 + + def __init__(self, new_url): + RoutingException.__init__(self, new_url) + self.new_url = new_url + + def get_response(self, environ): + return redirect(self.new_url, self.code) + + +class RequestSlash(RoutingException): + """Internal exception.""" + + +class RequestAliasRedirect(RoutingException): # noqa: B903 + """This rule is an alias and wants to redirect to the canonical URL.""" + + def __init__(self, matched_values): + self.matched_values = matched_values + + +@implements_to_string +class BuildError(RoutingException, LookupError): + """Raised if the build system cannot find a URL for an endpoint with the + values provided. + """ + + def __init__(self, endpoint, values, method, adapter=None): + LookupError.__init__(self, endpoint, values, method) + self.endpoint = endpoint + self.values = values + self.method = method + self.adapter = adapter + + @cached_property + def suggested(self): + return self.closest_rule(self.adapter) + + def closest_rule(self, adapter): + def _score_rule(rule): + return sum( + [ + 0.98 + * difflib.SequenceMatcher( + None, rule.endpoint, self.endpoint + ).ratio(), + 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), + 0.01 * bool(rule.methods and self.method in rule.methods), + ] + ) + + if adapter and adapter.map._rules: + return max(adapter.map._rules, key=_score_rule) + + def __str__(self): + message = [] + message.append("Could not build url for endpoint %r" % self.endpoint) + if self.method: + message.append(" (%r)" % self.method) + if self.values: + message.append(" with values %r" % sorted(self.values.keys())) + message.append(".") + if self.suggested: + if self.endpoint == self.suggested.endpoint: + if self.method and self.method not in self.suggested.methods: + message.append( + " Did you mean to use methods %r?" + % sorted(self.suggested.methods) + ) + missing_values = self.suggested.arguments.union( + set(self.suggested.defaults or ()) + ) - set(self.values.keys()) + if missing_values: + message.append( + " Did you forget to specify values %r?" % sorted(missing_values) + ) + else: + message.append(" Did you mean %r instead?" % self.suggested.endpoint) + return u"".join(message) + + +class ValidationError(ValueError): + """Validation error. If a rule converter raises this exception the rule + does not match the current URL and the next URL is tried. + """ + + +class RuleFactory(object): + """As soon as you have more complex URL setups it's a good idea to use rule + factories to avoid repetitive tasks. Some of them are builtin, others can + be added by subclassing `RuleFactory` and overriding `get_rules`. + """ + + def get_rules(self, map): + """Subclasses of `RuleFactory` have to override this method and return + an iterable of rules.""" + raise NotImplementedError() + + +class Subdomain(RuleFactory): + """All URLs provided by this factory have the subdomain set to a + specific domain. For example if you want to use the subdomain for + the current language this can be a good setup:: + + url_map = Map([ + Rule('/', endpoint='#select_language'), + Subdomain('', [ + Rule('/', endpoint='index'), + Rule('/about', endpoint='about'), + Rule('/help', endpoint='help') + ]) + ]) + + All the rules except for the ``'#select_language'`` endpoint will now + listen on a two letter long subdomain that holds the language code + for the current request. + """ + + def __init__(self, subdomain, rules): + self.subdomain = subdomain + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.subdomain = self.subdomain + yield rule + + +class Submount(RuleFactory): + """Like `Subdomain` but prefixes the URL rule with a given string:: + + url_map = Map([ + Rule('/', endpoint='index'), + Submount('/blog', [ + Rule('/', endpoint='blog/index'), + Rule('/entry/', endpoint='blog/show') + ]) + ]) + + Now the rule ``'blog/show'`` matches ``/blog/entry/``. + """ + + def __init__(self, path, rules): + self.path = path.rstrip("/") + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.rule = self.path + rule.rule + yield rule + + +class EndpointPrefix(RuleFactory): + """Prefixes all endpoints (which must be strings for this factory) with + another string. This can be useful for sub applications:: + + url_map = Map([ + Rule('/', endpoint='index'), + EndpointPrefix('blog/', [Submount('/blog', [ + Rule('/', endpoint='index'), + Rule('/entry/', endpoint='show') + ])]) + ]) + """ + + def __init__(self, prefix, rules): + self.prefix = prefix + self.rules = rules + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + rule = rule.empty() + rule.endpoint = self.prefix + rule.endpoint + yield rule + + +class RuleTemplate(object): + """Returns copies of the rules wrapped and expands string templates in + the endpoint, rule, defaults or subdomain sections. + + Here a small example for such a rule template:: + + from werkzeug.routing import Map, Rule, RuleTemplate + + resource = RuleTemplate([ + Rule('/$name/', endpoint='$name.list'), + Rule('/$name/', endpoint='$name.show') + ]) + + url_map = Map([resource(name='user'), resource(name='page')]) + + When a rule template is called the keyword arguments are used to + replace the placeholders in all the string parameters. + """ + + def __init__(self, rules): + self.rules = list(rules) + + def __call__(self, *args, **kwargs): + return RuleTemplateFactory(self.rules, dict(*args, **kwargs)) + + +class RuleTemplateFactory(RuleFactory): + """A factory that fills in template variables into rules. Used by + `RuleTemplate` internally. + + :internal: + """ + + def __init__(self, rules, context): + self.rules = rules + self.context = context + + def get_rules(self, map): + for rulefactory in self.rules: + for rule in rulefactory.get_rules(map): + new_defaults = subdomain = None + if rule.defaults: + new_defaults = {} + for key, value in iteritems(rule.defaults): + if isinstance(value, string_types): + value = format_string(value, self.context) + new_defaults[key] = value + if rule.subdomain is not None: + subdomain = format_string(rule.subdomain, self.context) + new_endpoint = rule.endpoint + if isinstance(new_endpoint, string_types): + new_endpoint = format_string(new_endpoint, self.context) + yield Rule( + format_string(rule.rule, self.context), + new_defaults, + subdomain, + rule.methods, + rule.build_only, + new_endpoint, + rule.strict_slashes, + ) + + +def _prefix_names(src): + """ast parse and prefix names with `.` to avoid collision with user vars""" + tree = ast.parse(src).body[0] + if isinstance(tree, ast.Expr): + tree = tree.value + for node in ast.walk(tree): + if isinstance(node, ast.Name): + node.id = "." + node.id + return tree + + +_CALL_CONVERTER_CODE_FMT = "self._converters[{elem!r}].to_url()" +_IF_KWARGS_URL_ENCODE_CODE = """\ +if kwargs: + q = '?' + params = self._encode_query_vars(kwargs) +else: + q = params = '' +""" +_IF_KWARGS_URL_ENCODE_AST = _prefix_names(_IF_KWARGS_URL_ENCODE_CODE) +_URL_ENCODE_AST_NAMES = (_prefix_names("q"), _prefix_names("params")) + + +@implements_to_string +class Rule(RuleFactory): + """A Rule represents one URL pattern. There are some options for `Rule` + that change the way it behaves and are passed to the `Rule` constructor. + Note that besides the rule-string all arguments *must* be keyword arguments + in order to not break the application on Werkzeug upgrades. + + `string` + Rule strings basically are just normal URL paths with placeholders in + the format ```` where the converter and the + arguments are optional. If no converter is defined the `default` + converter is used which means `string` in the normal configuration. + + URL rules that end with a slash are branch URLs, others are leaves. + If you have `strict_slashes` enabled (which is the default), all + branch URLs that are matched without a trailing slash will trigger a + redirect to the same URL with the missing slash appended. + + The converters are defined on the `Map`. + + `endpoint` + The endpoint for this rule. This can be anything. A reference to a + function, a string, a number etc. The preferred way is using a string + because the endpoint is used for URL generation. + + `defaults` + An optional dict with defaults for other rules with the same endpoint. + This is a bit tricky but useful if you want to have unique URLs:: + + url_map = Map([ + Rule('/all/', defaults={'page': 1}, endpoint='all_entries'), + Rule('/all/page/', endpoint='all_entries') + ]) + + If a user now visits ``http://example.com/all/page/1`` he will be + redirected to ``http://example.com/all/``. If `redirect_defaults` is + disabled on the `Map` instance this will only affect the URL + generation. + + `subdomain` + The subdomain rule string for this rule. If not specified the rule + only matches for the `default_subdomain` of the map. If the map is + not bound to a subdomain this feature is disabled. + + Can be useful if you want to have user profiles on different subdomains + and all subdomains are forwarded to your application:: + + url_map = Map([ + Rule('/', subdomain='', endpoint='user/homepage'), + Rule('/stats', subdomain='', endpoint='user/stats') + ]) + + `methods` + A sequence of http methods this rule applies to. If not specified, all + methods are allowed. For example this can be useful if you want different + endpoints for `POST` and `GET`. If methods are defined and the path + matches but the method matched against is not in this list or in the + list of another rule for that path the error raised is of the type + `MethodNotAllowed` rather than `NotFound`. If `GET` is present in the + list of methods and `HEAD` is not, `HEAD` is added automatically. + + .. versionchanged:: 0.6.1 + `HEAD` is now automatically added to the methods if `GET` is + present. The reason for this is that existing code often did not + work properly in servers not rewriting `HEAD` to `GET` + automatically and it was not documented how `HEAD` should be + treated. This was considered a bug in Werkzeug because of that. + + `strict_slashes` + Override the `Map` setting for `strict_slashes` only for this rule. If + not specified the `Map` setting is used. + + `build_only` + Set this to True and the rule will never match but will create a URL + that can be build. This is useful if you have resources on a subdomain + or folder that are not handled by the WSGI application (like static data) + + `redirect_to` + If given this must be either a string or callable. In case of a + callable it's called with the url adapter that triggered the match and + the values of the URL as keyword arguments and has to return the target + for the redirect, otherwise it has to be a string with placeholders in + rule syntax:: + + def foo_with_slug(adapter, id): + # ask the database for the slug for the old id. this of + # course has nothing to do with werkzeug. + return 'foo/' + Foo.get_slug_for_id(id) + + url_map = Map([ + Rule('/foo/', endpoint='foo'), + Rule('/some/old/url/', redirect_to='foo/'), + Rule('/other/old/url/', redirect_to=foo_with_slug) + ]) + + When the rule is matched the routing system will raise a + `RequestRedirect` exception with the target for the redirect. + + Keep in mind that the URL will be joined against the URL root of the + script so don't use a leading slash on the target URL unless you + really mean root of that domain. + + `alias` + If enabled this rule serves as an alias for another rule with the same + endpoint and arguments. + + `host` + If provided and the URL map has host matching enabled this can be + used to provide a match rule for the whole host. This also means + that the subdomain feature is disabled. + + .. versionadded:: 0.7 + The `alias` and `host` parameters were added. + """ + + def __init__( + self, + string, + defaults=None, + subdomain=None, + methods=None, + build_only=False, + endpoint=None, + strict_slashes=None, + redirect_to=None, + alias=False, + host=None, + ): + if not string.startswith("/"): + raise ValueError("urls must start with a leading slash") + self.rule = string + self.is_leaf = not string.endswith("/") + + self.map = None + self.strict_slashes = strict_slashes + self.subdomain = subdomain + self.host = host + self.defaults = defaults + self.build_only = build_only + self.alias = alias + if methods is None: + self.methods = None + else: + if isinstance(methods, str): + raise TypeError("param `methods` should be `Iterable[str]`, not `str`") + self.methods = set([x.upper() for x in methods]) + if "HEAD" not in self.methods and "GET" in self.methods: + self.methods.add("HEAD") + self.endpoint = endpoint + self.redirect_to = redirect_to + + if defaults: + self.arguments = set(map(str, defaults)) + else: + self.arguments = set() + self._trace = self._converters = self._regex = self._argument_weights = None + + def empty(self): + """ + Return an unbound copy of this rule. + + This can be useful if want to reuse an already bound URL for another + map. See ``get_empty_kwargs`` to override what keyword arguments are + provided to the new copy. + """ + return type(self)(self.rule, **self.get_empty_kwargs()) + + def get_empty_kwargs(self): + """ + Provides kwargs for instantiating empty copy with empty() + + Use this method to provide custom keyword arguments to the subclass of + ``Rule`` when calling ``some_rule.empty()``. Helpful when the subclass + has custom keyword arguments that are needed at instantiation. + + Must return a ``dict`` that will be provided as kwargs to the new + instance of ``Rule``, following the initial ``self.rule`` value which + is always provided as the first, required positional argument. + """ + defaults = None + if self.defaults: + defaults = dict(self.defaults) + return dict( + defaults=defaults, + subdomain=self.subdomain, + methods=self.methods, + build_only=self.build_only, + endpoint=self.endpoint, + strict_slashes=self.strict_slashes, + redirect_to=self.redirect_to, + alias=self.alias, + host=self.host, + ) + + def get_rules(self, map): + yield self + + def refresh(self): + """Rebinds and refreshes the URL. Call this if you modified the + rule in place. + + :internal: + """ + self.bind(self.map, rebind=True) + + def bind(self, map, rebind=False): + """Bind the url to a map and create a regular expression based on + the information from the rule itself and the defaults from the map. + + :internal: + """ + if self.map is not None and not rebind: + raise RuntimeError("url rule %r already bound to map %r" % (self, self.map)) + self.map = map + if self.strict_slashes is None: + self.strict_slashes = map.strict_slashes + if self.subdomain is None: + self.subdomain = map.default_subdomain + self.compile() + + def get_converter(self, variable_name, converter_name, args, kwargs): + """Looks up the converter for the given parameter. + + .. versionadded:: 0.9 + """ + if converter_name not in self.map.converters: + raise LookupError("the converter %r does not exist" % converter_name) + return self.map.converters[converter_name](self.map, *args, **kwargs) + + def _encode_query_vars(self, query_vars): + return url_encode( + query_vars, + charset=self.map.charset, + sort=self.map.sort_parameters, + key=self.map.sort_key, + ) + + def compile(self): + """Compiles the regular expression and stores it.""" + assert self.map is not None, "rule not bound" + + if self.map.host_matching: + domain_rule = self.host or "" + else: + domain_rule = self.subdomain or "" + + self._trace = [] + self._converters = {} + self._static_weights = [] + self._argument_weights = [] + regex_parts = [] + + def _build_regex(rule): + index = 0 + for converter, arguments, variable in parse_rule(rule): + if converter is None: + regex_parts.append(re.escape(variable)) + self._trace.append((False, variable)) + for part in variable.split("/"): + if part: + self._static_weights.append((index, -len(part))) + else: + if arguments: + c_args, c_kwargs = parse_converter_args(arguments) + else: + c_args = () + c_kwargs = {} + convobj = self.get_converter(variable, converter, c_args, c_kwargs) + regex_parts.append("(?P<%s>%s)" % (variable, convobj.regex)) + self._converters[variable] = convobj + self._trace.append((True, variable)) + self._argument_weights.append(convobj.weight) + self.arguments.add(str(variable)) + index = index + 1 + + _build_regex(domain_rule) + regex_parts.append("\\|") + self._trace.append((False, "|")) + _build_regex(self.rule if self.is_leaf else self.rule.rstrip("/")) + if not self.is_leaf: + self._trace.append((False, "/")) + + self._build = self._compile_builder(False).__get__(self, None) + self._build_unknown = self._compile_builder(True).__get__(self, None) + + if self.build_only: + return + regex = r"^%s%s$" % ( + u"".join(regex_parts), + (not self.is_leaf or not self.strict_slashes) + and "(?/?)" + or "", + ) + self._regex = re.compile(regex, re.UNICODE) + + def match(self, path, method=None): + """Check if the rule matches a given path. Path is a string in the + form ``"subdomain|/path"`` and is assembled by the map. If + the map is doing host matching the subdomain part will be the host + instead. + + If the rule matches a dict with the converted values is returned, + otherwise the return value is `None`. + + :internal: + """ + if not self.build_only: + m = self._regex.search(path) + if m is not None: + groups = m.groupdict() + # we have a folder like part of the url without a trailing + # slash and strict slashes enabled. raise an exception that + # tells the map to redirect to the same url but with a + # trailing slash + if ( + self.strict_slashes + and not self.is_leaf + and not groups.pop("__suffix__") + and ( + method is None or self.methods is None or method in self.methods + ) + ): + raise RequestSlash() + # if we are not in strict slashes mode we have to remove + # a __suffix__ + elif not self.strict_slashes: + del groups["__suffix__"] + + result = {} + for name, value in iteritems(groups): + try: + value = self._converters[name].to_python(value) + except ValidationError: + return + result[str(name)] = value + if self.defaults: + result.update(self.defaults) + + if self.alias and self.map.redirect_defaults: + raise RequestAliasRedirect(result) + + return result + + @staticmethod + def _get_func_code(code, name): + globs, locs = {}, {} + exec(code, globs, locs) + return locs[name] + + def _compile_builder(self, append_unknown=True): + defaults = self.defaults or {} + dom_ops = [] + url_ops = [] + + opl = dom_ops + for is_dynamic, data in self._trace: + if data == "|" and opl is dom_ops: + opl = url_ops + continue + # this seems like a silly case to ever come up but: + # if a default is given for a value that appears in the rule, + # resolve it to a constant ahead of time + if is_dynamic and data in defaults: + data = self._converters[data].to_url(defaults[data]) + opl.append((False, data)) + elif not is_dynamic: + opl.append( + (False, url_quote(to_bytes(data, self.map.charset), safe="/:|+")) + ) + else: + opl.append((True, data)) + + def _convert(elem): + ret = _prefix_names(_CALL_CONVERTER_CODE_FMT.format(elem=elem)) + ret.args = [ast.Name(str(elem), ast.Load())] # str for py2 + return ret + + def _parts(ops): + parts = [ + _convert(elem) if is_dynamic else ast.Str(s=elem) + for is_dynamic, elem in ops + ] + parts = parts or [ast.Str("")] + # constant fold + ret = [parts[0]] + for p in parts[1:]: + if isinstance(p, ast.Str) and isinstance(ret[-1], ast.Str): + ret[-1] = ast.Str(ret[-1].s + p.s) + else: + ret.append(p) + return ret + + dom_parts = _parts(dom_ops) + url_parts = _parts(url_ops) + if not append_unknown: + body = [] + else: + body = [_IF_KWARGS_URL_ENCODE_AST] + url_parts.extend(_URL_ENCODE_AST_NAMES) + + def _join(parts): + if len(parts) == 1: # shortcut + return parts[0] + elif hasattr(ast, "JoinedStr"): # py36+ + return ast.JoinedStr(parts) + else: + call = _prefix_names('"".join()') + call.args = [ast.Tuple(parts, ast.Load())] + return call + + body.append( + ast.Return(ast.Tuple([_join(dom_parts), _join(url_parts)], ast.Load())) + ) + + # str is necessary for python2 + pargs = [ + str(elem) + for is_dynamic, elem in dom_ops + url_ops + if is_dynamic and elem not in defaults + ] + kargs = [str(k) for k in defaults] + + func_ast = _prefix_names("def _(): pass") + func_ast.name = "".format(self.rule) + if hasattr(ast, "arg"): # py3 + func_ast.args.args.append(ast.arg(".self", None)) + for arg in pargs + kargs: + func_ast.args.args.append(ast.arg(arg, None)) + func_ast.args.kwarg = ast.arg(".kwargs", None) + else: + func_ast.args.args.append(ast.Name(".self", ast.Load())) + for arg in pargs + kargs: + func_ast.args.args.append(ast.Name(arg, ast.Load())) + func_ast.args.kwarg = ".kwargs" + for _ in kargs: + func_ast.args.defaults.append(ast.Str("")) + func_ast.body = body + + module = ast.fix_missing_locations(ast.Module([func_ast])) + code = compile(module, "", "exec") + return self._get_func_code(code, func_ast.name) + + def build(self, values, append_unknown=True): + """Assembles the relative url for that rule and the subdomain. + If building doesn't work for some reasons `None` is returned. + + :internal: + """ + try: + if append_unknown: + return self._build_unknown(**values) + else: + return self._build(**values) + except ValidationError: + return None + + def provides_defaults_for(self, rule): + """Check if this rule has defaults for a given rule. + + :internal: + """ + return ( + not self.build_only + and self.defaults + and self.endpoint == rule.endpoint + and self != rule + and self.arguments == rule.arguments + ) + + def suitable_for(self, values, method=None): + """Check if the dict of values has enough data for url generation. + + :internal: + """ + # if a method was given explicitly and that method is not supported + # by this rule, this rule is not suitable. + if ( + method is not None + and self.methods is not None + and method not in self.methods + ): + return False + + defaults = self.defaults or () + + # all arguments required must be either in the defaults dict or + # the value dictionary otherwise it's not suitable + for key in self.arguments: + if key not in defaults and key not in values: + return False + + # in case defaults are given we ensure that either the value was + # skipped or the value is the same as the default value. + if defaults: + for key, value in iteritems(defaults): + if key in values and value != values[key]: + return False + + return True + + def match_compare_key(self): + """The match compare key for sorting. + + Current implementation: + + 1. rules without any arguments come first for performance + reasons only as we expect them to match faster and some + common ones usually don't have any arguments (index pages etc.) + 2. rules with more static parts come first so the second argument + is the negative length of the number of the static weights. + 3. we order by static weights, which is a combination of index + and length + 4. The more complex rules come first so the next argument is the + negative length of the number of argument weights. + 5. lastly we order by the actual argument weights. + + :internal: + """ + return ( + bool(self.arguments), + -len(self._static_weights), + self._static_weights, + -len(self._argument_weights), + self._argument_weights, + ) + + def build_compare_key(self): + """The build compare key for sorting. + + :internal: + """ + return 1 if self.alias else 0, -len(self.arguments), -len(self.defaults or ()) + + def __eq__(self, other): + return self.__class__ is other.__class__ and self._trace == other._trace + + __hash__ = None + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return self.rule + + @native_string_result + def __repr__(self): + if self.map is None: + return u"<%s (unbound)>" % self.__class__.__name__ + tmp = [] + for is_dynamic, data in self._trace: + if is_dynamic: + tmp.append(u"<%s>" % data) + else: + tmp.append(data) + return u"<%s %s%s -> %s>" % ( + self.__class__.__name__, + repr((u"".join(tmp)).lstrip(u"|")).lstrip(u"u"), + self.methods is not None and u" (%s)" % u", ".join(self.methods) or u"", + self.endpoint, + ) + + +class BaseConverter(object): + """Base class for all converters.""" + + regex = "[^/]+" + weight = 100 + + def __init__(self, map): + self.map = map + + def to_python(self, value): + return value + + def to_url(self, value): + if isinstance(value, (bytes, bytearray)): + return _fast_url_quote(value) + return _fast_url_quote(text_type(value).encode(self.map.charset)) + + +class UnicodeConverter(BaseConverter): + """This converter is the default converter and accepts any string but + only one path segment. Thus the string can not include a slash. + + This is the default validator. + + Example:: + + Rule('/pages/'), + Rule('/') + + :param map: the :class:`Map`. + :param minlength: the minimum length of the string. Must be greater + or equal 1. + :param maxlength: the maximum length of the string. + :param length: the exact length of the string. + """ + + def __init__(self, map, minlength=1, maxlength=None, length=None): + BaseConverter.__init__(self, map) + if length is not None: + length = "{%d}" % int(length) + else: + if maxlength is None: + maxlength = "" + else: + maxlength = int(maxlength) + length = "{%s,%s}" % (int(minlength), maxlength) + self.regex = "[^/]" + length + + +class AnyConverter(BaseConverter): + """Matches one of the items provided. Items can either be Python + identifiers or strings:: + + Rule('/') + + :param map: the :class:`Map`. + :param items: this function accepts the possible items as positional + arguments. + """ + + def __init__(self, map, *items): + BaseConverter.__init__(self, map) + self.regex = "(?:%s)" % "|".join([re.escape(x) for x in items]) + + +class PathConverter(BaseConverter): + """Like the default :class:`UnicodeConverter`, but it also matches + slashes. This is useful for wikis and similar applications:: + + Rule('/') + Rule('//edit') + + :param map: the :class:`Map`. + """ + + regex = "[^/].*?" + weight = 200 + + +class NumberConverter(BaseConverter): + """Baseclass for `IntegerConverter` and `FloatConverter`. + + :internal: + """ + + weight = 50 + + def __init__(self, map, fixed_digits=0, min=None, max=None, signed=False): + if signed: + self.regex = self.signed_regex + BaseConverter.__init__(self, map) + self.fixed_digits = fixed_digits + self.min = min + self.max = max + self.signed = signed + + def to_python(self, value): + if self.fixed_digits and len(value) != self.fixed_digits: + raise ValidationError() + value = self.num_convert(value) + if (self.min is not None and value < self.min) or ( + self.max is not None and value > self.max + ): + raise ValidationError() + return value + + def to_url(self, value): + value = self.num_convert(value) + if self.fixed_digits: + value = ("%%0%sd" % self.fixed_digits) % value + return str(value) + + @property + def signed_regex(self): + return r"-?" + self.regex + + +class IntegerConverter(NumberConverter): + """This converter only accepts integer values:: + + Rule("/page/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/page/") + + :param map: The :class:`Map`. + :param fixed_digits: The number of fixed digits in the URL. If you + set this to ``4`` for example, the rule will only match if the + URL looks like ``/0001/``. The default is variable length. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+" + num_convert = int + + +class FloatConverter(NumberConverter): + """This converter only accepts floating point values:: + + Rule("/probability/") + + By default it only accepts unsigned, positive values. The ``signed`` + parameter will enable signed, negative values. :: + + Rule("/offset/") + + :param map: The :class:`Map`. + :param min: The minimal value. + :param max: The maximal value. + :param signed: Allow signed (negative) values. + + .. versionadded:: 0.15 + The ``signed`` parameter. + """ + + regex = r"\d+\.\d+" + num_convert = float + + def __init__(self, map, min=None, max=None, signed=False): + NumberConverter.__init__(self, map, min=min, max=max, signed=signed) + + +class UUIDConverter(BaseConverter): + """This converter only accepts UUID strings:: + + Rule('/object/') + + .. versionadded:: 0.10 + + :param map: the :class:`Map`. + """ + + regex = ( + r"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-" + r"[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + ) + + def to_python(self, value): + return uuid.UUID(value) + + def to_url(self, value): + return str(value) + + +#: the default converter mapping for the map. +DEFAULT_CONVERTERS = { + "default": UnicodeConverter, + "string": UnicodeConverter, + "any": AnyConverter, + "path": PathConverter, + "int": IntegerConverter, + "float": FloatConverter, + "uuid": UUIDConverter, +} + + +class Map(object): + """The map class stores all the URL rules and some configuration + parameters. Some of the configuration values are only stored on the + `Map` instance since those affect all rules, others are just defaults + and can be overridden for each rule. Note that you have to specify all + arguments besides the `rules` as keyword arguments! + + :param rules: sequence of url rules for this map. + :param default_subdomain: The default subdomain for rules without a + subdomain defined. + :param charset: charset of the url. defaults to ``"utf-8"`` + :param strict_slashes: Take care of trailing slashes. + :param redirect_defaults: This will redirect to the default rule if it + wasn't visited that way. This helps creating + unique URLs. + :param converters: A dict of converters that adds additional converters + to the list of converters. If you redefine one + converter this will override the original one. + :param sort_parameters: If set to `True` the url parameters are sorted. + See `url_encode` for more details. + :param sort_key: The sort key function for `url_encode`. + :param encoding_errors: the error method to use for decoding + :param host_matching: if set to `True` it enables the host matching + feature and disables the subdomain one. If + enabled the `host` parameter to rules is used + instead of the `subdomain` one. + + .. versionadded:: 0.5 + `sort_parameters` and `sort_key` was added. + + .. versionadded:: 0.7 + `encoding_errors` and `host_matching` was added. + """ + + #: A dict of default converters to be used. + default_converters = ImmutableDict(DEFAULT_CONVERTERS) + + def __init__( + self, + rules=None, + default_subdomain="", + charset="utf-8", + strict_slashes=True, + redirect_defaults=True, + converters=None, + sort_parameters=False, + sort_key=None, + encoding_errors="replace", + host_matching=False, + ): + self._rules = [] + self._rules_by_endpoint = {} + self._remap = True + self._remap_lock = Lock() + + self.default_subdomain = default_subdomain + self.charset = charset + self.encoding_errors = encoding_errors + self.strict_slashes = strict_slashes + self.redirect_defaults = redirect_defaults + self.host_matching = host_matching + + self.converters = self.default_converters.copy() + if converters: + self.converters.update(converters) + + self.sort_parameters = sort_parameters + self.sort_key = sort_key + + for rulefactory in rules or (): + self.add(rulefactory) + + def is_endpoint_expecting(self, endpoint, *arguments): + """Iterate over all rules and check if the endpoint expects + the arguments provided. This is for example useful if you have + some URLs that expect a language code and others that do not and + you want to wrap the builder a bit so that the current language + code is automatically added if not provided but endpoints expect + it. + + :param endpoint: the endpoint to check. + :param arguments: this function accepts one or more arguments + as positional arguments. Each one of them is + checked. + """ + self.update() + arguments = set(arguments) + for rule in self._rules_by_endpoint[endpoint]: + if arguments.issubset(rule.arguments): + return True + return False + + def iter_rules(self, endpoint=None): + """Iterate over all rules or the rules of an endpoint. + + :param endpoint: if provided only the rules for that endpoint + are returned. + :return: an iterator + """ + self.update() + if endpoint is not None: + return iter(self._rules_by_endpoint[endpoint]) + return iter(self._rules) + + def add(self, rulefactory): + """Add a new rule or factory to the map and bind it. Requires that the + rule is not bound to another map. + + :param rulefactory: a :class:`Rule` or :class:`RuleFactory` + """ + for rule in rulefactory.get_rules(self): + rule.bind(self) + self._rules.append(rule) + self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule) + self._remap = True + + def bind( + self, + server_name, + script_name=None, + subdomain=None, + url_scheme="http", + default_method="GET", + path_info=None, + query_args=None, + ): + """Return a new :class:`MapAdapter` with the details specified to the + call. Note that `script_name` will default to ``'/'`` if not further + specified or `None`. The `server_name` at least is a requirement + because the HTTP RFC requires absolute URLs for redirects and so all + redirect exceptions raised by Werkzeug will contain the full canonical + URL. + + If no path_info is passed to :meth:`match` it will use the default path + info passed to bind. While this doesn't really make sense for + manual bind calls, it's useful if you bind a map to a WSGI + environment which already contains the path info. + + `subdomain` will default to the `default_subdomain` for this map if + no defined. If there is no `default_subdomain` you cannot use the + subdomain feature. + + .. versionadded:: 0.7 + `query_args` added + + .. versionadded:: 0.8 + `query_args` can now also be a string. + + .. versionchanged:: 0.15 + ``path_info`` defaults to ``'/'`` if ``None``. + """ + server_name = server_name.lower() + if self.host_matching: + if subdomain is not None: + raise RuntimeError("host matching enabled and a subdomain was provided") + elif subdomain is None: + subdomain = self.default_subdomain + if script_name is None: + script_name = "/" + if path_info is None: + path_info = "/" + try: + server_name = _encode_idna(server_name) + except UnicodeError: + raise BadHost() + return MapAdapter( + self, + server_name, + script_name, + subdomain, + url_scheme, + path_info, + default_method, + query_args, + ) + + def bind_to_environ(self, environ, server_name=None, subdomain=None): + """Like :meth:`bind` but you can pass it an WSGI environment and it + will fetch the information from that dictionary. Note that because of + limitations in the protocol there is no way to get the current + subdomain and real `server_name` from the environment. If you don't + provide it, Werkzeug will use `SERVER_NAME` and `SERVER_PORT` (or + `HTTP_HOST` if provided) as used `server_name` with disabled subdomain + feature. + + If `subdomain` is `None` but an environment and a server name is + provided it will calculate the current subdomain automatically. + Example: `server_name` is ``'example.com'`` and the `SERVER_NAME` + in the wsgi `environ` is ``'staging.dev.example.com'`` the calculated + subdomain will be ``'staging.dev'``. + + If the object passed as environ has an environ attribute, the value of + this attribute is used instead. This allows you to pass request + objects. Additionally `PATH_INFO` added as a default of the + :class:`MapAdapter` so that you don't have to pass the path info to + the match method. + + .. versionchanged:: 0.5 + previously this method accepted a bogus `calculate_subdomain` + parameter that did not have any effect. It was removed because + of that. + + .. versionchanged:: 0.8 + This will no longer raise a ValueError when an unexpected server + name was passed. + + :param environ: a WSGI environment. + :param server_name: an optional server name hint (see above). + :param subdomain: optionally the current subdomain (see above). + """ + environ = _get_environ(environ) + + wsgi_server_name = get_host(environ).lower() + + if server_name is None: + server_name = wsgi_server_name + else: + server_name = server_name.lower() + + if subdomain is None and not self.host_matching: + cur_server_name = wsgi_server_name.split(".") + real_server_name = server_name.split(".") + offset = -len(real_server_name) + if cur_server_name[offset:] != real_server_name: + # This can happen even with valid configs if the server was + # accesssed directly by IP address under some situations. + # Instead of raising an exception like in Werkzeug 0.7 or + # earlier we go by an invalid subdomain which will result + # in a 404 error on matching. + subdomain = "" + else: + subdomain = ".".join(filter(None, cur_server_name[:offset])) + + def _get_wsgi_string(name): + val = environ.get(name) + if val is not None: + return wsgi_decoding_dance(val, self.charset) + + script_name = _get_wsgi_string("SCRIPT_NAME") + path_info = _get_wsgi_string("PATH_INFO") + query_args = _get_wsgi_string("QUERY_STRING") + return Map.bind( + self, + server_name, + script_name, + subdomain, + environ["wsgi.url_scheme"], + environ["REQUEST_METHOD"], + path_info, + query_args=query_args, + ) + + def update(self): + """Called before matching and building to keep the compiled rules + in the correct order after things changed. + """ + if not self._remap: + return + + with self._remap_lock: + if not self._remap: + return + + self._rules.sort(key=lambda x: x.match_compare_key()) + for rules in itervalues(self._rules_by_endpoint): + rules.sort(key=lambda x: x.build_compare_key()) + self._remap = False + + def __repr__(self): + rules = self.iter_rules() + return "%s(%s)" % (self.__class__.__name__, pformat(list(rules))) + + +class MapAdapter(object): + + """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does + the URL matching and building based on runtime information. + """ + + def __init__( + self, + map, + server_name, + script_name, + subdomain, + url_scheme, + path_info, + default_method, + query_args=None, + ): + self.map = map + self.server_name = to_unicode(server_name) + script_name = to_unicode(script_name) + if not script_name.endswith(u"/"): + script_name += u"/" + self.script_name = script_name + self.subdomain = to_unicode(subdomain) + self.url_scheme = to_unicode(url_scheme) + self.path_info = to_unicode(path_info) + self.default_method = to_unicode(default_method) + self.query_args = query_args + + def dispatch( + self, view_func, path_info=None, method=None, catch_http_exceptions=False + ): + """Does the complete dispatching process. `view_func` is called with + the endpoint and a dict with the values for the view. It should + look up the view function, call it, and return a response object + or WSGI application. http exceptions are not caught by default + so that applications can display nicer error messages by just + catching them by hand. If you want to stick with the default + error messages you can pass it ``catch_http_exceptions=True`` and + it will catch the http exceptions. + + Here a small example for the dispatch usage:: + + from werkzeug.wrappers import Request, Response + from werkzeug.wsgi import responder + from werkzeug.routing import Map, Rule + + def on_index(request): + return Response('Hello from the index') + + url_map = Map([Rule('/', endpoint='index')]) + views = {'index': on_index} + + @responder + def application(environ, start_response): + request = Request(environ) + urls = url_map.bind_to_environ(environ) + return urls.dispatch(lambda e, v: views[e](request, **v), + catch_http_exceptions=True) + + Keep in mind that this method might return exception objects, too, so + use :class:`Response.force_type` to get a response object. + + :param view_func: a function that is called with the endpoint as + first argument and the value dict as second. Has + to dispatch to the actual view function with this + information. (see above) + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param catch_http_exceptions: set to `True` to catch any of the + werkzeug :class:`HTTPException`\\s. + """ + try: + try: + endpoint, args = self.match(path_info, method) + except RequestRedirect as e: + return e + return view_func(endpoint, args) + except HTTPException as e: + if catch_http_exceptions: + return e + raise + + def match(self, path_info=None, method=None, return_rule=False, query_args=None): + """The usage is simple: you just pass the match method the current + path info as well as the method (which defaults to `GET`). The + following things can then happen: + + - you receive a `NotFound` exception that indicates that no URL is + matching. A `NotFound` exception is also a WSGI application you + can call to get a default page not found page (happens to be the + same object as `werkzeug.exceptions.NotFound`) + + - you receive a `MethodNotAllowed` exception that indicates that there + is a match for this URL but not for the current request method. + This is useful for RESTful applications. + + - you receive a `RequestRedirect` exception with a `new_url` + attribute. This exception is used to notify you about a request + Werkzeug requests from your WSGI application. This is for example the + case if you request ``/foo`` although the correct URL is ``/foo/`` + You can use the `RequestRedirect` instance as response-like object + similar to all other subclasses of `HTTPException`. + + - you get a tuple in the form ``(endpoint, arguments)`` if there is + a match (unless `return_rule` is True, in which case you get a tuple + in the form ``(rule, arguments)``) + + If the path info is not passed to the match method the default path + info of the map is used (defaults to the root URL if not defined + explicitly). + + All of the exceptions raised are subclasses of `HTTPException` so they + can be used as WSGI responses. They will all render generic error or + redirect pages. + + Here is a small example for matching: + + >>> m = Map([ + ... Rule('/', endpoint='index'), + ... Rule('/downloads/', endpoint='downloads/index'), + ... Rule('/downloads/', endpoint='downloads/show') + ... ]) + >>> urls = m.bind("example.com", "/") + >>> urls.match("/", "GET") + ('index', {}) + >>> urls.match("/downloads/42") + ('downloads/show', {'id': 42}) + + And here is what happens on redirect and missing URLs: + + >>> urls.match("/downloads") + Traceback (most recent call last): + ... + RequestRedirect: http://example.com/downloads/ + >>> urls.match("/missing") + Traceback (most recent call last): + ... + NotFound: 404 Not Found + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + :param return_rule: return the rule that matched instead of just the + endpoint (defaults to `False`). + :param query_args: optional query arguments that are used for + automatic redirects as string or dictionary. It's + currently not possible to use the query arguments + for URL matching. + + .. versionadded:: 0.6 + `return_rule` was added. + + .. versionadded:: 0.7 + `query_args` was added. + + .. versionchanged:: 0.8 + `query_args` can now also be a string. + """ + self.map.update() + if path_info is None: + path_info = self.path_info + else: + path_info = to_unicode(path_info, self.map.charset) + if query_args is None: + query_args = self.query_args + method = (method or self.default_method).upper() + + path = u"%s|%s" % ( + self.map.host_matching and self.server_name or self.subdomain, + path_info and "/%s" % path_info.lstrip("/"), + ) + + have_match_for = set() + for rule in self.map._rules: + try: + rv = rule.match(path, method) + except RequestSlash: + raise RequestRedirect( + self.make_redirect_url( + url_quote(path_info, self.map.charset, safe="/:|+") + "/", + query_args, + ) + ) + except RequestAliasRedirect as e: + raise RequestRedirect( + self.make_alias_redirect_url( + path, rule.endpoint, e.matched_values, method, query_args + ) + ) + if rv is None: + continue + if rule.methods is not None and method not in rule.methods: + have_match_for.update(rule.methods) + continue + + if self.map.redirect_defaults: + redirect_url = self.get_default_redirect(rule, method, rv, query_args) + if redirect_url is not None: + raise RequestRedirect(redirect_url) + + if rule.redirect_to is not None: + if isinstance(rule.redirect_to, string_types): + + def _handle_match(match): + value = rv[match.group(1)] + return rule._converters[match.group(1)].to_url(value) + + redirect_url = _simple_rule_re.sub(_handle_match, rule.redirect_to) + else: + redirect_url = rule.redirect_to(self, **rv) + raise RequestRedirect( + str( + url_join( + "%s://%s%s%s" + % ( + self.url_scheme or "http", + self.subdomain + "." if self.subdomain else "", + self.server_name, + self.script_name, + ), + redirect_url, + ) + ) + ) + + if return_rule: + return rule, rv + else: + return rule.endpoint, rv + + if have_match_for: + raise MethodNotAllowed(valid_methods=list(have_match_for)) + raise NotFound() + + def test(self, path_info=None, method=None): + """Test if a rule would match. Works like `match` but returns `True` + if the URL matches, or `False` if it does not exist. + + :param path_info: the path info to use for matching. Overrides the + path info specified on binding. + :param method: the HTTP method used for matching. Overrides the + method specified on binding. + """ + try: + self.match(path_info, method) + except RequestRedirect: + pass + except HTTPException: + return False + return True + + def allowed_methods(self, path_info=None): + """Returns the valid methods that match for a given path. + + .. versionadded:: 0.7 + """ + try: + self.match(path_info, method="--") + except MethodNotAllowed as e: + return e.valid_methods + except HTTPException: + pass + return [] + + def get_host(self, domain_part): + """Figures out the full host name for the given domain part. The + domain part is a subdomain in case host matching is disabled or + a full host name. + """ + if self.map.host_matching: + if domain_part is None: + return self.server_name + return to_unicode(domain_part, "ascii") + subdomain = domain_part + if subdomain is None: + subdomain = self.subdomain + else: + subdomain = to_unicode(subdomain, "ascii") + return (subdomain + u"." if subdomain else u"") + self.server_name + + def get_default_redirect(self, rule, method, values, query_args): + """A helper that returns the URL to redirect to if it finds one. + This is used for default redirecting only. + + :internal: + """ + assert self.map.redirect_defaults + for r in self.map._rules_by_endpoint[rule.endpoint]: + # every rule that comes after this one, including ourself + # has a lower priority for the defaults. We order the ones + # with the highest priority up for building. + if r is rule: + break + if r.provides_defaults_for(rule) and r.suitable_for(values, method): + values.update(r.defaults) + domain_part, path = r.build(values) + return self.make_redirect_url(path, query_args, domain_part=domain_part) + + def encode_query_args(self, query_args): + if not isinstance(query_args, string_types): + query_args = url_encode(query_args, self.map.charset) + return query_args + + def make_redirect_url(self, path_info, query_args=None, domain_part=None): + """Creates a redirect URL. + + :internal: + """ + suffix = "" + if query_args: + suffix = "?" + self.encode_query_args(query_args) + return str( + "%s://%s/%s%s" + % ( + self.url_scheme or "http", + self.get_host(domain_part), + posixpath.join( + self.script_name[:-1].lstrip("/"), path_info.lstrip("/") + ), + suffix, + ) + ) + + def make_alias_redirect_url(self, path, endpoint, values, method, query_args): + """Internally called to make an alias redirect URL.""" + url = self.build( + endpoint, values, method, append_unknown=False, force_external=True + ) + if query_args: + url += "?" + self.encode_query_args(query_args) + assert url != path, "detected invalid alias setting. No canonical URL found" + return url + + def _partial_build(self, endpoint, values, method, append_unknown): + """Helper for :meth:`build`. Returns subdomain and path for the + rule that accepts this endpoint, values and method. + + :internal: + """ + # in case the method is none, try with the default method first + if method is None: + rv = self._partial_build( + endpoint, values, self.default_method, append_unknown + ) + if rv is not None: + return rv + + # default method did not match or a specific method is passed, + # check all and go with first result. + for rule in self.map._rules_by_endpoint.get(endpoint, ()): + if rule.suitable_for(values, method): + rv = rule.build(values, append_unknown) + if rv is not None: + return rv + + def build( + self, + endpoint, + values=None, + method=None, + force_external=False, + append_unknown=True, + ): + """Building URLs works pretty much the other way round. Instead of + `match` you call `build` and pass it the endpoint and a dict of + arguments for the placeholders. + + The `build` function also accepts an argument called `force_external` + which, if you set it to `True` will force external URLs. Per default + external URLs (include the server name) will only be used if the + target URL is on a different subdomain. + + >>> m = Map([ + ... Rule('/', endpoint='index'), + ... Rule('/downloads/', endpoint='downloads/index'), + ... Rule('/downloads/', endpoint='downloads/show') + ... ]) + >>> urls = m.bind("example.com", "/") + >>> urls.build("index", {}) + '/' + >>> urls.build("downloads/show", {'id': 42}) + '/downloads/42' + >>> urls.build("downloads/show", {'id': 42}, force_external=True) + 'http://example.com/downloads/42' + + Because URLs cannot contain non ASCII data you will always get + bytestrings back. Non ASCII characters are urlencoded with the + charset defined on the map instance. + + Additional values are converted to unicode and appended to the URL as + URL querystring parameters: + + >>> urls.build("index", {'q': 'My Searchstring'}) + '/?q=My+Searchstring' + + When processing those additional values, lists are furthermore + interpreted as multiple values (as per + :py:class:`werkzeug.datastructures.MultiDict`): + + >>> urls.build("index", {'q': ['a', 'b', 'c']}) + '/?q=a&q=b&q=c' + + Passing a ``MultiDict`` will also add multiple values: + + >>> urls.build("index", MultiDict((('p', 'z'), ('q', 'a'), ('q', 'b')))) + '/?p=z&q=a&q=b' + + If a rule does not exist when building a `BuildError` exception is + raised. + + The build method accepts an argument called `method` which allows you + to specify the method you want to have an URL built for if you have + different methods for the same endpoint specified. + + .. versionadded:: 0.6 + the `append_unknown` parameter was added. + + :param endpoint: the endpoint of the URL to build. + :param values: the values for the URL to build. Unhandled values are + appended to the URL as query parameters. + :param method: the HTTP method for the rule if there are different + URLs for different methods on the same endpoint. + :param force_external: enforce full canonical external URLs. If the URL + scheme is not provided, this will generate + a protocol-relative URL. + :param append_unknown: unknown parameters are appended to the generated + URL as query string argument. Disable this + if you want the builder to ignore those. + """ + self.map.update() + + if values: + if isinstance(values, MultiDict): + temp_values = {} + # iteritems(dict, values) is like `values.lists()` + # without the call or `list()` coercion overhead. + for key, value in iteritems(dict, values): + if not value: + continue + if len(value) == 1: # flatten single item lists + value = value[0] + if value is None: # drop None + continue + temp_values[key] = value + values = temp_values + else: + # drop None + values = dict(i for i in iteritems(values) if i[1] is not None) + else: + values = {} + + rv = self._partial_build(endpoint, values, method, append_unknown) + if rv is None: + raise BuildError(endpoint, values, method, self) + domain_part, path = rv + + host = self.get_host(domain_part) + + # shortcut this. + if not force_external and ( + (self.map.host_matching and host == self.server_name) + or (not self.map.host_matching and domain_part == self.subdomain) + ): + return "%s/%s" % (self.script_name.rstrip("/"), path.lstrip("/")) + return str( + "%s//%s%s/%s" + % ( + self.url_scheme + ":" if self.url_scheme else "", + host, + self.script_name[:-1], + path.lstrip("/"), + ) + ) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/security.py b/backend/venv/lib/python3.7/site-packages/werkzeug/security.py new file mode 100644 index 0000000..1842afd --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/security.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.security + ~~~~~~~~~~~~~~~~~ + + Security related helpers such as secure password hashing tools. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import hashlib +import hmac +import os +import posixpath +from random import SystemRandom +from struct import Struct + +from ._compat import izip +from ._compat import PY2 +from ._compat import range_type +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_native + +SALT_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +DEFAULT_PBKDF2_ITERATIONS = 150000 + +_pack_int = Struct(">I").pack +_builtin_safe_str_cmp = getattr(hmac, "compare_digest", None) +_sys_rng = SystemRandom() +_os_alt_seps = list( + sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, "/") +) + + +def pbkdf2_hex( + data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None +): + """Like :func:`pbkdf2_bin`, but returns a hex-encoded string. + + .. versionadded:: 0.9 + + :param data: the data to derive. + :param salt: the salt for the derivation. + :param iterations: the number of iterations. + :param keylen: the length of the resulting key. If not provided, + the digest size will be used. + :param hashfunc: the hash function to use. This can either be the + string name of a known hash function, or a function + from the hashlib module. Defaults to sha256. + """ + rv = pbkdf2_bin(data, salt, iterations, keylen, hashfunc) + return to_native(codecs.encode(rv, "hex_codec")) + + +def pbkdf2_bin( + data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None +): + """Returns a binary digest for the PBKDF2 hash algorithm of `data` + with the given `salt`. It iterates `iterations` times and produces a + key of `keylen` bytes. By default, SHA-256 is used as hash function; + a different hashlib `hashfunc` can be provided. + + .. versionadded:: 0.9 + + :param data: the data to derive. + :param salt: the salt for the derivation. + :param iterations: the number of iterations. + :param keylen: the length of the resulting key. If not provided + the digest size will be used. + :param hashfunc: the hash function to use. This can either be the + string name of a known hash function or a function + from the hashlib module. Defaults to sha256. + """ + if not hashfunc: + hashfunc = "sha256" + + data = to_bytes(data) + salt = to_bytes(salt) + + if callable(hashfunc): + _test_hash = hashfunc() + hash_name = getattr(_test_hash, "name", None) + else: + hash_name = hashfunc + return hashlib.pbkdf2_hmac(hash_name, data, salt, iterations, keylen) + + +def safe_str_cmp(a, b): + """This function compares strings in somewhat constant time. This + requires that the length of at least one string is known in advance. + + Returns `True` if the two strings are equal, or `False` if they are not. + + .. versionadded:: 0.7 + """ + if isinstance(a, text_type): + a = a.encode("utf-8") + if isinstance(b, text_type): + b = b.encode("utf-8") + + if _builtin_safe_str_cmp is not None: + return _builtin_safe_str_cmp(a, b) + + if len(a) != len(b): + return False + + rv = 0 + if PY2: + for x, y in izip(a, b): + rv |= ord(x) ^ ord(y) + else: + for x, y in izip(a, b): + rv |= x ^ y + + return rv == 0 + + +def gen_salt(length): + """Generate a random string of SALT_CHARS with specified ``length``.""" + if length <= 0: + raise ValueError("Salt length must be positive") + return "".join(_sys_rng.choice(SALT_CHARS) for _ in range_type(length)) + + +def _hash_internal(method, salt, password): + """Internal password hash helper. Supports plaintext without salt, + unsalted and salted passwords. In case salted passwords are used + hmac is used. + """ + if method == "plain": + return password, method + + if isinstance(password, text_type): + password = password.encode("utf-8") + + if method.startswith("pbkdf2:"): + args = method[7:].split(":") + if len(args) not in (1, 2): + raise ValueError("Invalid number of arguments for PBKDF2") + method = args.pop(0) + iterations = args and int(args[0] or 0) or DEFAULT_PBKDF2_ITERATIONS + is_pbkdf2 = True + actual_method = "pbkdf2:%s:%d" % (method, iterations) + else: + is_pbkdf2 = False + actual_method = method + + if is_pbkdf2: + if not salt: + raise ValueError("Salt is required for PBKDF2") + rv = pbkdf2_hex(password, salt, iterations, hashfunc=method) + elif salt: + if isinstance(salt, text_type): + salt = salt.encode("utf-8") + mac = _create_mac(salt, password, method) + rv = mac.hexdigest() + else: + rv = hashlib.new(method, password).hexdigest() + return rv, actual_method + + +def _create_mac(key, msg, method): + if callable(method): + return hmac.HMAC(key, msg, method) + + def hashfunc(d=b""): + return hashlib.new(method, d) + + # Python 2.7 used ``hasattr(digestmod, '__call__')`` + # to detect if hashfunc is callable + hashfunc.__call__ = hashfunc + return hmac.HMAC(key, msg, hashfunc) + + +def generate_password_hash(password, method="pbkdf2:sha256", salt_length=8): + """Hash a password with the given method and salt with a string of + the given length. The format of the string returned includes the method + that was used so that :func:`check_password_hash` can check the hash. + + The format for the hashed string looks like this:: + + method$salt$hash + + This method can **not** generate unsalted passwords but it is possible + to set param method='plain' in order to enforce plaintext passwords. + If a salt is used, hmac is used internally to salt the password. + + If PBKDF2 is wanted it can be enabled by setting the method to + ``pbkdf2:method:iterations`` where iterations is optional:: + + pbkdf2:sha256:80000$salt$hash + pbkdf2:sha256$salt$hash + + :param password: the password to hash. + :param method: the hash method to use (one that hashlib supports). Can + optionally be in the format ``pbkdf2:[:iterations]`` + to enable PBKDF2. + :param salt_length: the length of the salt in letters. + """ + salt = gen_salt(salt_length) if method != "plain" else "" + h, actual_method = _hash_internal(method, salt, password) + return "%s$%s$%s" % (actual_method, salt, h) + + +def check_password_hash(pwhash, password): + """check a password against a given salted and hashed password value. + In order to support unsalted legacy passwords this method supports + plain text passwords, md5 and sha1 hashes (both salted and unsalted). + + Returns `True` if the password matched, `False` otherwise. + + :param pwhash: a hashed string like returned by + :func:`generate_password_hash`. + :param password: the plaintext password to compare against the hash. + """ + if pwhash.count("$") < 2: + return False + method, salt, hashval = pwhash.split("$", 2) + return safe_str_cmp(_hash_internal(method, salt, password)[0], hashval) + + +def safe_join(directory, *pathnames): + """Safely join `directory` and one or more untrusted `pathnames`. If this + cannot be done, this function returns ``None``. + + :param directory: the base directory. + :param pathnames: the untrusted pathnames relative to that directory. + """ + parts = [directory] + for filename in pathnames: + if filename != "": + filename = posixpath.normpath(filename) + for sep in _os_alt_seps: + if sep in filename: + return None + if os.path.isabs(filename) or filename == ".." or filename.startswith("../"): + return None + parts.append(filename) + return posixpath.join(*parts) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/serving.py b/backend/venv/lib/python3.7/site-packages/werkzeug/serving.py new file mode 100644 index 0000000..ff9f880 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/serving.py @@ -0,0 +1,1074 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.serving + ~~~~~~~~~~~~~~~~ + + There are many ways to serve a WSGI application. While you're developing + it you usually don't want a full blown webserver like Apache but a simple + standalone one. From Python 2.5 onwards there is the `wsgiref`_ server in + the standard library. If you're using older versions of Python you can + download the package from the cheeseshop. + + However there are some caveats. Sourcecode won't reload itself when + changed and each time you kill the server using ``^C`` you get an + `KeyboardInterrupt` error. While the latter is easy to solve the first + one can be a pain in the ass in some situations. + + The easiest way is creating a small ``start-myproject.py`` that runs the + application:: + + #!/usr/bin/env python + # -*- coding: utf-8 -*- + from myproject import make_app + from werkzeug.serving import run_simple + + app = make_app(...) + run_simple('localhost', 8080, app, use_reloader=True) + + You can also pass it a `extra_files` keyword argument with a list of + additional files (like configuration files) you want to observe. + + For bigger applications you should consider using `click` + (http://click.pocoo.org) instead of a simple start file. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import io +import os +import signal +import socket +import sys + +import werkzeug +from ._compat import PY2 +from ._compat import reraise +from ._compat import WIN +from ._compat import wsgi_encoding_dance +from ._internal import _log +from .exceptions import InternalServerError +from .urls import uri_to_iri +from .urls import url_parse +from .urls import url_unquote + +try: + import socketserver + from http.server import BaseHTTPRequestHandler + from http.server import HTTPServer +except ImportError: + import SocketServer as socketserver + from BaseHTTPServer import HTTPServer + from BaseHTTPServer import BaseHTTPRequestHandler + +try: + import ssl +except ImportError: + + class _SslDummy(object): + def __getattr__(self, name): + raise RuntimeError("SSL support unavailable") + + ssl = _SslDummy() + +try: + import termcolor +except ImportError: + termcolor = None + + +def _get_openssl_crypto_module(): + try: + from OpenSSL import crypto + except ImportError: + raise TypeError("Using ad-hoc certificates requires the pyOpenSSL library.") + else: + return crypto + + +ThreadingMixIn = socketserver.ThreadingMixIn +can_fork = hasattr(os, "fork") + +if can_fork: + ForkingMixIn = socketserver.ForkingMixIn +else: + + class ForkingMixIn(object): + pass + + +try: + af_unix = socket.AF_UNIX +except AttributeError: + af_unix = None + + +LISTEN_QUEUE = 128 +can_open_by_fd = not WIN and hasattr(socket, "fromfd") + +# On Python 3, ConnectionError represents the same errnos as +# socket.error from Python 2, while socket.error is an alias for the +# more generic OSError. +if PY2: + _ConnectionError = socket.error +else: + _ConnectionError = ConnectionError + + +class DechunkedInput(io.RawIOBase): + """An input stream that handles Transfer-Encoding 'chunked'""" + + def __init__(self, rfile): + self._rfile = rfile + self._done = False + self._len = 0 + + def readable(self): + return True + + def read_chunk_len(self): + try: + line = self._rfile.readline().decode("latin1") + _len = int(line.strip(), 16) + except ValueError: + raise IOError("Invalid chunk header") + if _len < 0: + raise IOError("Negative chunk length not allowed") + return _len + + def readinto(self, buf): + read = 0 + while not self._done and read < len(buf): + if self._len == 0: + # This is the first chunk or we fully consumed the previous + # one. Read the next length of the next chunk + self._len = self.read_chunk_len() + + if self._len == 0: + # Found the final chunk of size 0. The stream is now exhausted, + # but there is still a final newline that should be consumed + self._done = True + + if self._len > 0: + # There is data (left) in this chunk, so append it to the + # buffer. If this operation fully consumes the chunk, this will + # reset self._len to 0. + n = min(len(buf), self._len) + buf[read : read + n] = self._rfile.read(n) + self._len -= n + read += n + + if self._len == 0: + # Skip the terminating newline of a chunk that has been fully + # consumed. This also applies to the 0-sized final chunk + terminator = self._rfile.readline() + if terminator not in (b"\n", b"\r\n", b"\r"): + raise IOError("Missing chunk terminating newline") + + return read + + +class WSGIRequestHandler(BaseHTTPRequestHandler, object): + + """A request handler that implements WSGI dispatching.""" + + @property + def server_version(self): + return "Werkzeug/" + werkzeug.__version__ + + def make_environ(self): + request_url = url_parse(self.path) + + def shutdown_server(): + self.server.shutdown_signal = True + + url_scheme = "http" if self.server.ssl_context is None else "https" + if not self.client_address: + self.client_address = "" + if isinstance(self.client_address, str): + self.client_address = (self.client_address, 0) + else: + pass + path_info = url_unquote(request_url.path) + + environ = { + "wsgi.version": (1, 0), + "wsgi.url_scheme": url_scheme, + "wsgi.input": self.rfile, + "wsgi.errors": sys.stderr, + "wsgi.multithread": self.server.multithread, + "wsgi.multiprocess": self.server.multiprocess, + "wsgi.run_once": False, + "werkzeug.server.shutdown": shutdown_server, + "SERVER_SOFTWARE": self.server_version, + "REQUEST_METHOD": self.command, + "SCRIPT_NAME": "", + "PATH_INFO": wsgi_encoding_dance(path_info), + "QUERY_STRING": wsgi_encoding_dance(request_url.query), + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": wsgi_encoding_dance(self.path), + # Non-standard, added by gunicorn + "RAW_URI": wsgi_encoding_dance(self.path), + "REMOTE_ADDR": self.address_string(), + "REMOTE_PORT": self.port_integer(), + "SERVER_NAME": self.server.server_address[0], + "SERVER_PORT": str(self.server.server_address[1]), + "SERVER_PROTOCOL": self.request_version, + } + + for key, value in self.get_header_items(): + key = key.upper().replace("-", "_") + value = value.replace("\r\n", "") + if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): + key = "HTTP_" + key + if key in environ: + value = "{},{}".format(environ[key], value) + environ[key] = value + + if environ.get("HTTP_TRANSFER_ENCODING", "").strip().lower() == "chunked": + environ["wsgi.input_terminated"] = True + environ["wsgi.input"] = DechunkedInput(environ["wsgi.input"]) + + if request_url.scheme and request_url.netloc: + environ["HTTP_HOST"] = request_url.netloc + + return environ + + def run_wsgi(self): + if self.headers.get("Expect", "").lower().strip() == "100-continue": + self.wfile.write(b"HTTP/1.1 100 Continue\r\n\r\n") + + self.environ = environ = self.make_environ() + headers_set = [] + headers_sent = [] + + def write(data): + assert headers_set, "write() before start_response" + if not headers_sent: + status, response_headers = headers_sent[:] = headers_set + try: + code, msg = status.split(None, 1) + except ValueError: + code, msg = status, "" + code = int(code) + self.send_response(code, msg) + header_keys = set() + for key, value in response_headers: + self.send_header(key, value) + key = key.lower() + header_keys.add(key) + if not ( + "content-length" in header_keys + or environ["REQUEST_METHOD"] == "HEAD" + or code < 200 + or code in (204, 304) + ): + self.close_connection = True + self.send_header("Connection", "close") + if "server" not in header_keys: + self.send_header("Server", self.version_string()) + if "date" not in header_keys: + self.send_header("Date", self.date_time_string()) + self.end_headers() + + assert isinstance(data, bytes), "applications must write bytes" + self.wfile.write(data) + self.wfile.flush() + + def start_response(status, response_headers, exc_info=None): + if exc_info: + try: + if headers_sent: + reraise(*exc_info) + finally: + exc_info = None + elif headers_set: + raise AssertionError("Headers already set") + headers_set[:] = [status, response_headers] + return write + + def execute(app): + application_iter = app(environ, start_response) + try: + for data in application_iter: + write(data) + if not headers_sent: + write(b"") + finally: + if hasattr(application_iter, "close"): + application_iter.close() + application_iter = None + + try: + execute(self.server.app) + except (_ConnectionError, socket.timeout) as e: + self.connection_dropped(e, environ) + except Exception: + if self.server.passthrough_errors: + raise + from .debug.tbtools import get_current_traceback + + traceback = get_current_traceback(ignore_system_exceptions=True) + try: + # if we haven't yet sent the headers but they are set + # we roll back to be able to set them again. + if not headers_sent: + del headers_set[:] + execute(InternalServerError()) + except Exception: + pass + self.server.log("error", "Error on request:\n%s", traceback.plaintext) + + def handle(self): + """Handles a request ignoring dropped connections.""" + rv = None + try: + rv = BaseHTTPRequestHandler.handle(self) + except (_ConnectionError, socket.timeout) as e: + self.connection_dropped(e) + except Exception as e: + if self.server.ssl_context is None or not is_ssl_error(e): + raise + if self.server.shutdown_signal: + self.initiate_shutdown() + return rv + + def initiate_shutdown(self): + """A horrible, horrible way to kill the server for Python 2.6 and + later. It's the best we can do. + """ + # Windows does not provide SIGKILL, go with SIGTERM then. + sig = getattr(signal, "SIGKILL", signal.SIGTERM) + # reloader active + if is_running_from_reloader(): + os.kill(os.getpid(), sig) + # python 2.7 + self.server._BaseServer__shutdown_request = True + # python 2.6 + self.server._BaseServer__serving = False + + def connection_dropped(self, error, environ=None): + """Called if the connection was closed by the client. By default + nothing happens. + """ + + def handle_one_request(self): + """Handle a single HTTP request.""" + self.raw_requestline = self.rfile.readline() + if not self.raw_requestline: + self.close_connection = 1 + elif self.parse_request(): + return self.run_wsgi() + + def send_response(self, code, message=None): + """Send the response header and log the response code.""" + self.log_request(code) + if message is None: + message = code in self.responses and self.responses[code][0] or "" + if self.request_version != "HTTP/0.9": + hdr = "%s %d %s\r\n" % (self.protocol_version, code, message) + self.wfile.write(hdr.encode("ascii")) + + def version_string(self): + return BaseHTTPRequestHandler.version_string(self).strip() + + def address_string(self): + if getattr(self, "environ", None): + return self.environ["REMOTE_ADDR"] + elif not self.client_address: + return "" + elif isinstance(self.client_address, str): + return self.client_address + else: + return self.client_address[0] + + def port_integer(self): + return self.client_address[1] + + def log_request(self, code="-", size="-"): + try: + path = uri_to_iri(self.path) + msg = "%s %s %s" % (self.command, path, self.request_version) + except AttributeError: + # path isn't set if the requestline was bad + msg = self.requestline + + code = str(code) + + if termcolor: + color = termcolor.colored + + if code[0] == "1": # 1xx - Informational + msg = color(msg, attrs=["bold"]) + elif code[0] == "2": # 2xx - Success + msg = color(msg, color="white") + elif code == "304": # 304 - Resource Not Modified + msg = color(msg, color="cyan") + elif code[0] == "3": # 3xx - Redirection + msg = color(msg, color="green") + elif code == "404": # 404 - Resource Not Found + msg = color(msg, color="yellow") + elif code[0] == "4": # 4xx - Client Error + msg = color(msg, color="red", attrs=["bold"]) + else: # 5xx, or any other response + msg = color(msg, color="magenta", attrs=["bold"]) + + self.log("info", '"%s" %s %s', msg, code, size) + + def log_error(self, *args): + self.log("error", *args) + + def log_message(self, format, *args): + self.log("info", format, *args) + + def log(self, type, message, *args): + _log( + type, + "%s - - [%s] %s\n" + % (self.address_string(), self.log_date_time_string(), message % args), + ) + + def get_header_items(self): + """ + Get an iterable list of key/value pairs representing headers. + + This function provides Python 2/3 compatibility as related to the + parsing of request headers. Python 2.7 is not compliant with + RFC 3875 Section 4.1.18 which requires multiple values for headers + to be provided or RFC 2616 which allows for folding of multi-line + headers. This function will return a matching list regardless + of Python version. It can be removed once Python 2.7 support + is dropped. + + :return: List of tuples containing header hey/value pairs + """ + if PY2: + # For Python 2, process the headers manually according to + # W3C RFC 2616 Section 4.2. + items = [] + for header in self.headers.headers: + # Remove "\r\n" from the header and split on ":" to get + # the field name and value. + try: + key, value = header[0:-2].split(":", 1) + except ValueError: + # If header could not be slit with : but starts with white + # space and it follows an existing header, it's a folded + # header. + if header[0] in ("\t", " ") and items: + # Pop off the last header + key, value = items.pop() + # Append the current header to the value of the last + # header which will be placed back on the end of the + # list + value = value + header + # Otherwise it's just a bad header and should error + else: + # Re-raise the value error + raise + + # Add the key and the value once stripped of leading + # white space. The specification allows for stripping + # trailing white space but the Python 3 code does not + # strip trailing white space. Therefore, trailing space + # will be left as is to match the Python 3 behavior. + items.append((key, value.lstrip())) + else: + items = self.headers.items() + + return items + + +#: backwards compatible name if someone is subclassing it +BaseRequestHandler = WSGIRequestHandler + + +def generate_adhoc_ssl_pair(cn=None): + from random import random + + crypto = _get_openssl_crypto_module() + + # pretty damn sure that this is not actually accepted by anyone + if cn is None: + cn = "*" + + cert = crypto.X509() + cert.set_serial_number(int(random() * sys.maxsize)) + cert.gmtime_adj_notBefore(0) + cert.gmtime_adj_notAfter(60 * 60 * 24 * 365) + + subject = cert.get_subject() + subject.CN = cn + subject.O = "Dummy Certificate" # noqa: E741 + + issuer = cert.get_issuer() + issuer.CN = subject.CN + issuer.O = subject.O # noqa: E741 + + pkey = crypto.PKey() + pkey.generate_key(crypto.TYPE_RSA, 2048) + cert.set_pubkey(pkey) + cert.sign(pkey, "sha256") + + return cert, pkey + + +def make_ssl_devcert(base_path, host=None, cn=None): + """Creates an SSL key for development. This should be used instead of + the ``'adhoc'`` key which generates a new cert on each server start. + It accepts a path for where it should store the key and cert and + either a host or CN. If a host is given it will use the CN + ``*.host/CN=host``. + + For more information see :func:`run_simple`. + + .. versionadded:: 0.9 + + :param base_path: the path to the certificate and key. The extension + ``.crt`` is added for the certificate, ``.key`` is + added for the key. + :param host: the name of the host. This can be used as an alternative + for the `cn`. + :param cn: the `CN` to use. + """ + from OpenSSL import crypto + + if host is not None: + cn = "*.%s/CN=%s" % (host, host) + cert, pkey = generate_adhoc_ssl_pair(cn=cn) + + cert_file = base_path + ".crt" + pkey_file = base_path + ".key" + + with open(cert_file, "wb") as f: + f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + with open(pkey_file, "wb") as f: + f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + + return cert_file, pkey_file + + +def generate_adhoc_ssl_context(): + """Generates an adhoc SSL context for the development server.""" + crypto = _get_openssl_crypto_module() + import tempfile + import atexit + + cert, pkey = generate_adhoc_ssl_pair() + cert_handle, cert_file = tempfile.mkstemp() + pkey_handle, pkey_file = tempfile.mkstemp() + atexit.register(os.remove, pkey_file) + atexit.register(os.remove, cert_file) + + os.write(cert_handle, crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + os.write(pkey_handle, crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + os.close(cert_handle) + os.close(pkey_handle) + ctx = load_ssl_context(cert_file, pkey_file) + return ctx + + +def load_ssl_context(cert_file, pkey_file=None, protocol=None): + """Loads SSL context from cert/private key files and optional protocol. + Many parameters are directly taken from the API of + :py:class:`ssl.SSLContext`. + + :param cert_file: Path of the certificate to use. + :param pkey_file: Path of the private key to use. If not given, the key + will be obtained from the certificate file. + :param protocol: One of the ``PROTOCOL_*`` constants in the stdlib ``ssl`` + module. Defaults to ``PROTOCOL_SSLv23``. + """ + if protocol is None: + protocol = ssl.PROTOCOL_SSLv23 + ctx = _SSLContext(protocol) + ctx.load_cert_chain(cert_file, pkey_file) + return ctx + + +class _SSLContext(object): + + """A dummy class with a small subset of Python3's ``ssl.SSLContext``, only + intended to be used with and by Werkzeug.""" + + def __init__(self, protocol): + self._protocol = protocol + self._certfile = None + self._keyfile = None + self._password = None + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._certfile = certfile + self._keyfile = keyfile or certfile + self._password = password + + def wrap_socket(self, sock, **kwargs): + return ssl.wrap_socket( + sock, + keyfile=self._keyfile, + certfile=self._certfile, + ssl_version=self._protocol, + **kwargs + ) + + +def is_ssl_error(error=None): + """Checks if the given error (or the current one) is an SSL error.""" + exc_types = (ssl.SSLError,) + try: + from OpenSSL.SSL import Error + + exc_types += (Error,) + except ImportError: + pass + + if error is None: + error = sys.exc_info()[1] + return isinstance(error, exc_types) + + +def select_address_family(host, port): + """Return ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on + the host and port.""" + # disabled due to problems with current ipv6 implementations + # and various operating systems. Probably this code also is + # not supposed to work, but I can't come up with any other + # ways to implement this. + # try: + # info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + # socket.SOCK_STREAM, 0, + # socket.AI_PASSIVE) + # if info: + # return info[0][0] + # except socket.gaierror: + # pass + if host.startswith("unix://"): + return socket.AF_UNIX + elif ":" in host and hasattr(socket, "AF_INET6"): + return socket.AF_INET6 + return socket.AF_INET + + +def get_sockaddr(host, port, family): + """Return a fully qualified socket address that can be passed to + :func:`socket.bind`.""" + if family == af_unix: + return host.split("://", 1)[1] + try: + res = socket.getaddrinfo( + host, port, family, socket.SOCK_STREAM, socket.IPPROTO_TCP + ) + except socket.gaierror: + return host, port + return res[0][4] + + +class BaseWSGIServer(HTTPServer, object): + + """Simple single-threaded, single-process WSGI server.""" + + multithread = False + multiprocess = False + request_queue_size = LISTEN_QUEUE + + def __init__( + self, + host, + port, + app, + handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, + ): + if handler is None: + handler = WSGIRequestHandler + + self.address_family = select_address_family(host, port) + + if fd is not None: + real_sock = socket.fromfd(fd, self.address_family, socket.SOCK_STREAM) + port = 0 + + server_address = get_sockaddr(host, int(port), self.address_family) + + # remove socket file if it already exists + if self.address_family == af_unix and os.path.exists(server_address): + os.unlink(server_address) + HTTPServer.__init__(self, server_address, handler) + + self.app = app + self.passthrough_errors = passthrough_errors + self.shutdown_signal = False + self.host = host + self.port = self.socket.getsockname()[1] + + # Patch in the original socket. + if fd is not None: + self.socket.close() + self.socket = real_sock + self.server_address = self.socket.getsockname() + + if ssl_context is not None: + if isinstance(ssl_context, tuple): + ssl_context = load_ssl_context(*ssl_context) + if ssl_context == "adhoc": + ssl_context = generate_adhoc_ssl_context() + # If we are on Python 2 the return value from socket.fromfd + # is an internal socket object but what we need for ssl wrap + # is the wrapper around it :( + sock = self.socket + if PY2 and not isinstance(sock, socket.socket): + sock = socket.socket(sock.family, sock.type, sock.proto, sock) + self.socket = ssl_context.wrap_socket(sock, server_side=True) + self.ssl_context = ssl_context + else: + self.ssl_context = None + + def log(self, type, message, *args): + _log(type, message, *args) + + def serve_forever(self): + self.shutdown_signal = False + try: + HTTPServer.serve_forever(self) + except KeyboardInterrupt: + pass + finally: + self.server_close() + + def handle_error(self, request, client_address): + if self.passthrough_errors: + raise + # Python 2 still causes a socket.error after the earlier + # handling, so silence it here. + if isinstance(sys.exc_info()[1], _ConnectionError): + return + return HTTPServer.handle_error(self, request, client_address) + + def get_request(self): + con, info = self.socket.accept() + return con, info + + +class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer): + + """A WSGI server that does threading.""" + + multithread = True + daemon_threads = True + + +class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): + + """A WSGI server that does forking.""" + + multiprocess = True + + def __init__( + self, + host, + port, + app, + processes=40, + handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, + ): + if not can_fork: + raise ValueError("Your platform does not support forking.") + BaseWSGIServer.__init__( + self, host, port, app, handler, passthrough_errors, ssl_context, fd + ) + self.max_children = processes + + +def make_server( + host=None, + port=None, + app=None, + threaded=False, + processes=1, + request_handler=None, + passthrough_errors=False, + ssl_context=None, + fd=None, +): + """Create a new server instance that is either threaded, or forks + or just processes one request after another. + """ + if threaded and processes > 1: + raise ValueError("cannot have a multithreaded and multi process server.") + elif threaded: + return ThreadedWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + elif processes > 1: + return ForkingWSGIServer( + host, + port, + app, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + else: + return BaseWSGIServer( + host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd + ) + + +def is_running_from_reloader(): + """Checks if the application is running from within the Werkzeug + reloader subprocess. + + .. versionadded:: 0.10 + """ + return os.environ.get("WERKZEUG_RUN_MAIN") == "true" + + +def run_simple( + hostname, + port, + application, + use_reloader=False, + use_debugger=False, + use_evalex=True, + extra_files=None, + reloader_interval=1, + reloader_type="auto", + threaded=False, + processes=1, + request_handler=None, + static_files=None, + passthrough_errors=False, + ssl_context=None, +): + """Start a WSGI application. Optional features include a reloader, + multithreading and fork support. + + This function has a command-line interface too:: + + python -m werkzeug.serving --help + + .. versionadded:: 0.5 + `static_files` was added to simplify serving of static files as well + as `passthrough_errors`. + + .. versionadded:: 0.6 + support for SSL was added. + + .. versionadded:: 0.8 + Added support for automatically loading a SSL context from certificate + file and private key. + + .. versionadded:: 0.9 + Added command-line interface. + + .. versionadded:: 0.10 + Improved the reloader and added support for changing the backend + through the `reloader_type` parameter. See :ref:`reloader` + for more information. + + .. versionchanged:: 0.15 + Bind to a Unix socket by passing a path that starts with + ``unix://`` as the ``hostname``. + + :param hostname: The host to bind to, for example ``'localhost'``. + If the value is a path that starts with ``unix://`` it will bind + to a Unix socket instead of a TCP socket.. + :param port: The port for the server. eg: ``8080`` + :param application: the WSGI application to execute + :param use_reloader: should the server automatically restart the python + process if modules were changed? + :param use_debugger: should the werkzeug debugging system be used? + :param use_evalex: should the exception evaluation feature be enabled? + :param extra_files: a list of files the reloader should watch + additionally to the modules. For example configuration + files. + :param reloader_interval: the interval for the reloader in seconds. + :param reloader_type: the type of reloader to use. The default is + auto detection. Valid values are ``'stat'`` and + ``'watchdog'``. See :ref:`reloader` for more + information. + :param threaded: should the process handle each request in a separate + thread? + :param processes: if greater than 1 then handle each request in a new process + up to this maximum number of concurrent processes. + :param request_handler: optional parameter that can be used to replace + the default one. You can use this to replace it + with a different + :class:`~BaseHTTPServer.BaseHTTPRequestHandler` + subclass. + :param static_files: a list or dict of paths for static files. This works + exactly like :class:`SharedDataMiddleware`, it's actually + just wrapping the application in that middleware before + serving. + :param passthrough_errors: set this to `True` to disable the error catching. + This means that the server will die on errors but + it can be useful to hook debuggers in (pdb etc.) + :param ssl_context: an SSL context for the connection. Either an + :class:`ssl.SSLContext`, a tuple in the form + ``(cert_file, pkey_file)``, the string ``'adhoc'`` if + the server should automatically create one, or ``None`` + to disable SSL (which is the default). + """ + if not isinstance(port, int): + raise TypeError("port must be an integer") + if use_debugger: + from .debug import DebuggedApplication + + application = DebuggedApplication(application, use_evalex) + if static_files: + from .middleware.shared_data import SharedDataMiddleware + + application = SharedDataMiddleware(application, static_files) + + def log_startup(sock): + display_hostname = hostname if hostname not in ("", "*") else "localhost" + quit_msg = "(Press CTRL+C to quit)" + if sock.family == af_unix: + _log("info", " * Running on %s %s", display_hostname, quit_msg) + else: + if ":" in display_hostname: + display_hostname = "[%s]" % display_hostname + port = sock.getsockname()[1] + _log( + "info", + " * Running on %s://%s:%d/ %s", + "http" if ssl_context is None else "https", + display_hostname, + port, + quit_msg, + ) + + def inner(): + try: + fd = int(os.environ["WERKZEUG_SERVER_FD"]) + except (LookupError, ValueError): + fd = None + srv = make_server( + hostname, + port, + application, + threaded, + processes, + request_handler, + passthrough_errors, + ssl_context, + fd=fd, + ) + if fd is None: + log_startup(srv.socket) + srv.serve_forever() + + if use_reloader: + # If we're not running already in the subprocess that is the + # reloader we want to open up a socket early to make sure the + # port is actually available. + if not is_running_from_reloader(): + if port == 0 and not can_open_by_fd: + raise ValueError( + "Cannot bind to a random port with enabled " + "reloader if the Python interpreter does " + "not support socket opening by fd." + ) + + # Create and destroy a socket so that any exceptions are + # raised before we spawn a separate Python interpreter and + # lose this ability. + address_family = select_address_family(hostname, port) + server_address = get_sockaddr(hostname, port, address_family) + s = socket.socket(address_family, socket.SOCK_STREAM) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(server_address) + if hasattr(s, "set_inheritable"): + s.set_inheritable(True) + + # If we can open the socket by file descriptor, then we can just + # reuse this one and our socket will survive the restarts. + if can_open_by_fd: + os.environ["WERKZEUG_SERVER_FD"] = str(s.fileno()) + s.listen(LISTEN_QUEUE) + log_startup(s) + else: + s.close() + if address_family == af_unix: + _log("info", "Unlinking %s" % server_address) + os.unlink(server_address) + + # Do not use relative imports, otherwise "python -m werkzeug.serving" + # breaks. + from ._reloader import run_with_reloader + + run_with_reloader(inner, extra_files, reloader_interval, reloader_type) + else: + inner() + + +def run_with_reloader(*args, **kwargs): + # People keep using undocumented APIs. Do not use this function + # please, we do not guarantee that it continues working. + from ._reloader import run_with_reloader + + return run_with_reloader(*args, **kwargs) + + +def main(): + """A simple command-line interface for :py:func:`run_simple`.""" + + # in contrast to argparse, this works at least under Python < 2.7 + import optparse + from .utils import import_string + + parser = optparse.OptionParser(usage="Usage: %prog [options] app_module:app_object") + parser.add_option( + "-b", + "--bind", + dest="address", + help="The hostname:port the app should listen on.", + ) + parser.add_option( + "-d", + "--debug", + dest="use_debugger", + action="store_true", + default=False, + help="Use Werkzeug's debugger.", + ) + parser.add_option( + "-r", + "--reload", + dest="use_reloader", + action="store_true", + default=False, + help="Reload Python process if modules change.", + ) + options, args = parser.parse_args() + + hostname, port = None, None + if options.address: + address = options.address.split(":") + hostname = address[0] + if len(address) > 1: + port = address[1] + + if len(args) != 1: + sys.stdout.write("No application supplied, or too much. See --help\n") + sys.exit(1) + app = import_string(args[0]) + + run_simple( + hostname=(hostname or "127.0.0.1"), + port=int(port or 5000), + application=app, + use_reloader=options.use_reloader, + use_debugger=options.use_debugger, + ) + + +if __name__ == "__main__": + main() diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/test.py b/backend/venv/lib/python3.7/site-packages/werkzeug/test.py new file mode 100644 index 0000000..6148665 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/test.py @@ -0,0 +1,1146 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.test + ~~~~~~~~~~~~~ + + This module implements a client to WSGI applications for testing. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import mimetypes +import sys +from io import BytesIO +from itertools import chain +from random import random +from tempfile import TemporaryFile +from time import time + +from ._compat import iteritems +from ._compat import iterlists +from ._compat import itervalues +from ._compat import make_literal_wrapper +from ._compat import reraise +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import wsgi_encoding_dance +from ._internal import _get_environ +from .datastructures import CallbackDict +from .datastructures import CombinedMultiDict +from .datastructures import EnvironHeaders +from .datastructures import FileMultiDict +from .datastructures import FileStorage +from .datastructures import Headers +from .datastructures import MultiDict +from .http import dump_cookie +from .http import dump_options_header +from .http import parse_options_header +from .urls import iri_to_uri +from .urls import url_encode +from .urls import url_fix +from .urls import url_parse +from .urls import url_unparse +from .urls import url_unquote +from .utils import get_content_type +from .wrappers import BaseRequest +from .wsgi import ClosingIterator +from .wsgi import get_current_url + +try: + from urllib.request import Request as U2Request +except ImportError: + from urllib2 import Request as U2Request + +try: + from http.cookiejar import CookieJar +except ImportError: + from cookielib import CookieJar + + +def stream_encode_multipart( + values, use_tempfile=True, threshold=1024 * 500, boundary=None, charset="utf-8" +): + """Encode a dict of values (either strings or file descriptors or + :class:`FileStorage` objects.) into a multipart encoded string stored + in a file descriptor. + """ + if boundary is None: + boundary = "---------------WerkzeugFormPart_%s%s" % (time(), random()) + _closure = [BytesIO(), 0, False] + + if use_tempfile: + + def write_binary(string): + stream, total_length, on_disk = _closure + if on_disk: + stream.write(string) + else: + length = len(string) + if length + _closure[1] <= threshold: + stream.write(string) + else: + new_stream = TemporaryFile("wb+") + new_stream.write(stream.getvalue()) + new_stream.write(string) + _closure[0] = new_stream + _closure[2] = True + _closure[1] = total_length + length + + else: + write_binary = _closure[0].write + + def write(string): + write_binary(string.encode(charset)) + + if not isinstance(values, MultiDict): + values = MultiDict(values) + + for key, values in iterlists(values): + for value in values: + write('--%s\r\nContent-Disposition: form-data; name="%s"' % (boundary, key)) + reader = getattr(value, "read", None) + if reader is not None: + filename = getattr(value, "filename", getattr(value, "name", None)) + content_type = getattr(value, "content_type", None) + if content_type is None: + content_type = ( + filename + and mimetypes.guess_type(filename)[0] + or "application/octet-stream" + ) + if filename is not None: + write('; filename="%s"\r\n' % filename) + else: + write("\r\n") + write("Content-Type: %s\r\n\r\n" % content_type) + while 1: + chunk = reader(16384) + if not chunk: + break + write_binary(chunk) + else: + if not isinstance(value, string_types): + value = str(value) + + value = to_bytes(value, charset) + write("\r\n\r\n") + write_binary(value) + write("\r\n") + write("--%s--\r\n" % boundary) + + length = int(_closure[0].tell()) + _closure[0].seek(0) + return _closure[0], length, boundary + + +def encode_multipart(values, boundary=None, charset="utf-8"): + """Like `stream_encode_multipart` but returns a tuple in the form + (``boundary``, ``data``) where data is a bytestring. + """ + stream, length, boundary = stream_encode_multipart( + values, use_tempfile=False, boundary=boundary, charset=charset + ) + return boundary, stream.read() + + +def File(fd, filename=None, mimetype=None): + """Backwards compat. + + .. deprecated:: 0.5 + """ + from warnings import warn + + warn( + "'werkzeug.test.File' is deprecated as of version 0.5 and will" + " be removed in version 1.0. Use 'EnvironBuilder' or" + " 'FileStorage' instead.", + DeprecationWarning, + stacklevel=2, + ) + return FileStorage(fd, filename=filename, content_type=mimetype) + + +class _TestCookieHeaders(object): + + """A headers adapter for cookielib + """ + + def __init__(self, headers): + self.headers = headers + + def getheaders(self, name): + headers = [] + name = name.lower() + for k, v in self.headers: + if k.lower() == name: + headers.append(v) + return headers + + def get_all(self, name, default=None): + rv = [] + for k, v in self.headers: + if k.lower() == name.lower(): + rv.append(v) + return rv or default or [] + + +class _TestCookieResponse(object): + + """Something that looks like a httplib.HTTPResponse, but is actually just an + adapter for our test responses to make them available for cookielib. + """ + + def __init__(self, headers): + self.headers = _TestCookieHeaders(headers) + + def info(self): + return self.headers + + +class _TestCookieJar(CookieJar): + + """A cookielib.CookieJar modified to inject and read cookie headers from + and to wsgi environments, and wsgi application responses. + """ + + def inject_wsgi(self, environ): + """Inject the cookies as client headers into the server's wsgi + environment. + """ + cvals = ["%s=%s" % (c.name, c.value) for c in self] + + if cvals: + environ["HTTP_COOKIE"] = "; ".join(cvals) + else: + environ.pop("HTTP_COOKIE", None) + + def extract_wsgi(self, environ, headers): + """Extract the server's set-cookie headers as cookies into the + cookie jar. + """ + self.extract_cookies( + _TestCookieResponse(headers), U2Request(get_current_url(environ)) + ) + + +def _iter_data(data): + """Iterates over a `dict` or :class:`MultiDict` yielding all keys and + values. + This is used to iterate over the data passed to the + :class:`EnvironBuilder`. + """ + if isinstance(data, MultiDict): + for key, values in iterlists(data): + for value in values: + yield key, value + else: + for key, values in iteritems(data): + if isinstance(values, list): + for value in values: + yield key, value + else: + yield key, values + + +class EnvironBuilder(object): + """This class can be used to conveniently create a WSGI environment + for testing purposes. It can be used to quickly create WSGI environments + or request objects from arbitrary data. + + The signature of this class is also used in some other places as of + Werkzeug 0.5 (:func:`create_environ`, :meth:`BaseResponse.from_values`, + :meth:`Client.open`). Because of this most of the functionality is + available through the constructor alone. + + Files and regular form data can be manipulated independently of each + other with the :attr:`form` and :attr:`files` attributes, but are + passed with the same argument to the constructor: `data`. + + `data` can be any of these values: + + - a `str` or `bytes` object: The object is converted into an + :attr:`input_stream`, the :attr:`content_length` is set and you have to + provide a :attr:`content_type`. + - a `dict` or :class:`MultiDict`: The keys have to be strings. The values + have to be either any of the following objects, or a list of any of the + following objects: + + - a :class:`file`-like object: These are converted into + :class:`FileStorage` objects automatically. + - a `tuple`: The :meth:`~FileMultiDict.add_file` method is called + with the key and the unpacked `tuple` items as positional + arguments. + - a `str`: The string is set as form data for the associated key. + - a file-like object: The object content is loaded in memory and then + handled like a regular `str` or a `bytes`. + + :param path: the path of the request. In the WSGI environment this will + end up as `PATH_INFO`. If the `query_string` is not defined + and there is a question mark in the `path` everything after + it is used as query string. + :param base_url: the base URL is a URL that is used to extract the WSGI + URL scheme, host (server name + server port) and the + script root (`SCRIPT_NAME`). + :param query_string: an optional string or dict with URL parameters. + :param method: the HTTP method to use, defaults to `GET`. + :param input_stream: an optional input stream. Do not specify this and + `data`. As soon as an input stream is set you can't + modify :attr:`args` and :attr:`files` unless you + set the :attr:`input_stream` to `None` again. + :param content_type: The content type for the request. As of 0.5 you + don't have to provide this when specifying files + and form data via `data`. + :param content_length: The content length for the request. You don't + have to specify this when providing data via + `data`. + :param errors_stream: an optional error stream that is used for + `wsgi.errors`. Defaults to :data:`stderr`. + :param multithread: controls `wsgi.multithread`. Defaults to `False`. + :param multiprocess: controls `wsgi.multiprocess`. Defaults to `False`. + :param run_once: controls `wsgi.run_once`. Defaults to `False`. + :param headers: an optional list or :class:`Headers` object of headers. + :param data: a string or dict of form data or a file-object. + See explanation above. + :param json: An object to be serialized and assigned to ``data``. + Defaults the content type to ``"application/json"``. + Serialized with the function assigned to :attr:`json_dumps`. + :param environ_base: an optional dict of environment defaults. + :param environ_overrides: an optional dict of environment overrides. + :param charset: the charset used to encode unicode data. + + .. versionadded:: 0.15 + The ``json`` param and :meth:`json_dumps` method. + + .. versionadded:: 0.15 + The environ has keys ``REQUEST_URI`` and ``RAW_URI`` containing + the path before perecent-decoding. This is not part of the WSGI + PEP, but many WSGI servers include it. + + .. versionchanged:: 0.6 + ``path`` and ``base_url`` can now be unicode strings that are + encoded with :func:`iri_to_uri`. + """ + + #: the server protocol to use. defaults to HTTP/1.1 + server_protocol = "HTTP/1.1" + + #: the wsgi version to use. defaults to (1, 0) + wsgi_version = (1, 0) + + #: the default request class for :meth:`get_request` + request_class = BaseRequest + + import json + + #: The serialization function used when ``json`` is passed. + json_dumps = staticmethod(json.dumps) + del json + + def __init__( + self, + path="/", + base_url=None, + query_string=None, + method="GET", + input_stream=None, + content_type=None, + content_length=None, + errors_stream=None, + multithread=False, + multiprocess=False, + run_once=False, + headers=None, + data=None, + environ_base=None, + environ_overrides=None, + charset="utf-8", + mimetype=None, + json=None, + ): + path_s = make_literal_wrapper(path) + if query_string is not None and path_s("?") in path: + raise ValueError("Query string is defined in the path and as an argument") + if query_string is None and path_s("?") in path: + path, query_string = path.split(path_s("?"), 1) + self.charset = charset + self.path = iri_to_uri(path) + if base_url is not None: + base_url = url_fix(iri_to_uri(base_url, charset), charset) + self.base_url = base_url + if isinstance(query_string, (bytes, text_type)): + self.query_string = query_string + else: + if query_string is None: + query_string = MultiDict() + elif not isinstance(query_string, MultiDict): + query_string = MultiDict(query_string) + self.args = query_string + self.method = method + if headers is None: + headers = Headers() + elif not isinstance(headers, Headers): + headers = Headers(headers) + self.headers = headers + if content_type is not None: + self.content_type = content_type + if errors_stream is None: + errors_stream = sys.stderr + self.errors_stream = errors_stream + self.multithread = multithread + self.multiprocess = multiprocess + self.run_once = run_once + self.environ_base = environ_base + self.environ_overrides = environ_overrides + self.input_stream = input_stream + self.content_length = content_length + self.closed = False + + if json is not None: + if data is not None: + raise TypeError("can't provide both json and data") + + data = self.json_dumps(json) + + if self.content_type is None: + self.content_type = "application/json" + + if data: + if input_stream is not None: + raise TypeError("can't provide input stream and data") + if hasattr(data, "read"): + data = data.read() + if isinstance(data, text_type): + data = data.encode(self.charset) + if isinstance(data, bytes): + self.input_stream = BytesIO(data) + if self.content_length is None: + self.content_length = len(data) + else: + for key, value in _iter_data(data): + if isinstance(value, (tuple, dict)) or hasattr(value, "read"): + self._add_file_from_data(key, value) + else: + self.form.setlistdefault(key).append(value) + + if mimetype is not None: + self.mimetype = mimetype + + @classmethod + def from_environ(cls, environ, **kwargs): + """Turn an environ dict back into a builder. Any extra kwargs + override the args extracted from the environ. + + .. versionadded:: 0.15 + """ + headers = Headers(EnvironHeaders(environ)) + out = { + "path": environ["PATH_INFO"], + "base_url": cls._make_base_url( + environ["wsgi.url_scheme"], headers.pop("Host"), environ["SCRIPT_NAME"] + ), + "query_string": environ["QUERY_STRING"], + "method": environ["REQUEST_METHOD"], + "input_stream": environ["wsgi.input"], + "content_type": headers.pop("Content-Type", None), + "content_length": headers.pop("Content-Length", None), + "errors_stream": environ["wsgi.errors"], + "multithread": environ["wsgi.multithread"], + "multiprocess": environ["wsgi.multiprocess"], + "run_once": environ["wsgi.run_once"], + "headers": headers, + } + out.update(kwargs) + return cls(**out) + + def _add_file_from_data(self, key, value): + """Called in the EnvironBuilder to add files from the data dict.""" + if isinstance(value, tuple): + self.files.add_file(key, *value) + elif isinstance(value, dict): + from warnings import warn + + warn( + "Passing a dict as file data is deprecated as of" + " version 0.5 and will be removed in version 1.0. Use" + " a tuple or 'FileStorage' object instead.", + DeprecationWarning, + stacklevel=2, + ) + value = dict(value) + mimetype = value.pop("mimetype", None) + if mimetype is not None: + value["content_type"] = mimetype + self.files.add_file(key, **value) + else: + self.files.add_file(key, value) + + @staticmethod + def _make_base_url(scheme, host, script_root): + return url_unparse((scheme, host, script_root, "", "")).rstrip("/") + "/" + + @property + def base_url(self): + """The base URL is used to extract the URL scheme, host name, + port, and root path. + """ + return self._make_base_url(self.url_scheme, self.host, self.script_root) + + @base_url.setter + def base_url(self, value): + if value is None: + scheme = "http" + netloc = "localhost" + script_root = "" + else: + scheme, netloc, script_root, qs, anchor = url_parse(value) + if qs or anchor: + raise ValueError("base url must not contain a query string or fragment") + self.script_root = script_root.rstrip("/") + self.host = netloc + self.url_scheme = scheme + + def _get_content_type(self): + ct = self.headers.get("Content-Type") + if ct is None and not self._input_stream: + if self._files: + return "multipart/form-data" + elif self._form: + return "application/x-www-form-urlencoded" + return None + return ct + + def _set_content_type(self, value): + if value is None: + self.headers.pop("Content-Type", None) + else: + self.headers["Content-Type"] = value + + content_type = property( + _get_content_type, + _set_content_type, + doc="""The content type for the request. Reflected from and to + the :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection.""", + ) + del _get_content_type, _set_content_type + + def _get_content_length(self): + return self.headers.get("Content-Length", type=int) + + def _get_mimetype(self): + ct = self.content_type + if ct: + return ct.split(";")[0].strip() + + def _set_mimetype(self, value): + self.content_type = get_content_type(value, self.charset) + + def _get_mimetype_params(self): + def on_update(d): + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + mimetype = property( + _get_mimetype, + _set_mimetype, + doc="""The mimetype (content type without charset etc.) + + .. versionadded:: 0.14 + """, + ) + mimetype_params = property( + _get_mimetype_params, + doc=""" The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.14 + """, + ) + del _get_mimetype, _set_mimetype, _get_mimetype_params + + def _set_content_length(self, value): + if value is None: + self.headers.pop("Content-Length", None) + else: + self.headers["Content-Length"] = str(value) + + content_length = property( + _get_content_length, + _set_content_length, + doc="""The content length as integer. Reflected from and to the + :attr:`headers`. Do not set if you set :attr:`files` or + :attr:`form` for auto detection.""", + ) + del _get_content_length, _set_content_length + + def form_property(name, storage, doc): # noqa: B902 + key = "_" + name + + def getter(self): + if self._input_stream is not None: + raise AttributeError("an input stream is defined") + rv = getattr(self, key) + if rv is None: + rv = storage() + setattr(self, key, rv) + + return rv + + def setter(self, value): + self._input_stream = None + setattr(self, key, value) + + return property(getter, setter, doc=doc) + + form = form_property("form", MultiDict, doc="A :class:`MultiDict` of form values.") + files = form_property( + "files", + FileMultiDict, + doc="""A :class:`FileMultiDict` of uploaded files. You can use + the :meth:`~FileMultiDict.add_file` method to add new files to + the dict.""", + ) + del form_property + + def _get_input_stream(self): + return self._input_stream + + def _set_input_stream(self, value): + self._input_stream = value + self._form = self._files = None + + input_stream = property( + _get_input_stream, + _set_input_stream, + doc="""An optional input stream. If you set this it will clear + :attr:`form` and :attr:`files`.""", + ) + del _get_input_stream, _set_input_stream + + def _get_query_string(self): + if self._query_string is None: + if self._args is not None: + return url_encode(self._args, charset=self.charset) + return "" + return self._query_string + + def _set_query_string(self, value): + self._query_string = value + self._args = None + + query_string = property( + _get_query_string, + _set_query_string, + doc="""The query string. If you set this to a string + :attr:`args` will no longer be available.""", + ) + del _get_query_string, _set_query_string + + def _get_args(self): + if self._query_string is not None: + raise AttributeError("a query string is defined") + if self._args is None: + self._args = MultiDict() + return self._args + + def _set_args(self, value): + self._query_string = None + self._args = value + + args = property( + _get_args, _set_args, doc="The URL arguments as :class:`MultiDict`." + ) + del _get_args, _set_args + + @property + def server_name(self): + """The server name (read-only, use :attr:`host` to set)""" + return self.host.split(":", 1)[0] + + @property + def server_port(self): + """The server port as integer (read-only, use :attr:`host` to set)""" + pieces = self.host.split(":", 1) + if len(pieces) == 2 and pieces[1].isdigit(): + return int(pieces[1]) + elif self.url_scheme == "https": + return 443 + return 80 + + def __del__(self): + try: + self.close() + except Exception: + pass + + def close(self): + """Closes all files. If you put real :class:`file` objects into the + :attr:`files` dict you can call this method to automatically close + them all in one go. + """ + if self.closed: + return + try: + files = itervalues(self.files) + except AttributeError: + files = () + for f in files: + try: + f.close() + except Exception: + pass + self.closed = True + + def get_environ(self): + """Return the built environ. + + .. versionchanged:: 0.15 + The content type and length headers are set based on + input stream detection. Previously this only set the WSGI + keys. + """ + input_stream = self.input_stream + content_length = self.content_length + + mimetype = self.mimetype + content_type = self.content_type + + if input_stream is not None: + start_pos = input_stream.tell() + input_stream.seek(0, 2) + end_pos = input_stream.tell() + input_stream.seek(start_pos) + content_length = end_pos - start_pos + elif mimetype == "multipart/form-data": + values = CombinedMultiDict([self.form, self.files]) + input_stream, content_length, boundary = stream_encode_multipart( + values, charset=self.charset + ) + content_type = mimetype + '; boundary="%s"' % boundary + elif mimetype == "application/x-www-form-urlencoded": + # XXX: py2v3 review + values = url_encode(self.form, charset=self.charset) + values = values.encode("ascii") + content_length = len(values) + input_stream = BytesIO(values) + else: + input_stream = BytesIO() + + result = {} + if self.environ_base: + result.update(self.environ_base) + + def _path_encode(x): + return wsgi_encoding_dance(url_unquote(x, self.charset), self.charset) + + qs = wsgi_encoding_dance(self.query_string) + + result.update( + { + "REQUEST_METHOD": self.method, + "SCRIPT_NAME": _path_encode(self.script_root), + "PATH_INFO": _path_encode(self.path), + "QUERY_STRING": qs, + # Non-standard, added by mod_wsgi, uWSGI + "REQUEST_URI": wsgi_encoding_dance(self.path), + # Non-standard, added by gunicorn + "RAW_URI": wsgi_encoding_dance(self.path), + "SERVER_NAME": self.server_name, + "SERVER_PORT": str(self.server_port), + "HTTP_HOST": self.host, + "SERVER_PROTOCOL": self.server_protocol, + "wsgi.version": self.wsgi_version, + "wsgi.url_scheme": self.url_scheme, + "wsgi.input": input_stream, + "wsgi.errors": self.errors_stream, + "wsgi.multithread": self.multithread, + "wsgi.multiprocess": self.multiprocess, + "wsgi.run_once": self.run_once, + } + ) + + headers = self.headers.copy() + + if content_type is not None: + result["CONTENT_TYPE"] = content_type + headers.set("Content-Type", content_type) + + if content_length is not None: + result["CONTENT_LENGTH"] = str(content_length) + headers.set("Content-Length", content_length) + + for key, value in headers.to_wsgi_list(): + result["HTTP_%s" % key.upper().replace("-", "_")] = value + + if self.environ_overrides: + result.update(self.environ_overrides) + + return result + + def get_request(self, cls=None): + """Returns a request with the data. If the request class is not + specified :attr:`request_class` is used. + + :param cls: The request wrapper to use. + """ + if cls is None: + cls = self.request_class + return cls(self.get_environ()) + + +class ClientRedirectError(Exception): + """If a redirect loop is detected when using follow_redirects=True with + the :cls:`Client`, then this exception is raised. + """ + + +class Client(object): + """This class allows you to send requests to a wrapped application. + + The response wrapper can be a class or factory function that takes + three arguments: app_iter, status and headers. The default response + wrapper just returns a tuple. + + Example:: + + class ClientResponse(BaseResponse): + ... + + client = Client(MyApplication(), response_wrapper=ClientResponse) + + The use_cookies parameter indicates whether cookies should be stored and + sent for subsequent requests. This is True by default, but passing False + will disable this behaviour. + + If you want to request some subdomain of your application you may set + `allow_subdomain_redirects` to `True` as if not no external redirects + are allowed. + + .. versionadded:: 0.5 + `use_cookies` is new in this version. Older versions did not provide + builtin cookie support. + + .. versionadded:: 0.14 + The `mimetype` parameter was added. + + .. versionadded:: 0.15 + The ``json`` parameter. + """ + + def __init__( + self, + application, + response_wrapper=None, + use_cookies=True, + allow_subdomain_redirects=False, + ): + self.application = application + self.response_wrapper = response_wrapper + if use_cookies: + self.cookie_jar = _TestCookieJar() + else: + self.cookie_jar = None + self.allow_subdomain_redirects = allow_subdomain_redirects + + def set_cookie( + self, + server_name, + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=None, + httponly=False, + charset="utf-8", + ): + """Sets a cookie in the client's cookie jar. The server name + is required and has to match the one that is also passed to + the open call. + """ + assert self.cookie_jar is not None, "cookies disabled" + header = dump_cookie( + key, value, max_age, expires, path, domain, secure, httponly, charset + ) + environ = create_environ(path, base_url="http://" + server_name) + headers = [("Set-Cookie", header)] + self.cookie_jar.extract_wsgi(environ, headers) + + def delete_cookie(self, server_name, key, path="/", domain=None): + """Deletes a cookie in the test client.""" + self.set_cookie( + server_name, key, expires=0, max_age=0, path=path, domain=domain + ) + + def run_wsgi_app(self, environ, buffered=False): + """Runs the wrapped WSGI app with the given environment.""" + if self.cookie_jar is not None: + self.cookie_jar.inject_wsgi(environ) + rv = run_wsgi_app(self.application, environ, buffered=buffered) + if self.cookie_jar is not None: + self.cookie_jar.extract_wsgi(environ, rv[2]) + return rv + + def resolve_redirect(self, response, new_location, environ, buffered=False): + """Perform a new request to the location given by the redirect + response to the previous request. + """ + scheme, netloc, path, qs, anchor = url_parse(new_location) + builder = EnvironBuilder.from_environ(environ, query_string=qs) + + to_name_parts = netloc.split(":", 1)[0].split(".") + from_name_parts = builder.server_name.split(".") + + if to_name_parts != [""]: + # The new location has a host, use it for the base URL. + builder.url_scheme = scheme + builder.host = netloc + else: + # A local redirect with autocorrect_location_header=False + # doesn't have a host, so use the request's host. + to_name_parts = from_name_parts + + # Explain why a redirect to a different server name won't be followed. + if to_name_parts != from_name_parts: + if to_name_parts[-len(from_name_parts) :] == from_name_parts: + if not self.allow_subdomain_redirects: + raise RuntimeError("Following subdomain redirects is not enabled.") + else: + raise RuntimeError("Following external redirects is not supported.") + + path_parts = path.split("/") + root_parts = builder.script_root.split("/") + + if path_parts[: len(root_parts)] == root_parts: + # Strip the script root from the path. + builder.path = path[len(builder.script_root) :] + else: + # The new location is not under the script root, so use the + # whole path and clear the previous root. + builder.path = path + builder.script_root = "" + + status_code = int(response[1].split(None, 1)[0]) + + # Only 307 and 308 preserve all of the original request. + if status_code not in {307, 308}: + # HEAD is preserved, everything else becomes GET. + if builder.method != "HEAD": + builder.method = "GET" + + # Clear the body and the headers that describe it. + builder.input_stream = None + builder.content_type = None + builder.content_length = None + builder.headers.pop("Transfer-Encoding", None) + + # Disable the response wrapper while handling redirects. Not + # thread safe, but the client should not be shared anyway. + old_response_wrapper = self.response_wrapper + self.response_wrapper = None + + try: + return self.open(builder, as_tuple=True, buffered=buffered) + finally: + self.response_wrapper = old_response_wrapper + + def open(self, *args, **kwargs): + """Takes the same arguments as the :class:`EnvironBuilder` class with + some additions: You can provide a :class:`EnvironBuilder` or a WSGI + environment as only argument instead of the :class:`EnvironBuilder` + arguments and two optional keyword arguments (`as_tuple`, `buffered`) + that change the type of the return value or the way the application is + executed. + + .. versionchanged:: 0.5 + If a dict is provided as file in the dict for the `data` parameter + the content type has to be called `content_type` now instead of + `mimetype`. This change was made for consistency with + :class:`werkzeug.FileWrapper`. + + The `follow_redirects` parameter was added to :func:`open`. + + Additional parameters: + + :param as_tuple: Returns a tuple in the form ``(environ, result)`` + :param buffered: Set this to True to buffer the application run. + This will automatically close the application for + you as well. + :param follow_redirects: Set this to True if the `Client` should + follow HTTP redirects. + """ + as_tuple = kwargs.pop("as_tuple", False) + buffered = kwargs.pop("buffered", False) + follow_redirects = kwargs.pop("follow_redirects", False) + environ = None + if not kwargs and len(args) == 1: + if isinstance(args[0], EnvironBuilder): + environ = args[0].get_environ() + elif isinstance(args[0], dict): + environ = args[0] + if environ is None: + builder = EnvironBuilder(*args, **kwargs) + try: + environ = builder.get_environ() + finally: + builder.close() + + response = self.run_wsgi_app(environ.copy(), buffered=buffered) + + # handle redirects + redirect_chain = [] + while 1: + status_code = int(response[1].split(None, 1)[0]) + if ( + status_code not in {301, 302, 303, 305, 307, 308} + or not follow_redirects + ): + break + + # Exhaust intermediate response bodies to ensure middleware + # that returns an iterator runs any cleanup code. + if not buffered: + for _ in response[0]: + pass + + new_location = response[2]["location"] + new_redirect_entry = (new_location, status_code) + if new_redirect_entry in redirect_chain: + raise ClientRedirectError("loop detected") + redirect_chain.append(new_redirect_entry) + environ, response = self.resolve_redirect( + response, new_location, environ, buffered=buffered + ) + + if self.response_wrapper is not None: + response = self.response_wrapper(*response) + if as_tuple: + return environ, response + return response + + def get(self, *args, **kw): + """Like open but method is enforced to GET.""" + kw["method"] = "GET" + return self.open(*args, **kw) + + def patch(self, *args, **kw): + """Like open but method is enforced to PATCH.""" + kw["method"] = "PATCH" + return self.open(*args, **kw) + + def post(self, *args, **kw): + """Like open but method is enforced to POST.""" + kw["method"] = "POST" + return self.open(*args, **kw) + + def head(self, *args, **kw): + """Like open but method is enforced to HEAD.""" + kw["method"] = "HEAD" + return self.open(*args, **kw) + + def put(self, *args, **kw): + """Like open but method is enforced to PUT.""" + kw["method"] = "PUT" + return self.open(*args, **kw) + + def delete(self, *args, **kw): + """Like open but method is enforced to DELETE.""" + kw["method"] = "DELETE" + return self.open(*args, **kw) + + def options(self, *args, **kw): + """Like open but method is enforced to OPTIONS.""" + kw["method"] = "OPTIONS" + return self.open(*args, **kw) + + def trace(self, *args, **kw): + """Like open but method is enforced to TRACE.""" + kw["method"] = "TRACE" + return self.open(*args, **kw) + + def __repr__(self): + return "<%s %r>" % (self.__class__.__name__, self.application) + + +def create_environ(*args, **kwargs): + """Create a new WSGI environ dict based on the values passed. The first + parameter should be the path of the request which defaults to '/'. The + second one can either be an absolute path (in that case the host is + localhost:80) or a full path to the request with scheme, netloc port and + the path to the script. + + This accepts the same arguments as the :class:`EnvironBuilder` + constructor. + + .. versionchanged:: 0.5 + This function is now a thin wrapper over :class:`EnvironBuilder` which + was added in 0.5. The `headers`, `environ_base`, `environ_overrides` + and `charset` parameters were added. + """ + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_environ() + finally: + builder.close() + + +def run_wsgi_app(app, environ, buffered=False): + """Return a tuple in the form (app_iter, status, headers) of the + application output. This works best if you pass it an application that + returns an iterator all the time. + + Sometimes applications may use the `write()` callable returned + by the `start_response` function. This tries to resolve such edge + cases automatically. But if you don't get the expected output you + should set `buffered` to `True` which enforces buffering. + + If passed an invalid WSGI application the behavior of this function is + undefined. Never pass non-conforming WSGI applications to this function. + + :param app: the application to execute. + :param buffered: set to `True` to enforce buffering. + :return: tuple in the form ``(app_iter, status, headers)`` + """ + environ = _get_environ(environ) + response = [] + buffer = [] + + def start_response(status, headers, exc_info=None): + if exc_info is not None: + reraise(*exc_info) + response[:] = [status, headers] + return buffer.append + + app_rv = app(environ, start_response) + close_func = getattr(app_rv, "close", None) + app_iter = iter(app_rv) + + # when buffering we emit the close call early and convert the + # application iterator into a regular list + if buffered: + try: + app_iter = list(app_iter) + finally: + if close_func is not None: + close_func() + + # otherwise we iterate the application iter until we have a response, chain + # the already received data with the already collected data and wrap it in + # a new `ClosingIterator` if we need to restore a `close` callable from the + # original return value. + else: + for item in app_iter: + buffer.append(item) + if response: + break + if buffer: + app_iter = chain(buffer, app_iter) + if close_func is not None and app_iter is not app_rv: + app_iter = ClosingIterator(app_iter, close_func) + + return app_iter, response[0], Headers(response[1]) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/testapp.py b/backend/venv/lib/python3.7/site-packages/werkzeug/testapp.py new file mode 100644 index 0000000..8ea23be --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/testapp.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.testapp + ~~~~~~~~~~~~~~~~ + + Provide a small test application that can be used to test a WSGI server + and check it for WSGI compliance. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import base64 +import os +import sys +from textwrap import wrap + +import werkzeug +from .utils import escape +from .wrappers import BaseRequest as Request +from .wrappers import BaseResponse as Response + +logo = Response( + base64.b64decode( + """ +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 +=""" + ), + mimetype="image/png", +) + + +TEMPLATE = u"""\ + +WSGI Information + +
    + +

    WSGI Information

    +

    + This page displays all available information about the WSGI server and + the underlying Python interpreter. +

    Python Interpreter

    + + + + + + +
    Python Version + %(python_version)s +
    Platform + %(platform)s [%(os)s] +
    API Version + %(api_version)s +
    Byteorder + %(byteorder)s +
    Werkzeug Version + %(werkzeug_version)s +
    +

    WSGI Environment

    + %(wsgi_env)s
    +

    Installed Eggs

    +

    + The following python packages were installed on the system as + Python eggs: +

      %(python_eggs)s
    +

    System Path

    +

    + The following paths are the current contents of the load path. The + following entries are looked up for Python packages. Note that not + all items in this path are folders. Gray and underlined items are + entries pointing to invalid resources or used by custom import hooks + such as the zip importer. +

    + Items with a bright background were expanded for display from a relative + path. If you encounter such paths in the output you might want to check + your setup as relative paths are usually problematic in multithreaded + environments. +

      %(sys_path)s
    +
    +""" + + +def iter_sys_path(): + if os.name == "posix": + + def strip(x): + prefix = os.path.expanduser("~") + if x.startswith(prefix): + x = "~" + x[len(prefix) :] + return x + + else: + + def strip(x): + return x + + cwd = os.path.abspath(os.getcwd()) + for item in sys.path: + path = os.path.join(cwd, item or os.path.curdir) + yield strip(os.path.normpath(path)), not os.path.isdir(path), path != item + + +def render_testapp(req): + try: + import pkg_resources + except ImportError: + eggs = () + else: + eggs = sorted(pkg_resources.working_set, key=lambda x: x.project_name.lower()) + python_eggs = [] + for egg in eggs: + try: + version = egg.version + except (ValueError, AttributeError): + version = "unknown" + python_eggs.append( + "
  • %s [%s]" % (escape(egg.project_name), escape(version)) + ) + + wsgi_env = [] + sorted_environ = sorted(req.environ.items(), key=lambda x: repr(x[0]).lower()) + for key, value in sorted_environ: + wsgi_env.append( + "%s%s" + % (escape(str(key)), " ".join(wrap(escape(repr(value))))) + ) + + sys_path = [] + for item, virtual, expanded in iter_sys_path(): + class_ = [] + if virtual: + class_.append("virtual") + if expanded: + class_.append("exp") + sys_path.append( + "%s" + % (' class="%s"' % " ".join(class_) if class_ else "", escape(item)) + ) + + return ( + TEMPLATE + % { + "python_version": "
    ".join(escape(sys.version).splitlines()), + "platform": escape(sys.platform), + "os": escape(os.name), + "api_version": sys.api_version, + "byteorder": sys.byteorder, + "werkzeug_version": werkzeug.__version__, + "python_eggs": "\n".join(python_eggs), + "wsgi_env": "\n".join(wsgi_env), + "sys_path": "\n".join(sys_path), + } + ).encode("utf-8") + + +def test_app(environ, start_response): + """Simple test application that dumps the environment. You can use + it to check if Werkzeug is working properly: + + .. sourcecode:: pycon + + >>> from werkzeug.serving import run_simple + >>> from werkzeug.testapp import test_app + >>> run_simple('localhost', 3000, test_app) + * Running on http://localhost:3000/ + + The application displays important information from the WSGI environment, + the Python interpreter and the installed libraries. + """ + req = Request(environ, populate_request=False) + if req.args.get("resource") == "logo": + response = logo + else: + response = Response(render_testapp(req), mimetype="text/html") + return response(environ, start_response) + + +if __name__ == "__main__": + from .serving import run_simple + + run_simple("localhost", 5000, test_app, use_reloader=True) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/urls.py b/backend/venv/lib/python3.7/site-packages/werkzeug/urls.py new file mode 100644 index 0000000..38e9e5a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/urls.py @@ -0,0 +1,1134 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.urls + ~~~~~~~~~~~~~ + + ``werkzeug.urls`` used to provide several wrapper functions for Python 2 + urlparse, whose main purpose were to work around the behavior of the Py2 + stdlib and its lack of unicode support. While this was already a somewhat + inconvenient situation, it got even more complicated because Python 3's + ``urllib.parse`` actually does handle unicode properly. In other words, + this module would wrap two libraries with completely different behavior. So + now this module contains a 2-and-3-compatible backport of Python 3's + ``urllib.parse``, which is mostly API-compatible. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import os +import re +from collections import namedtuple + +from ._compat import fix_tuple_repr +from ._compat import implements_to_string +from ._compat import make_literal_wrapper +from ._compat import normalize_string_tuple +from ._compat import PY2 +from ._compat import text_type +from ._compat import to_native +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._internal import _decode_idna +from ._internal import _encode_idna +from .datastructures import iter_multi_items +from .datastructures import MultiDict + +# A regular expression for what a valid schema looks like +_scheme_re = re.compile(r"^[a-zA-Z0-9+-.]+$") + +# Characters that are safe in any part of an URL. +_always_safe = frozenset( + bytearray( + b"abcdefghijklmnopqrstuvwxyz" + b"ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"0123456789" + b"-._~" + ) +) + +_hexdigits = "0123456789ABCDEFabcdef" +_hextobyte = dict( + ((a + b).encode(), int(a + b, 16)) for a in _hexdigits for b in _hexdigits +) +_bytetohex = [("%%%02X" % char).encode("ascii") for char in range(256)] + + +_URLTuple = fix_tuple_repr( + namedtuple("_URLTuple", ["scheme", "netloc", "path", "query", "fragment"]) +) + + +class BaseURL(_URLTuple): + """Superclass of :py:class:`URL` and :py:class:`BytesURL`.""" + + __slots__ = () + + def replace(self, **kwargs): + """Return an URL with the same values, except for those parameters + given new values by whichever keyword arguments are specified.""" + return self._replace(**kwargs) + + @property + def host(self): + """The host part of the URL if available, otherwise `None`. The + host is either the hostname or the IP address mentioned in the + URL. It will not contain the port. + """ + return self._split_host()[0] + + @property + def ascii_host(self): + """Works exactly like :attr:`host` but will return a result that + is restricted to ASCII. If it finds a netloc that is not ASCII + it will attempt to idna decode it. This is useful for socket + operations when the URL might include internationalized characters. + """ + rv = self.host + if rv is not None and isinstance(rv, text_type): + try: + rv = _encode_idna(rv) + except UnicodeError: + rv = rv.encode("ascii", "ignore") + return to_native(rv, "ascii", "ignore") + + @property + def port(self): + """The port in the URL as an integer if it was present, `None` + otherwise. This does not fill in default ports. + """ + try: + rv = int(to_native(self._split_host()[1])) + if 0 <= rv <= 65535: + return rv + except (ValueError, TypeError): + pass + + @property + def auth(self): + """The authentication part in the URL if available, `None` + otherwise. + """ + return self._split_netloc()[0] + + @property + def username(self): + """The username if it was part of the URL, `None` otherwise. + This undergoes URL decoding and will always be a unicode string. + """ + rv = self._split_auth()[0] + if rv is not None: + return _url_unquote_legacy(rv) + + @property + def raw_username(self): + """The username if it was part of the URL, `None` otherwise. + Unlike :attr:`username` this one is not being decoded. + """ + return self._split_auth()[0] + + @property + def password(self): + """The password if it was part of the URL, `None` otherwise. + This undergoes URL decoding and will always be a unicode string. + """ + rv = self._split_auth()[1] + if rv is not None: + return _url_unquote_legacy(rv) + + @property + def raw_password(self): + """The password if it was part of the URL, `None` otherwise. + Unlike :attr:`password` this one is not being decoded. + """ + return self._split_auth()[1] + + def decode_query(self, *args, **kwargs): + """Decodes the query part of the URL. Ths is a shortcut for + calling :func:`url_decode` on the query argument. The arguments and + keyword arguments are forwarded to :func:`url_decode` unchanged. + """ + return url_decode(self.query, *args, **kwargs) + + def join(self, *args, **kwargs): + """Joins this URL with another one. This is just a convenience + function for calling into :meth:`url_join` and then parsing the + return value again. + """ + return url_parse(url_join(self, *args, **kwargs)) + + def to_url(self): + """Returns a URL string or bytes depending on the type of the + information stored. This is just a convenience function + for calling :meth:`url_unparse` for this URL. + """ + return url_unparse(self) + + def decode_netloc(self): + """Decodes the netloc part into a string.""" + rv = _decode_idna(self.host or "") + + if ":" in rv: + rv = "[%s]" % rv + port = self.port + if port is not None: + rv = "%s:%d" % (rv, port) + auth = ":".join( + filter( + None, + [ + _url_unquote_legacy(self.raw_username or "", "/:%@"), + _url_unquote_legacy(self.raw_password or "", "/:%@"), + ], + ) + ) + if auth: + rv = "%s@%s" % (auth, rv) + return rv + + def to_uri_tuple(self): + """Returns a :class:`BytesURL` tuple that holds a URI. This will + encode all the information in the URL properly to ASCII using the + rules a web browser would follow. + + It's usually more interesting to directly call :meth:`iri_to_uri` which + will return a string. + """ + return url_parse(iri_to_uri(self).encode("ascii")) + + def to_iri_tuple(self): + """Returns a :class:`URL` tuple that holds a IRI. This will try + to decode as much information as possible in the URL without + losing information similar to how a web browser does it for the + URL bar. + + It's usually more interesting to directly call :meth:`uri_to_iri` which + will return a string. + """ + return url_parse(uri_to_iri(self)) + + def get_file_location(self, pathformat=None): + """Returns a tuple with the location of the file in the form + ``(server, location)``. If the netloc is empty in the URL or + points to localhost, it's represented as ``None``. + + The `pathformat` by default is autodetection but needs to be set + when working with URLs of a specific system. The supported values + are ``'windows'`` when working with Windows or DOS paths and + ``'posix'`` when working with posix paths. + + If the URL does not point to a local file, the server and location + are both represented as ``None``. + + :param pathformat: The expected format of the path component. + Currently ``'windows'`` and ``'posix'`` are + supported. Defaults to ``None`` which is + autodetect. + """ + if self.scheme != "file": + return None, None + + path = url_unquote(self.path) + host = self.netloc or None + + if pathformat is None: + if os.name == "nt": + pathformat = "windows" + else: + pathformat = "posix" + + if pathformat == "windows": + if path[:1] == "/" and path[1:2].isalpha() and path[2:3] in "|:": + path = path[1:2] + ":" + path[3:] + windows_share = path[:3] in ("\\" * 3, "/" * 3) + import ntpath + + path = ntpath.normpath(path) + # Windows shared drives are represented as ``\\host\\directory``. + # That results in a URL like ``file://///host/directory``, and a + # path like ``///host/directory``. We need to special-case this + # because the path contains the hostname. + if windows_share and host is None: + parts = path.lstrip("\\").split("\\", 1) + if len(parts) == 2: + host, path = parts + else: + host = parts[0] + path = "" + elif pathformat == "posix": + import posixpath + + path = posixpath.normpath(path) + else: + raise TypeError("Invalid path format %s" % repr(pathformat)) + + if host in ("127.0.0.1", "::1", "localhost"): + host = None + + return host, path + + def _split_netloc(self): + if self._at in self.netloc: + return self.netloc.split(self._at, 1) + return None, self.netloc + + def _split_auth(self): + auth = self._split_netloc()[0] + if not auth: + return None, None + if self._colon not in auth: + return auth, None + return auth.split(self._colon, 1) + + def _split_host(self): + rv = self._split_netloc()[1] + if not rv: + return None, None + + if not rv.startswith(self._lbracket): + if self._colon in rv: + return rv.split(self._colon, 1) + return rv, None + + idx = rv.find(self._rbracket) + if idx < 0: + return rv, None + + host = rv[1:idx] + rest = rv[idx + 1 :] + if rest.startswith(self._colon): + return host, rest[1:] + return host, None + + +@implements_to_string +class URL(BaseURL): + """Represents a parsed URL. This behaves like a regular tuple but + also has some extra attributes that give further insight into the + URL. + """ + + __slots__ = () + _at = "@" + _colon = ":" + _lbracket = "[" + _rbracket = "]" + + def __str__(self): + return self.to_url() + + def encode_netloc(self): + """Encodes the netloc part to an ASCII safe URL as bytes.""" + rv = self.ascii_host or "" + if ":" in rv: + rv = "[%s]" % rv + port = self.port + if port is not None: + rv = "%s:%d" % (rv, port) + auth = ":".join( + filter( + None, + [ + url_quote(self.raw_username or "", "utf-8", "strict", "/:%"), + url_quote(self.raw_password or "", "utf-8", "strict", "/:%"), + ], + ) + ) + if auth: + rv = "%s@%s" % (auth, rv) + return to_native(rv) + + def encode(self, charset="utf-8", errors="replace"): + """Encodes the URL to a tuple made out of bytes. The charset is + only being used for the path, query and fragment. + """ + return BytesURL( + self.scheme.encode("ascii"), + self.encode_netloc(), + self.path.encode(charset, errors), + self.query.encode(charset, errors), + self.fragment.encode(charset, errors), + ) + + +class BytesURL(BaseURL): + """Represents a parsed URL in bytes.""" + + __slots__ = () + _at = b"@" + _colon = b":" + _lbracket = b"[" + _rbracket = b"]" + + def __str__(self): + return self.to_url().decode("utf-8", "replace") + + def encode_netloc(self): + """Returns the netloc unchanged as bytes.""" + return self.netloc + + def decode(self, charset="utf-8", errors="replace"): + """Decodes the URL to a tuple made out of strings. The charset is + only being used for the path, query and fragment. + """ + return URL( + self.scheme.decode("ascii"), + self.decode_netloc(), + self.path.decode(charset, errors), + self.query.decode(charset, errors), + self.fragment.decode(charset, errors), + ) + + +_unquote_maps = {frozenset(): _hextobyte} + + +def _unquote_to_bytes(string, unsafe=""): + if isinstance(string, text_type): + string = string.encode("utf-8") + + if isinstance(unsafe, text_type): + unsafe = unsafe.encode("utf-8") + + unsafe = frozenset(bytearray(unsafe)) + groups = iter(string.split(b"%")) + result = bytearray(next(groups, b"")) + + try: + hex_to_byte = _unquote_maps[unsafe] + except KeyError: + hex_to_byte = _unquote_maps[unsafe] = { + h: b for h, b in _hextobyte.items() if b not in unsafe + } + + for group in groups: + code = group[:2] + + if code in hex_to_byte: + result.append(hex_to_byte[code]) + result.extend(group[2:]) + else: + result.append(37) # % + result.extend(group) + + return bytes(result) + + +def _url_encode_impl(obj, charset, encode_keys, sort, key): + iterable = iter_multi_items(obj) + if sort: + iterable = sorted(iterable, key=key) + for key, value in iterable: + if value is None: + continue + if not isinstance(key, bytes): + key = text_type(key).encode(charset) + if not isinstance(value, bytes): + value = text_type(value).encode(charset) + yield _fast_url_quote_plus(key) + "=" + _fast_url_quote_plus(value) + + +def _url_unquote_legacy(value, unsafe=""): + try: + return url_unquote(value, charset="utf-8", errors="strict", unsafe=unsafe) + except UnicodeError: + return url_unquote(value, charset="latin1", unsafe=unsafe) + + +def url_parse(url, scheme=None, allow_fragments=True): + """Parses a URL from a string into a :class:`URL` tuple. If the URL + is lacking a scheme it can be provided as second argument. Otherwise, + it is ignored. Optionally fragments can be stripped from the URL + by setting `allow_fragments` to `False`. + + The inverse of this function is :func:`url_unparse`. + + :param url: the URL to parse. + :param scheme: the default schema to use if the URL is schemaless. + :param allow_fragments: if set to `False` a fragment will be removed + from the URL. + """ + s = make_literal_wrapper(url) + is_text_based = isinstance(url, text_type) + + if scheme is None: + scheme = s("") + netloc = query = fragment = s("") + i = url.find(s(":")) + if i > 0 and _scheme_re.match(to_native(url[:i], errors="replace")): + # make sure "iri" is not actually a port number (in which case + # "scheme" is really part of the path) + rest = url[i + 1 :] + if not rest or any(c not in s("0123456789") for c in rest): + # not a port number + scheme, url = url[:i].lower(), rest + + if url[:2] == s("//"): + delim = len(url) + for c in s("/?#"): + wdelim = url.find(c, 2) + if wdelim >= 0: + delim = min(delim, wdelim) + netloc, url = url[2:delim], url[delim:] + if (s("[") in netloc and s("]") not in netloc) or ( + s("]") in netloc and s("[") not in netloc + ): + raise ValueError("Invalid IPv6 URL") + + if allow_fragments and s("#") in url: + url, fragment = url.split(s("#"), 1) + if s("?") in url: + url, query = url.split(s("?"), 1) + + result_type = URL if is_text_based else BytesURL + return result_type(scheme, netloc, url, query, fragment) + + +def _make_fast_url_quote(charset="utf-8", errors="strict", safe="/:", unsafe=""): + """Precompile the translation table for a URL encoding function. + + Unlike :func:`url_quote`, the generated function only takes the + string to quote. + + :param charset: The charset to encode the result with. + :param errors: How to handle encoding errors. + :param safe: An optional sequence of safe characters to never encode. + :param unsafe: An optional sequence of unsafe characters to always encode. + """ + if isinstance(safe, text_type): + safe = safe.encode(charset, errors) + + if isinstance(unsafe, text_type): + unsafe = unsafe.encode(charset, errors) + + safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) + table = [chr(c) if c in safe else "%%%02X" % c for c in range(256)] + + if not PY2: + + def quote(string): + return "".join([table[c] for c in string]) + + else: + + def quote(string): + return "".join([table[c] for c in bytearray(string)]) + + return quote + + +_fast_url_quote = _make_fast_url_quote() +_fast_quote_plus = _make_fast_url_quote(safe=" ", unsafe="+") + + +def _fast_url_quote_plus(string): + return _fast_quote_plus(string).replace(" ", "+") + + +def url_quote(string, charset="utf-8", errors="strict", safe="/:", unsafe=""): + """URL encode a single string with a given encoding. + + :param s: the string to quote. + :param charset: the charset to be used. + :param safe: an optional sequence of safe characters. + :param unsafe: an optional sequence of unsafe characters. + + .. versionadded:: 0.9.2 + The `unsafe` parameter was added. + """ + if not isinstance(string, (text_type, bytes, bytearray)): + string = text_type(string) + if isinstance(string, text_type): + string = string.encode(charset, errors) + if isinstance(safe, text_type): + safe = safe.encode(charset, errors) + if isinstance(unsafe, text_type): + unsafe = unsafe.encode(charset, errors) + safe = (frozenset(bytearray(safe)) | _always_safe) - frozenset(bytearray(unsafe)) + rv = bytearray() + for char in bytearray(string): + if char in safe: + rv.append(char) + else: + rv.extend(_bytetohex[char]) + return to_native(bytes(rv)) + + +def url_quote_plus(string, charset="utf-8", errors="strict", safe=""): + """URL encode a single string with the given encoding and convert + whitespace to "+". + + :param s: The string to quote. + :param charset: The charset to be used. + :param safe: An optional sequence of safe characters. + """ + return url_quote(string, charset, errors, safe + " ", "+").replace(" ", "+") + + +def url_unparse(components): + """The reverse operation to :meth:`url_parse`. This accepts arbitrary + as well as :class:`URL` tuples and returns a URL as a string. + + :param components: the parsed URL as tuple which should be converted + into a URL string. + """ + scheme, netloc, path, query, fragment = normalize_string_tuple(components) + s = make_literal_wrapper(scheme) + url = s("") + + # We generally treat file:///x and file:/x the same which is also + # what browsers seem to do. This also allows us to ignore a schema + # register for netloc utilization or having to differenciate between + # empty and missing netloc. + if netloc or (scheme and path.startswith(s("/"))): + if path and path[:1] != s("/"): + path = s("/") + path + url = s("//") + (netloc or s("")) + path + elif path: + url += path + if scheme: + url = scheme + s(":") + url + if query: + url = url + s("?") + query + if fragment: + url = url + s("#") + fragment + return url + + +def url_unquote(string, charset="utf-8", errors="replace", unsafe=""): + """URL decode a single string with a given encoding. If the charset + is set to `None` no unicode decoding is performed and raw bytes + are returned. + + :param s: the string to unquote. + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param errors: the error handling for the charset decoding. + """ + rv = _unquote_to_bytes(string, unsafe) + if charset is not None: + rv = rv.decode(charset, errors) + return rv + + +def url_unquote_plus(s, charset="utf-8", errors="replace"): + """URL decode a single string with the given `charset` and decode "+" to + whitespace. + + Per default encoding errors are ignored. If you want a different behavior + you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a + :exc:`HTTPUnicodeError` is raised. + + :param s: The string to unquote. + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param errors: The error handling for the `charset` decoding. + """ + if isinstance(s, text_type): + s = s.replace(u"+", u" ") + else: + s = s.replace(b"+", b" ") + return url_unquote(s, charset, errors) + + +def url_fix(s, charset="utf-8"): + r"""Sometimes you get an URL by a user that just isn't a real URL because + it contains unsafe characters like ' ' and so on. This function can fix + some of the problems in a similar way browsers handle data entered by the + user: + + >>> url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') + 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)' + + :param s: the string with the URL to fix. + :param charset: The target charset for the URL if the url was given as + unicode string. + """ + # First step is to switch to unicode processing and to convert + # backslashes (which are invalid in URLs anyways) to slashes. This is + # consistent with what Chrome does. + s = to_unicode(s, charset, "replace").replace("\\", "/") + + # For the specific case that we look like a malformed windows URL + # we want to fix this up manually: + if s.startswith("file://") and s[7:8].isalpha() and s[8:10] in (":/", "|/"): + s = "file:///" + s[7:] + + url = url_parse(s) + path = url_quote(url.path, charset, safe="/%+$!*'(),") + qs = url_quote_plus(url.query, charset, safe=":&%=+$!*'(),") + anchor = url_quote_plus(url.fragment, charset, safe=":&%=+$!*'(),") + return to_native(url_unparse((url.scheme, url.encode_netloc(), path, qs, anchor))) + + +# not-unreserved characters remain quoted when unquoting to IRI +_to_iri_unsafe = "".join([chr(c) for c in range(128) if c not in _always_safe]) + + +def _codec_error_url_quote(e): + """Used in :func:`uri_to_iri` after unquoting to re-quote any + invalid bytes. + """ + out = _fast_url_quote(e.object[e.start : e.end]) + + if PY2: + out = out.decode("utf-8") + + return out, e.end + + +codecs.register_error("werkzeug.url_quote", _codec_error_url_quote) + + +def uri_to_iri(uri, charset="utf-8", errors="werkzeug.url_quote"): + """Convert a URI to an IRI. All valid UTF-8 characters are unquoted, + leaving all reserved and invalid characters quoted. If the URL has + a domain, it is decoded from Punycode. + + >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF") + 'http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF' + + :param uri: The URI to convert. + :param charset: The encoding to encode unquoted bytes with. + :param errors: Error handler to use during ``bytes.encode``. By + default, invalid bytes are left quoted. + + .. versionchanged:: 0.15 + All reserved and invalid characters remain quoted. Previously, + only some reserved characters were preserved, and invalid bytes + were replaced instead of left quoted. + + .. versionadded:: 0.6 + """ + if isinstance(uri, tuple): + uri = url_unparse(uri) + + uri = url_parse(to_unicode(uri, charset)) + path = url_unquote(uri.path, charset, errors, _to_iri_unsafe) + query = url_unquote(uri.query, charset, errors, _to_iri_unsafe) + fragment = url_unquote(uri.fragment, charset, errors, _to_iri_unsafe) + return url_unparse((uri.scheme, uri.decode_netloc(), path, query, fragment)) + + +# reserved characters remain unquoted when quoting to URI +_to_uri_safe = ":/?#[]@!$&'()*+,;=%" + + +def iri_to_uri(iri, charset="utf-8", errors="strict", safe_conversion=False): + """Convert an IRI to a URI. All non-ASCII and unsafe characters are + quoted. If the URL has a domain, it is encoded to Punycode. + + >>> iri_to_uri('http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF') + 'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF' + + :param iri: The IRI to convert. + :param charset: The encoding of the IRI. + :param errors: Error handler to use during ``bytes.encode``. + :param safe_conversion: Return the URL unchanged if it only contains + ASCII characters and no whitespace. See the explanation below. + + There is a general problem with IRI conversion with some protocols + that are in violation of the URI specification. Consider the + following two IRIs:: + + magnet:?xt=uri:whatever + itms-services://?action=download-manifest + + After parsing, we don't know if the scheme requires the ``//``, + which is dropped if empty, but conveys different meanings in the + final URL if it's present or not. In this case, you can use + ``safe_conversion``, which will return the URL unchanged if it only + contains ASCII characters and no whitespace. This can result in a + URI with unquoted characters if it was not already quoted correctly, + but preserves the URL's semantics. Werkzeug uses this for the + ``Location`` header for redirects. + + .. versionchanged:: 0.15 + All reserved characters remain unquoted. Previously, only some + reserved characters were left unquoted. + + .. versionchanged:: 0.9.6 + The ``safe_conversion`` parameter was added. + + .. versionadded:: 0.6 + """ + if isinstance(iri, tuple): + iri = url_unparse(iri) + + if safe_conversion: + # If we're not sure if it's safe to convert the URL, and it only + # contains ASCII characters, return it unconverted. + try: + native_iri = to_native(iri) + ascii_iri = native_iri.encode("ascii") + + # Only return if it doesn't have whitespace. (Why?) + if len(ascii_iri.split()) == 1: + return native_iri + except UnicodeError: + pass + + iri = url_parse(to_unicode(iri, charset, errors)) + path = url_quote(iri.path, charset, errors, _to_uri_safe) + query = url_quote(iri.query, charset, errors, _to_uri_safe) + fragment = url_quote(iri.fragment, charset, errors, _to_uri_safe) + return to_native( + url_unparse((iri.scheme, iri.encode_netloc(), path, query, fragment)) + ) + + +def url_decode( + s, + charset="utf-8", + decode_keys=False, + include_empty=True, + errors="replace", + separator="&", + cls=None, +): + """ + Parse a querystring and return it as :class:`MultiDict`. There is a + difference in key decoding on different Python versions. On Python 3 + keys will always be fully decoded whereas on Python 2, keys will + remain bytestrings if they fit into ASCII. On 2.x keys can be forced + to be unicode by setting `decode_keys` to `True`. + + If the charset is set to `None` no unicode decoding will happen and + raw bytes will be returned. + + Per default a missing value for a key will default to an empty key. If + you don't want that behavior you can set `include_empty` to `False`. + + Per default encoding errors are ignored. If you want a different behavior + you can set `errors` to ``'replace'`` or ``'strict'``. In strict mode a + `HTTPUnicodeError` is raised. + + .. versionchanged:: 0.5 + In previous versions ";" and "&" could be used for url decoding. + This changed in 0.5 where only "&" is supported. If you want to + use ";" instead a different `separator` can be provided. + + The `cls` parameter was added. + + :param s: a string with the query string to decode. + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param decode_keys: Used on Python 2.x to control whether keys should + be forced to be unicode objects. If set to `True` + then keys will be unicode in all cases. Otherwise, + they remain `str` if they fit into ASCII. + :param include_empty: Set to `False` if you don't want empty values to + appear in the dict. + :param errors: the decoding error behavior. + :param separator: the pair separator to be used, defaults to ``&`` + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + """ + if cls is None: + cls = MultiDict + if isinstance(s, text_type) and not isinstance(separator, text_type): + separator = separator.decode(charset or "ascii") + elif isinstance(s, bytes) and not isinstance(separator, bytes): + separator = separator.encode(charset or "ascii") + return cls( + _url_decode_impl( + s.split(separator), charset, decode_keys, include_empty, errors + ) + ) + + +def url_decode_stream( + stream, + charset="utf-8", + decode_keys=False, + include_empty=True, + errors="replace", + separator="&", + cls=None, + limit=None, + return_iterator=False, +): + """Works like :func:`url_decode` but decodes a stream. The behavior + of stream and limit follows functions like + :func:`~werkzeug.wsgi.make_line_iter`. The generator of pairs is + directly fed to the `cls` so you can consume the data while it's + parsed. + + .. versionadded:: 0.8 + + :param stream: a stream with the encoded querystring + :param charset: the charset of the query string. If set to `None` + no unicode decoding will take place. + :param decode_keys: Used on Python 2.x to control whether keys should + be forced to be unicode objects. If set to `True`, + keys will be unicode in all cases. Otherwise, they + remain `str` if they fit into ASCII. + :param include_empty: Set to `False` if you don't want empty values to + appear in the dict. + :param errors: the decoding error behavior. + :param separator: the pair separator to be used, defaults to ``&`` + :param cls: an optional dict class to use. If this is not specified + or `None` the default :class:`MultiDict` is used. + :param limit: the content length of the URL data. Not necessary if + a limited stream is provided. + :param return_iterator: if set to `True` the `cls` argument is ignored + and an iterator over all decoded pairs is + returned + """ + from .wsgi import make_chunk_iter + + pair_iter = make_chunk_iter(stream, separator, limit) + decoder = _url_decode_impl(pair_iter, charset, decode_keys, include_empty, errors) + + if return_iterator: + return decoder + + if cls is None: + cls = MultiDict + + return cls(decoder) + + +def _url_decode_impl(pair_iter, charset, decode_keys, include_empty, errors): + for pair in pair_iter: + if not pair: + continue + s = make_literal_wrapper(pair) + equal = s("=") + if equal in pair: + key, value = pair.split(equal, 1) + else: + if not include_empty: + continue + key = pair + value = s("") + key = url_unquote_plus(key, charset, errors) + if charset is not None and PY2 and not decode_keys: + key = try_coerce_native(key) + yield key, url_unquote_plus(value, charset, errors) + + +def url_encode( + obj, charset="utf-8", encode_keys=False, sort=False, key=None, separator=b"&" +): + """URL encode a dict/`MultiDict`. If a value is `None` it will not appear + in the result string. Per default only values are encoded into the target + charset strings. If `encode_keys` is set to ``True`` unicode keys are + supported too. + + If `sort` is set to `True` the items are sorted by `key` or the default + sorting algorithm. + + .. versionadded:: 0.5 + `sort`, `key`, and `separator` were added. + + :param obj: the object to encode into a query string. + :param charset: the charset of the query string. + :param encode_keys: set to `True` if you have unicode keys. (Ignored on + Python 3.x) + :param sort: set to `True` if you want parameters to be sorted by `key`. + :param separator: the separator to be used for the pairs. + :param key: an optional function to be used for sorting. For more details + check out the :func:`sorted` documentation. + """ + separator = to_native(separator, "ascii") + return separator.join(_url_encode_impl(obj, charset, encode_keys, sort, key)) + + +def url_encode_stream( + obj, + stream=None, + charset="utf-8", + encode_keys=False, + sort=False, + key=None, + separator=b"&", +): + """Like :meth:`url_encode` but writes the results to a stream + object. If the stream is `None` a generator over all encoded + pairs is returned. + + .. versionadded:: 0.8 + + :param obj: the object to encode into a query string. + :param stream: a stream to write the encoded object into or `None` if + an iterator over the encoded pairs should be returned. In + that case the separator argument is ignored. + :param charset: the charset of the query string. + :param encode_keys: set to `True` if you have unicode keys. (Ignored on + Python 3.x) + :param sort: set to `True` if you want parameters to be sorted by `key`. + :param separator: the separator to be used for the pairs. + :param key: an optional function to be used for sorting. For more details + check out the :func:`sorted` documentation. + """ + separator = to_native(separator, "ascii") + gen = _url_encode_impl(obj, charset, encode_keys, sort, key) + if stream is None: + return gen + for idx, chunk in enumerate(gen): + if idx: + stream.write(separator) + stream.write(chunk) + + +def url_join(base, url, allow_fragments=True): + """Join a base URL and a possibly relative URL to form an absolute + interpretation of the latter. + + :param base: the base URL for the join operation. + :param url: the URL to join. + :param allow_fragments: indicates whether fragments should be allowed. + """ + if isinstance(base, tuple): + base = url_unparse(base) + if isinstance(url, tuple): + url = url_unparse(url) + + base, url = normalize_string_tuple((base, url)) + s = make_literal_wrapper(base) + + if not base: + return url + if not url: + return base + + bscheme, bnetloc, bpath, bquery, bfragment = url_parse( + base, allow_fragments=allow_fragments + ) + scheme, netloc, path, query, fragment = url_parse(url, bscheme, allow_fragments) + if scheme != bscheme: + return url + if netloc: + return url_unparse((scheme, netloc, path, query, fragment)) + netloc = bnetloc + + if path[:1] == s("/"): + segments = path.split(s("/")) + elif not path: + segments = bpath.split(s("/")) + if not query: + query = bquery + else: + segments = bpath.split(s("/"))[:-1] + path.split(s("/")) + + # If the rightmost part is "./" we want to keep the slash but + # remove the dot. + if segments[-1] == s("."): + segments[-1] = s("") + + # Resolve ".." and "." + segments = [segment for segment in segments if segment != s(".")] + while 1: + i = 1 + n = len(segments) - 1 + while i < n: + if segments[i] == s("..") and segments[i - 1] not in (s(""), s("..")): + del segments[i - 1 : i + 1] + break + i += 1 + else: + break + + # Remove trailing ".." if the URL is absolute + unwanted_marker = [s(""), s("..")] + while segments[:2] == unwanted_marker: + del segments[1] + + path = s("/").join(segments) + return url_unparse((scheme, netloc, path, query, fragment)) + + +class Href(object): + """Implements a callable that constructs URLs with the given base. The + function can be called with any number of positional and keyword + arguments which than are used to assemble the URL. Works with URLs + and posix paths. + + Positional arguments are appended as individual segments to + the path of the URL: + + >>> href = Href('/foo') + >>> href('bar', 23) + '/foo/bar/23' + >>> href('foo', bar=23) + '/foo/foo?bar=23' + + If any of the arguments (positional or keyword) evaluates to `None` it + will be skipped. If no keyword arguments are given the last argument + can be a :class:`dict` or :class:`MultiDict` (or any other dict subclass), + otherwise the keyword arguments are used for the query parameters, cutting + off the first trailing underscore of the parameter name: + + >>> href(is_=42) + '/foo?is=42' + >>> href({'foo': 'bar'}) + '/foo?foo=bar' + + Combining of both methods is not allowed: + + >>> href({'foo': 'bar'}, bar=42) + Traceback (most recent call last): + ... + TypeError: keyword arguments and query-dicts can't be combined + + Accessing attributes on the href object creates a new href object with + the attribute name as prefix: + + >>> bar_href = href.bar + >>> bar_href("blub") + '/foo/bar/blub' + + If `sort` is set to `True` the items are sorted by `key` or the default + sorting algorithm: + + >>> href = Href("/", sort=True) + >>> href(a=1, b=2, c=3) + '/?a=1&b=2&c=3' + + .. versionadded:: 0.5 + `sort` and `key` were added. + """ + + def __init__(self, base="./", charset="utf-8", sort=False, key=None): + if not base: + base = "./" + self.base = base + self.charset = charset + self.sort = sort + self.key = key + + def __getattr__(self, name): + if name[:2] == "__": + raise AttributeError(name) + base = self.base + if base[-1:] != "/": + base += "/" + return Href(url_join(base, name), self.charset, self.sort, self.key) + + def __call__(self, *path, **query): + if path and isinstance(path[-1], dict): + if query: + raise TypeError("keyword arguments and query-dicts can't be combined") + query, path = path[-1], path[:-1] + elif query: + query = dict( + [(k.endswith("_") and k[:-1] or k, v) for k, v in query.items()] + ) + path = "/".join( + [ + to_unicode(url_quote(x, self.charset), "ascii") + for x in path + if x is not None + ] + ).lstrip("/") + rv = self.base + if path: + if not rv.endswith("/"): + rv += "/" + rv = url_join(rv, "./" + path) + if query: + rv += "?" + to_unicode( + url_encode(query, self.charset, sort=self.sort, key=self.key), "ascii" + ) + return to_native(rv) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/useragents.py b/backend/venv/lib/python3.7/site-packages/werkzeug/useragents.py new file mode 100644 index 0000000..e265e09 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/useragents.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.useragents + ~~~~~~~~~~~~~~~~~~~ + + This module provides a helper to inspect user agent strings. This module + is far from complete but should work for most of the currently available + browsers. + + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import re +import warnings + + +class UserAgentParser(object): + """A simple user agent parser. Used by the `UserAgent`.""" + + platforms = ( + ("cros", "chromeos"), + ("iphone|ios", "iphone"), + ("ipad", "ipad"), + (r"darwin|mac|os\s*x", "macos"), + ("win", "windows"), + (r"android", "android"), + ("netbsd", "netbsd"), + ("openbsd", "openbsd"), + ("freebsd", "freebsd"), + ("dragonfly", "dragonflybsd"), + ("(sun|i86)os", "solaris"), + (r"x11|lin(\b|ux)?", "linux"), + (r"nintendo\s+wii", "wii"), + ("irix", "irix"), + ("hp-?ux", "hpux"), + ("aix", "aix"), + ("sco|unix_sv", "sco"), + ("bsd", "bsd"), + ("amiga", "amiga"), + ("blackberry|playbook", "blackberry"), + ("symbian", "symbian"), + ) + browsers = ( + ("googlebot", "google"), + ("msnbot", "msn"), + ("yahoo", "yahoo"), + ("ask jeeves", "ask"), + (r"aol|america\s+online\s+browser", "aol"), + ("opera", "opera"), + ("edge", "edge"), + ("chrome|crios", "chrome"), + ("seamonkey", "seamonkey"), + ("firefox|firebird|phoenix|iceweasel", "firefox"), + ("galeon", "galeon"), + ("safari|version", "safari"), + ("webkit", "webkit"), + ("camino", "camino"), + ("konqueror", "konqueror"), + ("k-meleon", "kmeleon"), + ("netscape", "netscape"), + (r"msie|microsoft\s+internet\s+explorer|trident/.+? rv:", "msie"), + ("lynx", "lynx"), + ("links", "links"), + ("Baiduspider", "baidu"), + ("bingbot", "bing"), + ("mozilla", "mozilla"), + ) + + _browser_version_re = r"(?:%s)[/\sa-z(]*(\d+[.\da-z]+)?" + _language_re = re.compile( + r"(?:;\s*|\s+)(\b\w{2}\b(?:-\b\w{2}\b)?)\s*;|" + r"(?:\(|\[|;)\s*(\b\w{2}\b(?:-\b\w{2}\b)?)\s*(?:\]|\)|;)" + ) + + def __init__(self): + self.platforms = [(b, re.compile(a, re.I)) for a, b in self.platforms] + self.browsers = [ + (b, re.compile(self._browser_version_re % a, re.I)) + for a, b in self.browsers + ] + + def __call__(self, user_agent): + for platform, regex in self.platforms: # noqa: B007 + match = regex.search(user_agent) + if match is not None: + break + else: + platform = None + for browser, regex in self.browsers: # noqa: B007 + match = regex.search(user_agent) + if match is not None: + version = match.group(1) + break + else: + browser = version = None + match = self._language_re.search(user_agent) + if match is not None: + language = match.group(1) or match.group(2) + else: + language = None + return platform, browser, version, language + + +class UserAgent(object): + """Represents a user agent. Pass it a WSGI environment or a user agent + string and you can inspect some of the details from the user agent + string via the attributes. The following attributes exist: + + .. attribute:: string + + the raw user agent string + + .. attribute:: platform + + the browser platform. The following platforms are currently + recognized: + + - `aix` + - `amiga` + - `android` + - `blackberry` + - `bsd` + - `chromeos` + - `dragonflybsd` + - `freebsd` + - `hpux` + - `ipad` + - `iphone` + - `irix` + - `linux` + - `macos` + - `netbsd` + - `openbsd` + - `sco` + - `solaris` + - `symbian` + - `wii` + - `windows` + + .. attribute:: browser + + the name of the browser. The following browsers are currently + recognized: + + - `aol` * + - `ask` * + - `baidu` * + - `bing` * + - `camino` + - `chrome` + - `edge` + - `firefox` + - `galeon` + - `google` * + - `kmeleon` + - `konqueror` + - `links` + - `lynx` + - `mozilla` + - `msie` + - `msn` + - `netscape` + - `opera` + - `safari` + - `seamonkey` + - `webkit` + - `yahoo` * + + (Browsers marked with a star (``*``) are crawlers.) + + .. attribute:: version + + the version of the browser + + .. attribute:: language + + the language of the browser + """ + + _parser = UserAgentParser() + + def __init__(self, environ_or_string): + if isinstance(environ_or_string, dict): + environ_or_string = environ_or_string.get("HTTP_USER_AGENT", "") + self.string = environ_or_string + self.platform, self.browser, self.version, self.language = self._parser( + environ_or_string + ) + + def to_header(self): + return self.string + + def __str__(self): + return self.string + + def __nonzero__(self): + return bool(self.browser) + + __bool__ = __nonzero__ + + def __repr__(self): + return "<%s %r/%s>" % (self.__class__.__name__, self.browser, self.version) + + +# DEPRECATED +from .wrappers import UserAgentMixin as _UserAgentMixin + + +class UserAgentMixin(_UserAgentMixin): + @property + def user_agent(self, *args, **kwargs): + warnings.warn( + "'werkzeug.useragents.UserAgentMixin' should be imported" + " from 'werkzeug.wrappers.UserAgentMixin'. This old import" + " will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + return super(_UserAgentMixin, self).user_agent diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/utils.py b/backend/venv/lib/python3.7/site-packages/werkzeug/utils.py new file mode 100644 index 0000000..2062057 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/utils.py @@ -0,0 +1,836 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.utils + ~~~~~~~~~~~~~~ + + This module implements various utilities for WSGI applications. Most of + them are used by the request and response wrappers but especially for + middleware development it makes sense to use them without the wrappers. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import codecs +import os +import pkgutil +import re +import sys +import warnings + +from ._compat import iteritems +from ._compat import PY2 +from ._compat import reraise +from ._compat import string_types +from ._compat import text_type +from ._compat import unichr +from ._internal import _DictAccessorProperty +from ._internal import _missing +from ._internal import _parse_signature + +try: + from html.entities import name2codepoint +except ImportError: + from htmlentitydefs import name2codepoint + + +_format_re = re.compile(r"\$(?:(%s)|\{(%s)\})" % (("[a-zA-Z_][a-zA-Z0-9_]*",) * 2)) +_entity_re = re.compile(r"&([^;]+);") +_filename_ascii_strip_re = re.compile(r"[^A-Za-z0-9_.-]") +_windows_device_files = ( + "CON", + "AUX", + "COM1", + "COM2", + "COM3", + "COM4", + "LPT1", + "LPT2", + "LPT3", + "PRN", + "NUL", +) + + +class cached_property(property): + """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:: + + class Foo(object): + + @cached_property + def foo(self): + # calculate something important here + return 42 + + The class has to have a `__dict__` in order for this property to + work. + """ + + # implementation detail: A subclass of python's builtin property + # decorator, we override __get__ to check for a cached value. If one + # chooses to invoke __get__ by hand the property will still work as + # expected because the lookup logic is replicated in __get__ for + # manual invocation. + + 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 + + def __set__(self, obj, value): + obj.__dict__[self.__name__] = value + + def __get__(self, obj, type=None): + if obj is None: + return self + value = obj.__dict__.get(self.__name__, _missing) + if value is _missing: + value = self.func(obj) + obj.__dict__[self.__name__] = value + return value + + +class environ_property(_DictAccessorProperty): + """Maps request attributes to environment variables. This works not only + for the Werzeug request object, but also any other class with an + environ attribute: + + >>> class Test(object): + ... environ = {'key': 'value'} + ... test = environ_property('key') + >>> var = Test() + >>> var.test + 'value' + + If you pass it a second value it's used as default if the key does not + exist, the third one can be a converter that takes a value and converts + it. If it raises :exc:`ValueError` or :exc:`TypeError` the default value + is used. If no default value is provided `None` is used. + + Per default the property is read only. You have to explicitly enable it + by passing ``read_only=False`` to the constructor. + """ + + read_only = True + + def lookup(self, obj): + return obj.environ + + +class header_property(_DictAccessorProperty): + """Like `environ_property` but for headers.""" + + def lookup(self, obj): + return obj.headers + + +class HTMLBuilder(object): + """Helper object for HTML generation. + + Per default there are two instances of that class. The `html` one, and + the `xhtml` one for those two dialects. The class uses keyword parameters + and positional parameters to generate small snippets of HTML. + + Keyword parameters are converted to XML/SGML attributes, positional + arguments are used as children. Because Python accepts positional + arguments before keyword arguments it's a good idea to use a list with the + star-syntax for some children: + + >>> html.p(class_='foo', *[html.a('foo', href='foo.html'), ' ', + ... html.a('bar', href='bar.html')]) + u'

    foo bar

    ' + + This class works around some browser limitations and can not be used for + arbitrary SGML/XML generation. For that purpose lxml and similar + libraries exist. + + Calling the builder escapes the string passed: + + >>> html.p(html("")) + u'

    <foo>

    ' + """ + + _entity_re = re.compile(r"&([^;]+);") + _entities = name2codepoint.copy() + _entities["apos"] = 39 + _empty_elements = { + "area", + "base", + "basefont", + "br", + "col", + "command", + "embed", + "frame", + "hr", + "img", + "input", + "keygen", + "isindex", + "link", + "meta", + "param", + "source", + "wbr", + } + _boolean_attributes = { + "selected", + "checked", + "compact", + "declare", + "defer", + "disabled", + "ismap", + "multiple", + "nohref", + "noresize", + "noshade", + "nowrap", + } + _plaintext_elements = {"textarea"} + _c_like_cdata = {"script", "style"} + + def __init__(self, dialect): + self._dialect = dialect + + def __call__(self, s): + return escape(s) + + def __getattr__(self, tag): + if tag[:2] == "__": + raise AttributeError(tag) + + def proxy(*children, **arguments): + buffer = "<" + tag + for key, value in iteritems(arguments): + if value is None: + continue + if key[-1] == "_": + key = key[:-1] + if key in self._boolean_attributes: + if not value: + continue + if self._dialect == "xhtml": + value = '="' + key + '"' + else: + value = "" + else: + value = '="' + escape(value) + '"' + buffer += " " + key + value + if not children and tag in self._empty_elements: + if self._dialect == "xhtml": + buffer += " />" + else: + buffer += ">" + return buffer + buffer += ">" + + children_as_string = "".join( + [text_type(x) for x in children if x is not None] + ) + + if children_as_string: + if tag in self._plaintext_elements: + children_as_string = escape(children_as_string) + elif tag in self._c_like_cdata and self._dialect == "xhtml": + children_as_string = ( + "/**/" + ) + buffer += children_as_string + "" + return buffer + + return proxy + + def __repr__(self): + return "<%s for %r>" % (self.__class__.__name__, self._dialect) + + +html = HTMLBuilder("html") +xhtml = HTMLBuilder("xhtml") + +# https://cgit.freedesktop.org/xdg/shared-mime-info/tree/freedesktop.org.xml.in +# https://www.iana.org/assignments/media-types/media-types.xhtml +# Types listed in the XDG mime info that have a charset in the IANA registration. +_charset_mimetypes = { + "application/ecmascript", + "application/javascript", + "application/sql", + "application/xml", + "application/xml-dtd", + "application/xml-external-parsed-entity", +} + + +def get_content_type(mimetype, charset): + """Returns the full content type string with charset for a mimetype. + + If the mimetype represents text, the charset parameter will be + appended, otherwise the mimetype is returned unchanged. + + :param mimetype: The mimetype to be used as content type. + :param charset: The charset to be appended for text mimetypes. + :return: The content type. + + .. verionchanged:: 0.15 + Any type that ends with ``+xml`` gets a charset, not just those + that start with ``application/``. Known text types such as + ``application/javascript`` are also given charsets. + """ + if ( + mimetype.startswith("text/") + or mimetype in _charset_mimetypes + or mimetype.endswith("+xml") + ): + mimetype += "; charset=" + charset + + return mimetype + + +def detect_utf_encoding(data): + """Detect which UTF encoding 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. + + :internal: + + :param data: Bytes in unknown UTF encoding. + :return: UTF encoding name + + .. versionadded:: 0.15 + """ + 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 format_string(string, context): + """String-template format a string: + + >>> format_string('$foo and ${foo}s', dict(foo=42)) + '42 and 42s' + + This does not do any attribute lookup etc. For more advanced string + formattings have a look at the `werkzeug.template` module. + + :param string: the format string. + :param context: a dict with the variables to insert. + """ + + def lookup_arg(match): + x = context[match.group(1) or match.group(2)] + if not isinstance(x, string_types): + x = type(string)(x) + return x + + return _format_re.sub(lookup_arg, string) + + +def secure_filename(filename): + r"""Pass it a filename and it will return a secure version of it. This + filename can then safely be stored on a regular file system and passed + to :func:`os.path.join`. The filename returned is an ASCII only string + for maximum portability. + + On windows systems the function also makes sure that the file is not + named after one of the special device files. + + >>> secure_filename("My cool movie.mov") + 'My_cool_movie.mov' + >>> secure_filename("../../../etc/passwd") + 'etc_passwd' + >>> secure_filename(u'i contain cool \xfcml\xe4uts.txt') + 'i_contain_cool_umlauts.txt' + + The function might return an empty filename. It's your responsibility + to ensure that the filename is unique and that you abort or + generate a random filename if the function returned an empty one. + + .. versionadded:: 0.5 + + :param filename: the filename to secure + """ + if isinstance(filename, text_type): + from unicodedata import normalize + + filename = normalize("NFKD", filename).encode("ascii", "ignore") + if not PY2: + filename = filename.decode("ascii") + for sep in os.path.sep, os.path.altsep: + if sep: + filename = filename.replace(sep, " ") + filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip( + "._" + ) + + # on nt a couple of special files are present in each folder. We + # have to ensure that the target file is not such a filename. In + # this case we prepend an underline + if ( + os.name == "nt" + and filename + and filename.split(".")[0].upper() in _windows_device_files + ): + filename = "_" + filename + + return filename + + +def escape(s, quote=None): + """Replace special characters "&", "<", ">" and (") to HTML-safe sequences. + + There is a special handling for `None` which escapes to an empty string. + + .. versionchanged:: 0.9 + `quote` is now implicitly on. + + :param s: the string to escape. + :param quote: ignored. + """ + if s is None: + return "" + elif hasattr(s, "__html__"): + return text_type(s.__html__()) + elif not isinstance(s, string_types): + s = text_type(s) + if quote is not None: + from warnings import warn + + warn( + "The 'quote' parameter is no longer used as of version 0.9" + " and will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + s = ( + s.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace('"', """) + ) + return s + + +def unescape(s): + """The reverse function of `escape`. This unescapes all the HTML + entities, not only the XML entities inserted by `escape`. + + :param s: the string to unescape. + """ + + def handle_match(m): + name = m.group(1) + if name in HTMLBuilder._entities: + return unichr(HTMLBuilder._entities[name]) + try: + if name[:2] in ("#x", "#X"): + return unichr(int(name[2:], 16)) + elif name.startswith("#"): + return unichr(int(name[1:])) + except ValueError: + pass + return u"" + + return _entity_re.sub(handle_match, s) + + +def redirect(location, code=302, Response=None): + """Returns a response object (a WSGI application) that, if called, + redirects the client to the target location. Supported codes are + 301, 302, 303, 305, 307, and 308. 300 is not supported because + it's not a real redirect and 304 because it's the answer for a + request with a request with defined If-Modified-Since headers. + + .. versionadded:: 0.6 + The location can now be a unicode string that is encoded using + the :func:`iri_to_uri` function. + + .. versionadded:: 0.10 + The class used for the Response object can now be passed in. + + :param location: the location the response should redirect to. + :param code: the redirect status code. defaults to 302. + :param class Response: a Response class to use when instantiating a + response. The default is :class:`werkzeug.wrappers.Response` if + unspecified. + """ + if Response is None: + from .wrappers import Response + + display_location = escape(location) + if isinstance(location, text_type): + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). + from .urls import iri_to_uri + + location = iri_to_uri(location, safe_conversion=True) + response = Response( + '\n' + "Redirecting...\n" + "

    Redirecting...

    \n" + "

    You should be redirected automatically to target URL: " + '%s. If not click the link.' + % (escape(location), display_location), + code, + mimetype="text/html", + ) + response.headers["Location"] = location + return response + + +def append_slash_redirect(environ, code=301): + """Redirects to the same URL but with a slash appended. The behavior + of this function is undefined if the path ends with a slash already. + + :param environ: the WSGI environment for the request that triggers + the redirect. + :param code: the status code for the redirect. + """ + new_path = environ["PATH_INFO"].strip("/") + "/" + query_string = environ.get("QUERY_STRING") + if query_string: + new_path += "?" + query_string + return redirect(new_path, code) + + +def import_string(import_name, silent=False): + """Imports an object based on a string. This is useful if you want to + use import paths as endpoints or something similar. An import path can + be specified either in dotted notation (``xml.sax.saxutils.escape``) + or with a colon as object delimiter (``xml.sax.saxutils:escape``). + + If `silent` is True the return value will be `None` if the import fails. + + :param import_name: the dotted name for the object to import. + :param silent: if set to `True` import errors are ignored and + `None` is returned instead. + :return: imported object + """ + # force the import name to automatically convert to strings + # __import__ is not able to handle unicode strings in the fromlist + # if the module is a package + import_name = str(import_name).replace(":", ".") + try: + try: + __import__(import_name) + except ImportError: + if "." not in import_name: + raise + else: + return sys.modules[import_name] + + module_name, obj_name = import_name.rsplit(".", 1) + module = __import__(module_name, globals(), locals(), [obj_name]) + try: + return getattr(module, obj_name) + except AttributeError as e: + raise ImportError(e) + + except ImportError as e: + if not silent: + reraise( + ImportStringError, ImportStringError(import_name, e), sys.exc_info()[2] + ) + + +def find_modules(import_path, include_packages=False, recursive=False): + """Finds all the modules below a package. This can be useful to + automatically import all views / controllers so that their metaclasses / + function decorators have a chance to register themselves on the + application. + + Packages are not returned unless `include_packages` is `True`. This can + also recursively list modules but in that case it will import all the + packages to get the correct load path of that module. + + :param import_path: the dotted name for the package to find child modules. + :param include_packages: set to `True` if packages should be returned, too. + :param recursive: set to `True` if recursion should happen. + :return: generator + """ + module = import_string(import_path) + path = getattr(module, "__path__", None) + if path is None: + raise ValueError("%r is not a package" % import_path) + basename = module.__name__ + "." + for _importer, modname, ispkg in pkgutil.iter_modules(path): + modname = basename + modname + if ispkg: + if include_packages: + yield modname + if recursive: + for item in find_modules(modname, include_packages, True): + yield item + else: + yield modname + + +def validate_arguments(func, args, kwargs, drop_extra=True): + """Checks if the function accepts the arguments and keyword arguments. + Returns a new ``(args, kwargs)`` tuple that can safely be passed to + the function without causing a `TypeError` because the function signature + is incompatible. If `drop_extra` is set to `True` (which is the default) + any extra positional or keyword arguments are dropped automatically. + + The exception raised provides three attributes: + + `missing` + A set of argument names that the function expected but where + missing. + + `extra` + A dict of keyword arguments that the function can not handle but + where provided. + + `extra_positional` + A list of values that where given by positional argument but the + function cannot accept. + + This can be useful for decorators that forward user submitted data to + a view function:: + + from werkzeug.utils import ArgumentValidationError, validate_arguments + + def sanitize(f): + def proxy(request): + data = request.values.to_dict() + try: + args, kwargs = validate_arguments(f, (request,), data) + except ArgumentValidationError: + raise BadRequest('The browser failed to transmit all ' + 'the data expected.') + return f(*args, **kwargs) + return proxy + + :param func: the function the validation is performed against. + :param args: a tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :param drop_extra: set to `False` if you don't want extra arguments + to be silently dropped. + :return: tuple in the form ``(args, kwargs)``. + """ + parser = _parse_signature(func) + args, kwargs, missing, extra, extra_positional = parser(args, kwargs)[:5] + if missing: + raise ArgumentValidationError(tuple(missing)) + elif (extra or extra_positional) and not drop_extra: + raise ArgumentValidationError(None, extra, extra_positional) + return tuple(args), kwargs + + +def bind_arguments(func, args, kwargs): + """Bind the arguments provided into a dict. When passed a function, + a tuple of arguments and a dict of keyword arguments `bind_arguments` + returns a dict of names as the function would see it. This can be useful + to implement a cache decorator that uses the function arguments to build + the cache key based on the values of the arguments. + + :param func: the function the arguments should be bound for. + :param args: tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :return: a :class:`dict` of bound keyword arguments. + """ + ( + args, + kwargs, + missing, + extra, + extra_positional, + arg_spec, + vararg_var, + kwarg_var, + ) = _parse_signature(func)(args, kwargs) + values = {} + for (name, _has_default, _default), value in zip(arg_spec, args): + values[name] = value + if vararg_var is not None: + values[vararg_var] = tuple(extra_positional) + elif extra_positional: + raise TypeError("too many positional arguments") + if kwarg_var is not None: + multikw = set(extra) & set([x[0] for x in arg_spec]) + if multikw: + raise TypeError( + "got multiple values for keyword argument " + repr(next(iter(multikw))) + ) + values[kwarg_var] = extra + elif extra: + raise TypeError("got unexpected keyword argument " + repr(next(iter(extra)))) + return values + + +class ArgumentValidationError(ValueError): + + """Raised if :func:`validate_arguments` fails to validate""" + + def __init__(self, missing=None, extra=None, extra_positional=None): + self.missing = set(missing or ()) + self.extra = extra or {} + self.extra_positional = extra_positional or [] + ValueError.__init__( + self, + "function arguments invalid. (%d missing, %d additional)" + % (len(self.missing), len(self.extra) + len(self.extra_positional)), + ) + + +class ImportStringError(ImportError): + """Provides information about a failed :func:`import_string` attempt.""" + + #: String in dotted notation that failed to be imported. + import_name = None + #: Wrapped exception. + exception = None + + def __init__(self, import_name, exception): + self.import_name = import_name + self.exception = exception + + msg = ( + "import_string() failed for %r. Possible reasons are:\n\n" + "- missing __init__.py in a package;\n" + "- package or module path not included in sys.path;\n" + "- duplicated package or module name taking precedence in " + "sys.path;\n" + "- missing module, class, function or variable;\n\n" + "Debugged import:\n\n%s\n\n" + "Original exception:\n\n%s: %s" + ) + + name = "" + tracked = [] + for part in import_name.replace(":", ".").split("."): + name += (name and ".") + part + imported = import_string(name, silent=True) + if imported: + tracked.append((name, getattr(imported, "__file__", None))) + else: + track = ["- %r found in %r." % (n, i) for n, i in tracked] + track.append("- %r not found." % name) + msg = msg % ( + import_name, + "\n".join(track), + exception.__class__.__name__, + str(exception), + ) + break + + ImportError.__init__(self, msg) + + def __repr__(self): + return "<%s(%r, %r)>" % ( + self.__class__.__name__, + self.import_name, + self.exception, + ) + + +# DEPRECATED +from .datastructures import CombinedMultiDict as _CombinedMultiDict +from .datastructures import EnvironHeaders as _EnvironHeaders +from .datastructures import Headers as _Headers +from .datastructures import MultiDict as _MultiDict +from .http import dump_cookie as _dump_cookie +from .http import parse_cookie as _parse_cookie + + +class MultiDict(_MultiDict): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.utils.MultiDict' has moved to 'werkzeug" + ".datastructures.MultiDict' as of version 0.5. This old" + " import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(MultiDict, self).__init__(*args, **kwargs) + + +class CombinedMultiDict(_CombinedMultiDict): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.utils.CombinedMultiDict' has moved to 'werkzeug" + ".datastructures.CombinedMultiDict' as of version 0.5. This" + " old import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(CombinedMultiDict, self).__init__(*args, **kwargs) + + +class Headers(_Headers): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.utils.Headers' has moved to 'werkzeug" + ".datastructures.Headers' as of version 0.5. This old" + " import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(Headers, self).__init__(*args, **kwargs) + + +class EnvironHeaders(_EnvironHeaders): + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.utils.EnvironHeaders' has moved to 'werkzeug" + ".datastructures.EnvironHeaders' as of version 0.5. This" + " old import will be removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(EnvironHeaders, self).__init__(*args, **kwargs) + + +def parse_cookie(*args, **kwargs): + warnings.warn( + "'werkzeug.utils.parse_cookie' as moved to 'werkzeug.http" + ".parse_cookie' as of version 0.5. This old import will be" + " removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + return _parse_cookie(*args, **kwargs) + + +def dump_cookie(*args, **kwargs): + warnings.warn( + "'werkzeug.utils.dump_cookie' as moved to 'werkzeug.http" + ".dump_cookie' as of version 0.5. This old import will be" + " removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + return _dump_cookie(*args, **kwargs) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py new file mode 100644 index 0000000..56c764a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__init__.py @@ -0,0 +1,36 @@ +""" +werkzeug.wrappers +~~~~~~~~~~~~~~~~~ + +The wrappers are simple request and response objects which you can +subclass to do whatever you want them to do. The request object contains +the information transmitted by the client (webbrowser) and the response +object contains all the information sent back to the browser. + +An important detail is that the request object is created with the WSGI +environ and will act as high-level proxy whereas the response object is an +actual WSGI application. + +Like everything else in Werkzeug these objects will work correctly with +unicode data. Incoming form data parsed by the response object will be +decoded into an unicode object if possible and if it makes sense. + +:copyright: 2007 Pallets +:license: BSD-3-Clause +""" +from .accept import AcceptMixin +from .auth import AuthorizationMixin +from .auth import WWWAuthenticateMixin +from .base_request import BaseRequest +from .base_response import BaseResponse +from .common_descriptors import CommonRequestDescriptorsMixin +from .common_descriptors import CommonResponseDescriptorsMixin +from .etag import ETagRequestMixin +from .etag import ETagResponseMixin +from .request import PlainRequest +from .request import Request +from .request import StreamOnlyMixin +from .response import Response +from .response import ResponseStream +from .response import ResponseStreamMixin +from .user_agent import UserAgentMixin diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..843b9a23d09c104c66aafcbb53b625b819091849 GIT binary patch literal 1690 zcmaJ>&2Aev5SDD&l2?D0>?C!H7IUl*^14m}Cq`S;PKqKxe}dSBfCY*LcbC%A=8{{I zlA;{?K7ErugRVWbkI++xToFo*qAQ5_IGp)7^9{+XZa1jm_wkpHf6jMmwLk2{e_IH? z#=rg@hpZOWvU;|~>%~^IRkwJXZx@ZI;cx@-PPF6j4&N=BQPbgF-YWK@J%^h-DB4lm z;TGaf)Ny!^cZ*)sb2vcUkNOU``F=5o1`c-+52K;OUBm~`fx|t1SUiXxINV44FnZ|l zKH^8wBZmk4qv9w!LOi^#9UqXtu&`i3)!lnKo1QEbDNCw!@az3A2ySu;ejSLSpjlCJ z3X1+RquKxw8Dd>Zp()7ZmZnC-B4=q1OF4s-h(OPhloPGNNXR5E5<}-yx%CAR224(i zYVicXZs^G?K1ii7gb5v>BQPAX!=-NI9cO`PqUdiINLV)v?Rb zuK7HJd%Qq6cflWWYfF=m^v-5xqt|pNL2xMmMUcwa;7Un$frH@OgqF8hW z3ubcXGQR%ybwI_ODJ;WkxL}wANl{P@Ih*Dqjv8?&m3+5E$tV)o9X3U*#kL!x#uzyx z94swhGdWA0LYVA#?2dxfduehera(D1iU}C6yKhN9Y@N+xA=MqKt`v5Y>)0CFxd-jeAoDMH%CYOr6cT#!l;dnf@3)p@uBK7w6718uMw z8=-385OoriDOQzE3g6RO)LomZBGj(64e|7#TyeG$N;NG>3x`z$@6=T7*|~k2S542? zwx*69y4K$EhfMXXt#5~YyAWX8RZMLDYJi5{YU;=?+Tm{#mWs`>wc(toa3XnzZ(mrb zFu9H6=lYpApJz|gxSXGzn#uF&t>T|gp1pVx-h?G9NB9mIJZ>X;jy)*ZS?DiP=-<=O izn5VgGr>$8pOnj0>x)8WGfuxc#2hr>(5QF*_xBID(-{5$ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb0dd1b1936bb06564dae07aced625670260b54a GIT binary patch literal 2219 zcmb_dTW=dh6yA&1w>U{f5f2oJc>_PxTPmWq5um!pq>+*kwLz6uLX*kP*xqz+otbrr zg?LGS2t4u!_yzomeL~`izrYh`W-qppQB;Ysc6{ctGv|EY`OZGu-tHRE?tS^;_kT1E z<4-lHS_6!y@Q73Bs6oxph)mBkm2H7-d6u?qux-!Qb|Y*=j^}9G37b*NYnjG@L7TMo z)}SrczOlUyZND`7oxdzNwr}R!qZ#3X$)WGFRKmp05s9Z6nX-DOdwh62u19xMwI36` zAI}(}jKgcYKJjOa;*=*T%(uX9(~h2R(=PbFm2VZ^90xxH@#6O(ij;vS2}gcNgkS<)1#*T+jP{9?eEEoO8dqF0IWrF6bOlu2}B+-d7VPUaux^(KVY$htI{;#aBu0a zitbjQmn>I)7p|$7y)A_X9*#!i)3bhqJK$K}DsjwhfQ>7sArBgYg_Bo?i0sv&r6*C+?Y>2I>7E781y~ z&mNH=PJ@T;s}gOug5AC1B!zSnZo$(az0U6xCa#g$1y6*^cEeeGR1l*RXYlWh@5sTM ziUYq;(EmWenie;(aCe0TJbFHS@p4?T!P^iZ@2IX&Hdm!Z(@=Ch80NcW%$3U@z@$*j z8IENx?rlJ)+PN8=JMiXeg5H=qJ%6j9VX>dkAfB#cQ#c_82#xD?&@U+@CmD~lCRE}P z&XAu(DTqo0NsN{Uip&Rv3p8B>DV+3;5`RU+jLaDv7beMT(0F}VSq#=OIA6)~_gC>9 zpNzi!`tanSZ|ihl0^Bz@Vp}C%?c&D@T%CB$jfq!p+>GsiiJzz%Q2`v5#d;&a?VyX&xk*sCJfaT>(!7aW>6D!dG9pwI~%C zx%5WmglgUzRY${sp2+pa0_2Ggr6wBv=}-dhE1iS-g?sS)5OP^!`I#5+p619ovKM(iDyNis$z1bQr?12$yq1~x1EO7 zYxO$4ww^!fcfFnUuZ~6ve*kfrTh{;p literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a10f2e21eda9f7b3f49a941be4c13056771fe5f GIT binary patch literal 1706 zcmbW1&u`pB6vt<5@2(RzZ3q>r0!S7ThpiMFDypVY8Z~erJ&+<;6v+~roqA@oPQA97 zncbzUEtf>VpFxit_=kMu#J|9a_r~$E8+t&DHBa-)GvD{#XXdl5txW>uy~n%X{p1ny z2X>kQeewjVJ^>?$pcxs{m{M#z&~{?Sw%yDfd$C8!7esiXbwxx=wl3Yc4gI$0K)+-A z9pQgNdK-T_uw9QM*g$lcEXd9 z6s%N5DV2Gdz^=>ULhA`s{XQ5;Vk$`N2pYT66OM4N$R&+i!UH+2YUg-W!I$X|X+Hn` zSO^{PJUHOSsDr_p$U)GY8JH0_fs&Fbi@) zex-uGrmv`R7W9&W%g+2>A9UW-Q|}n0`LzeZuu$VL-Z|;_zhcMV_D`OD{WL!AKYe!E zbE}Tbr>QFP$~~7x*^D}sr)4&*+O=c95rt^|RYs*sr;xg6%2hNhGRUuv#wvP#!Pvfj zkUyM?PZL&7?|*ED`{x%b`(*gw(W9szm1((`=GyQq+mjD@nwRPQ=D)&kRpY8CjN=h%_|&FY=AvorLdxehh0M>VYttT*q>Dz8Pr zfmdA?xdt$6hL-psI!)CdLg!~P1bBpV<-el8)F`=tk^?9qOb)>0%_9pF2-{m#w&WXl z;%h`Lk3(wlxObrH5X^$;yTTsyqOI=Yfr36J`Obo7#JD)xX8|T(tu`s}35B1PoXu7!kFB2Cq<~&q_m&*IvYTVTDG- zh}Ufc;UE1ceSo>zf`8O4G`G=ggQ@)HX;b)otk8@?ltub&XxWq@`91}tapbh;SKi2& q(mn>(o2oT2X{PNBsoFJc7JvK0oA$2!!}_`%AsaUCT?(JOz4bR)e#w&n literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43930411b5b42ae80848612d8c6b3dd8f9a547af GIT binary patch literal 22675 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ʉm-e% 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/json.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/json.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6af2d5187638c1165ddae0e3b804c5d1dc8985be GIT binary patch literal 4321 zcmbtX&668P6`wCjqgm~G?U+;n3k(5b%UMe%B-j>UTyf&WP!TD1gN+Ip%}%#gvpbqm zx?5{YXmf~tqmsWMhutGpT)A=J@0cs6`~_6GIPiNt`r5^Y1EcEJ>yLT;-s|^%@69{w z>z;wQhzG+=sP!~F!PmL4% z)YvKJoP!ePuB!4BhheTVh4C?SN4eNnJuPOvr^aUx38xmOCGR{NUZ(mP+K6ekenwgm567pxe)@yRhGT zLSzDFGqXP%;uTCkA2x>~J_5hyQ7D?dEMZ*8=0G&}4uas8d^^2)#NLX6;nABnRPWaQ zfk=MXd;9k7=5BKs53g(ClH@wS8OG@_ezWkN3H|Coo@&$Ux?xfW((d1j`rq&5;%B)k%ENFXb9GHud z!%9Re>%g9xJ#%V(fqSTz+qozCFchK6gsfZ7&F$xAE3eE%%c~L&7##Ak+^svbRn1n! z*KlNB3P_v0#72XmtlPOAB{H|Oy@T93e5?&ybeFMNd<)&T(Inji>AGRo%*n-7Ej6Eo zdy$INw2Ie26z&DL*-{oc(lPoIdupAU$A*H7O${h!YQ@ZUy)3GDCok=d6_=t+beVC) z1{Yg;A<05UQkzovG~v!8=e*?K!|D&vW|DiBYkJmM$u+Mw0tIfHh65f1xfcWj9WS73 zLGZ~aOlB)JxU!0)0ayKu6_#9!l2FRo3|UIhp(}!rmkMpi3Mc@ZAxS0ItgY87g61N$ z#Y1+xizeIX=JC$Vj?JA;iI>|EF!!15UGbJU|&f}%=cor{>8OVWC%KrCWIm}YYyT0bfWy902Jm~pd2{cVO z`D-`uV+j#(3rRx4C>jq1?{Oh8&W^b7KN{n5(ks&68^wu2gcoPyMq6FY#4j#)c0!}! z2g?&$eqX7fY&Dz9xrX2&Q+>{|NH*fE$=3VhrkAg!B| zzwY*VVPvMQ>XVKAxHmWX0I*2;p$qL;91(lHPoF?`zS^2^X?1}|3GIoqRD)7?+m{@- zM^4!4#!|<2w?0#l-o6KW$@zwTu8JN0<5>0m87}yt*dGmes$hD0g&qK{JKqi3kv!?G zcs4n8?vPFIkjfh1DwBbA^M-SC|)U*PB2Qjt9mR7;~ItgE0 zj&`7yyoNPPUSm)Wls&bX^|^WMj5jfIPD)b;`J{xJt_Ri2Q2j5aaa=Zy$p=$QOc>U{ z|4ZWkJL|Y|>`p7wQV*FZFw)mxp31aL@2~7}kE_$tv|8+WNJ-i}E`M5nWS~0Sd_>az z4eK)=(-O>Thp*#SK6*Kt7O+Oa1!z0t(kw&Frx_q^h5-LJ0BqxcST5p0a5WOC^t;`5 zmhx_Q1s@;_WdPKkelLs@xjn~JUTiQ42J8rj4Du?%!$x@R3%-)=0^E6UeOM118Ub;Q9Xi9i(pJ47!Xhps*Pc$=K2sU2q zMeVwM|Nd@$L%dGhu24tUpI3qaB~cLQ8dlt!GnsXp(GfMuxF1?50NIYg|ZgG^C27=}uJ zH|E~bw1s&}BL#HRpA;Q$S>Y9*6>AUlSG$fVEq`7vOk5~PhrdYX-2G`$P~M>eP`-+; UhSW{pgZLpb=zD3y-u%wL0rQ=LF8}}l literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bfe1d2da223c8c4145017f3f9cefd3b34d3d22c GIT binary patch literal 1825 zcmah~Uys{F5VvFJzmq#vs){H``v#G?q*PSxMSyw*ig@5a^bnFOG`)f?PiALlXLe?OGkG=`^c;NdfA;Rr)28G6X%^e3i_BB} z)bB``!(8DcZs@v(Z-_?Xg`VX-;U~?oX?b6?l6Kg(d{cCiZrHVaOZ1X{*ms?;9oA-@ z-yGI~Cb-arK6uc+>4X99bXgB~dN8>0!Xd8vEWmXDLkMpC@Q4jwIHTcTE?#Hkmi@Ch zhFpKkf8{AI@0=BSl}Ub0HP6zmwEv7M_yJxOpfoDI|3#K0Sy~Ie1Qko3>rASx{_$5A zbXjk2Wy2p8$g?G+m9H4x?;dlPr}(L3B;bTDbHWC5LytA^u3p)$ZBdDu&kG^Q0;nz| zFe0m4k!*emu_ipp1tjQ%r%R$&Ko*%0*~Y9A6QY{-dIX;nGK~dQYC7ACe}>wUP@534 z0?I&=oJxhK4-Os1SDge+mxQK_#56|Nah7VC39>?wc+k_b14RgOVn zAr9QXS)}UtO6#0Ztl-;x{%7GT8?miz9lo-T&qsdQiK3Jy5JhD#ijs^K!tg;9y(*}v zciK_JvN($VaO40BY02Mel1sj(8YXKhCs+>5s+uHnGQW(XC+bo9c+EbEqkR4FfnGdW zUP|%t;?e2p-bmx?P3WcmRj@SBAJ6M~PYWDbZKuuwaI zqF!-DHXOkkBLbF{&YZ63nrG7HHCqs_iOvY)ip~Y>szz`J%_dv)jS0Ch)@nUv+*u1# zsXueMGiPJUSz0i_Z%U%3{*qbK7y%N#ij=1%)7`i~*ZY$%FB!wS4jXeAJSr4AP88**7FW65gu=i5S&1 zV!Htn-rdktM<(=Y%XA;Gf6-KNLu2R&$$k7(3rVN#H+ z;W*iFoQ8!arVlyAv9nhc?DCw>x!{_E`rl+=58alETSGIK{m_JF(d$dIJ|7*It!gw$ zBQAZ@=h8zq4CXkVqZ)qFH=;XL8}H>-N&IKRV`fN6le4mCrcGq0jclX9c1hW)CaKM( g^?chE%g(3O4EWrPZuK6Lz}>xG&u#49R&YG{2bie;DF6Tf literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f160d079ad7793c7c9baf0a79c9defa59a2f528 GIT binary patch literal 3336 zcma)8TXP#V6yBTdjbpoM8w$M)2nqwHBrY8~ZNp{KrY&>^0@G#)vooE|dL`SN?yZtG zX*}kI^p*dRKJqL01^j`1<%z$*6X$5XPV6KtYwN6}J(7;j`Of8Dvsu^Rx%~B|rx)im z?Qa~Ej}4twXyOGBs!=`EBHht-jT+PpjmUIN)we<`syG$ZuY}d8=G0Wb8rspEGpB3c zYP3e}mm0NMecyEEVLV6cFs`d{1IF{T0pkX%usPOXHD>PDoF;8P(b}zl3^=~6=VyG+ zA28~sJV_asd;jRg{Nm>3=G{yVSS$nIlkA7!MGymjGGU1|JarVK6*Dt@TNgs}wJSOy3p^0CBFwN1a<``6WOlmk5HL3Mdb1Jk#tMINC zH+E{pO&zeqjO8^r}95`|(&eh2fS< zuBp2tx4Qd1=!~>&jklyu^?m&}(7?8_4QQg~@8D%>WE@x{{Z%=t98{@AwO59&$=V3k zfVL{@!z+(EKN55bPX;dNqSK7@NTo#LrGgq+Z8H;_ES5XZy&1(bZp^kGiP14*9S==`GJZ@6i!A+D|3er@w zyBt8W2wi~&Lp|Ag3w{gwaB)UoigltabhnAJuE5~Mg^_+=d)oTd7-V=DK;^b)$r4A@&=t z`#kf)@t2zG(!_^p3m6!0!Pd%$_(kkpLUI`ix(R;|NN$(em%op5=+Z|BdOXMbVH2o8 z+p-MHur1q$W zLCq5+nIPY7Z2WYjJS?Dhc(;=Z^{bgCD?lp{ hse?`eU2cC>#Jz72TH+lb4SoDG7nT+pb=?^M{sV7{NooK9 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7393f102adc7a07456f62ab42134be86532cfe56 GIT binary patch literal 853 zcmYjP&2AGh5Vm(WO&XFBBoIgdAt>B%5w_x3+gfqrxS; z4DY~^r`RheUV#%c-XwG+kL;Q8H{X2ro4vg*0ekZ5@#mkEkl%RNSOA+dScZX)B-!%Uxs-+pHY_2|1tx|}SgVs!X%(|Mvs1;i zx-ONmEFaBOY}sO(#M3SVi}TEiBr~q65ZWlo5Q#Y?mXBRxr1J#^?NnF>(36SMPzcBl zWP>h{$Z4DkV@`+P7D`_&RXG_To`W-kE&1V^%AjEZDmz29aJ_|P9)OcndZ_SMQ23VK zl9{)npsT-pcnM?0rPeU;9mWHVP$2m3wpHJcy8kI?e89S`vMSMe*7xebsC4Y2KZtHa z@^2LuI;n(JVI_1p&Qqzh3FkT-%{V_chuKjjU&Oqq4xZWZ@nojc=i|eZlkhSul42jk zv?5LS)e-1gBnRQAwGQD%kZ_?z0l&b6NUM3XL2*+%mdz3WpFyU??|I8d+gaS3J3*Ve zi~dgC;XD&_#d+Q3e4fiP#eI+S>r$laOq+9=$DC^vSMQ?3QSZ189`Pe$SJ%1|1fGjr k^n` for more + details about customizing the behavior. + + Per default the request object will be added to the WSGI + environment as `werkzeug.request` to support the debugging system. + If you don't want that, set `populate_request` to `False`. + + If `shallow` is `True` the environment is initialized as shallow + object around the environ. Every operation that would modify the + environ in any way (such as consuming form data) raises an exception + unless the `shallow` attribute is explicitly set to `False`. This + is useful for middlewares where you don't want to consume the form + data by accident. A shallow request is not populated to the WSGI + environment. + + .. versionchanged:: 0.5 + read-only mode was enforced by using immutables classes for all + data. + """ + + #: the charset for the request, defaults to utf-8 + charset = "utf-8" + + #: the error handling procedure for errors, defaults to 'replace' + encoding_errors = "replace" + + #: the maximum content length. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: parsing fails because more than the specified value is transmitted + #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :ref:`dealing-with-request-data` for more details. + #: + #: .. versionadded:: 0.5 + max_content_length = None + + #: the maximum form field size. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: data in memory for post data is longer than the specified value a + #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :ref:`dealing-with-request-data` for more details. + #: + #: .. versionadded:: 0.5 + max_form_memory_size = None + + #: the class to use for `args` and `form`. The default is an + #: :class:`~werkzeug.datastructures.ImmutableMultiDict` which supports + #: multiple values per key. alternatively it makes sense to use an + #: :class:`~werkzeug.datastructures.ImmutableOrderedMultiDict` which + #: preserves order or a :class:`~werkzeug.datastructures.ImmutableDict` + #: which is the fastest but only remembers the last key. It is also + #: possible to use mutable structures, but this is not recommended. + #: + #: .. versionadded:: 0.6 + parameter_storage_class = ImmutableMultiDict + + #: the type to be used for list values from the incoming WSGI environment. + #: By default an :class:`~werkzeug.datastructures.ImmutableList` is used + #: (for example for :attr:`access_list`). + #: + #: .. versionadded:: 0.6 + list_storage_class = ImmutableList + + #: the type to be used for dict values from the incoming WSGI environment. + #: By default an + #: :class:`~werkzeug.datastructures.ImmutableTypeConversionDict` is used + #: (for example for :attr:`cookies`). + #: + #: .. versionadded:: 0.6 + dict_storage_class = ImmutableTypeConversionDict + + #: The form data parser that shoud be used. Can be replaced to customize + #: the form date parsing. + form_data_parser_class = FormDataParser + + #: Optionally a list of hosts that is trusted by this request. By default + #: all hosts are trusted which means that whatever the client sends the + #: host is will be accepted. + #: + #: Because `Host` and `X-Forwarded-Host` headers can be set to any value by + #: a malicious client, it is recommended to either set this property or + #: implement similar validation in the proxy (if application is being run + #: behind one). + #: + #: .. versionadded:: 0.9 + trusted_hosts = None + + #: Indicates whether the data descriptor should be allowed to read and + #: buffer up the input stream. By default it's enabled. + #: + #: .. versionadded:: 0.9 + disable_data_descriptor = False + + def __init__(self, environ, populate_request=True, shallow=False): + self.environ = environ + if populate_request and not shallow: + self.environ["werkzeug.request"] = self + self.shallow = shallow + + def __repr__(self): + # make sure the __repr__ even works if the request was created + # from an invalid WSGI environment. If we display the request + # in a debug session we don't want the repr to blow up. + args = [] + try: + args.append("'%s'" % to_native(self.url, self.url_charset)) + args.append("[%s]" % self.method) + except Exception: + args.append("(invalid WSGI environ)") + + return "<%s %s>" % (self.__class__.__name__, " ".join(args)) + + @property + def url_charset(self): + """The charset that is assumed for URLs. Defaults to the value + of :attr:`charset`. + + .. versionadded:: 0.6 + """ + return self.charset + + @classmethod + def from_values(cls, *args, **kwargs): + """Create a new request object based on the values provided. If + environ is given missing values are filled from there. This method is + useful for small scripts when you need to simulate a request from an URL. + Do not use this method for unittesting, there is a full featured client + object (:class:`Client`) that allows to create multipart requests, + support for cookies etc. + + This accepts the same options as the + :class:`~werkzeug.test.EnvironBuilder`. + + .. versionchanged:: 0.5 + This method now accepts the same arguments as + :class:`~werkzeug.test.EnvironBuilder`. Because of this the + `environ` parameter is now called `environ_overrides`. + + :return: request object + """ + from ..test import EnvironBuilder + + charset = kwargs.pop("charset", cls.charset) + kwargs["charset"] = charset + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_request(cls) + finally: + builder.close() + + @classmethod + def application(cls, f): + """Decorate a function as responder that accepts the request as first + argument. This works like the :func:`responder` decorator but the + function is passed the request object as first argument and the + request object will be closed automatically:: + + @Request.application + def my_wsgi_app(request): + return Response('Hello World!') + + As of Werkzeug 0.14 HTTP exceptions are automatically caught and + converted to responses instead of failing. + + :param f: the WSGI callable to decorate + :return: a new WSGI callable + """ + #: return a callable that wraps the -2nd argument with the request + #: and calls the function with all the arguments up to that one and + #: the request. The return value is then called with the latest + #: two arguments. This makes it possible to use this decorator for + #: both methods and standalone WSGI functions. + from ..exceptions import HTTPException + + def application(*args): + request = cls(args[-2]) + with request: + try: + resp = f(*args[:-2] + (request,)) + except HTTPException as e: + resp = e.get_response(args[-2]) + return resp(*args[-2:]) + + return update_wrapper(application, f) + + def _get_file_stream( + self, total_content_length, content_type, filename=None, content_length=None + ): + """Called to get a stream for the file upload. + + This must provide a file-like class with `read()`, `readline()` + and `seek()` methods that is both writeable and readable. + + The default implementation returns a temporary file if the total + content length is higher than 500KB. Because many browsers do not + provide a content length for the files only the total content + length matters. + + :param total_content_length: the total content length of all the + data in the request combined. This value + is guaranteed to be there. + :param content_type: the mimetype of the uploaded file. + :param filename: the filename of the uploaded file. May be `None`. + :param content_length: the length of this file. This value is usually + not provided because webbrowsers do not provide + this value. + """ + return default_stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + + @property + def want_form_data_parsed(self): + """Returns True if the request method carries content. As of + Werkzeug 0.9 this will be the case if a content type is transmitted. + + .. versionadded:: 0.8 + """ + return bool(self.environ.get("CONTENT_TYPE")) + + def make_form_data_parser(self): + """Creates the form data parser. Instantiates the + :attr:`form_data_parser_class` with some parameters. + + .. versionadded:: 0.8 + """ + return self.form_data_parser_class( + self._get_file_stream, + self.charset, + self.encoding_errors, + self.max_form_memory_size, + self.max_content_length, + self.parameter_storage_class, + ) + + def _load_form_data(self): + """Method used internally to retrieve submitted data. After calling + this sets `form` and `files` on the request object to multi dicts + filled with the incoming form data. As a matter of fact the input + stream will be empty afterwards. You can also call this method to + force the parsing of the form data. + + .. versionadded:: 0.8 + """ + # abort early if we have already consumed the stream + if "form" in self.__dict__: + return + + _assert_not_shallow(self) + + if self.want_form_data_parsed: + content_type = self.environ.get("CONTENT_TYPE", "") + content_length = get_content_length(self.environ) + mimetype, options = parse_options_header(content_type) + parser = self.make_form_data_parser() + data = parser.parse( + self._get_stream_for_parsing(), mimetype, content_length, options + ) + else: + data = ( + self.stream, + self.parameter_storage_class(), + self.parameter_storage_class(), + ) + + # inject the values into the instance dict so that we bypass + # our cached_property non-data descriptor. + d = self.__dict__ + d["stream"], d["form"], d["files"] = data + + def _get_stream_for_parsing(self): + """This is the same as accessing :attr:`stream` with the difference + that if it finds cached data from calling :meth:`get_data` first it + will create a new stream out of the cached data. + + .. versionadded:: 0.9.3 + """ + cached_data = getattr(self, "_cached_data", None) + if cached_data is not None: + return BytesIO(cached_data) + return self.stream + + def close(self): + """Closes associated resources of this request object. This + closes all file handles explicitly. You can also use the request + object in a with statement which will automatically close it. + + .. versionadded:: 0.9 + """ + files = self.__dict__.get("files") + for _key, value in iter_multi_items(files or ()): + value.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close() + + @cached_property + def stream(self): + """ + If the incoming form data was not encoded with a known mimetype + the data is stored unmodified in this stream for consumption. Most + of the time it is a better idea to use :attr:`data` which will give + you that data as a string. The stream only returns the data once. + + Unlike :attr:`input_stream` this stream is properly guarded that you + can't accidentally read past the length of the input. Werkzeug will + internally always refer to this stream to read data which makes it + possible to wrap this object with a stream that does filtering. + + .. versionchanged:: 0.9 + This stream is now always available but might be consumed by the + form parser later on. Previously the stream was only set if no + parsing happened. + """ + _assert_not_shallow(self) + return get_input_stream(self.environ) + + input_stream = environ_property( + "wsgi.input", + """The WSGI input stream. + + In general it's a bad idea to use this one because you can + easily read past the boundary. Use the :attr:`stream` + instead.""", + ) + + @cached_property + def args(self): + """The parsed URL parameters (the part in the URL after the question + mark). + + By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + """ + return url_decode( + wsgi_get_bytes(self.environ.get("QUERY_STRING", "")), + self.url_charset, + errors=self.encoding_errors, + cls=self.parameter_storage_class, + ) + + @cached_property + def data(self): + """ + Contains the incoming request data as string in case it came with + a mimetype Werkzeug does not handle. + """ + + if self.disable_data_descriptor: + raise AttributeError("data descriptor is disabled") + # XXX: this should eventually be deprecated. + + # We trigger form data parsing first which means that the descriptor + # will not cache the data that would otherwise be .form or .files + # data. This restores the behavior that was there in Werkzeug + # before 0.9. New code should use :meth:`get_data` explicitly as + # this will make behavior explicit. + return self.get_data(parse_form_data=True) + + def get_data(self, cache=True, as_text=False, parse_form_data=False): + """This reads the buffered incoming data from the client into one + bytestring. By default this is cached but that behavior can be + changed by setting `cache` to `False`. + + Usually it's a bad idea to call this method without checking the + content length first as a client could send dozens of megabytes or more + to cause memory problems on the server. + + Note that if the form data was already parsed this method will not + return anything as form data parsing does not cache the data like + this method does. To implicitly invoke form data parsing function + set `parse_form_data` to `True`. When this is done the return value + of this method will be an empty string if the form parser handles + the data. This generally is not necessary as if the whole data is + cached (which is the default) the form parser will used the cached + data to parse the form data. Please be generally aware of checking + the content length first in any case before calling this method + to avoid exhausting server memory. + + If `as_text` is set to `True` the return value will be a decoded + unicode string. + + .. versionadded:: 0.9 + """ + rv = getattr(self, "_cached_data", None) + if rv is None: + if parse_form_data: + self._load_form_data() + rv = self.stream.read() + if cache: + self._cached_data = rv + if as_text: + rv = rv.decode(self.charset, self.encoding_errors) + return rv + + @cached_property + def form(self): + """The form parameters. By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + + Please keep in mind that file uploads will not end up here, but instead + in the :attr:`files` attribute. + + .. versionchanged:: 0.9 + + Previous to Werkzeug 0.9 this would only contain form data for POST + and PUT requests. + """ + self._load_form_data() + return self.form + + @cached_property + def values(self): + """A :class:`werkzeug.datastructures.CombinedMultiDict` that combines + :attr:`args` and :attr:`form`.""" + args = [] + for d in self.args, self.form: + if not isinstance(d, MultiDict): + d = MultiDict(d) + args.append(d) + return CombinedMultiDict(args) + + @cached_property + def files(self): + """:class:`~werkzeug.datastructures.MultiDict` object containing + all uploaded files. Each key in :attr:`files` is the name from the + ````. Each value in :attr:`files` is a + Werkzeug :class:`~werkzeug.datastructures.FileStorage` object. + + It basically behaves like a standard file object you know from Python, + with the difference that it also has a + :meth:`~werkzeug.datastructures.FileStorage.save` function that can + store the file on the filesystem. + + Note that :attr:`files` will only contain data if the request method was + POST, PUT or PATCH and the ``

    `` that posted to the request had + ``enctype="multipart/form-data"``. It will be empty otherwise. + + See the :class:`~werkzeug.datastructures.MultiDict` / + :class:`~werkzeug.datastructures.FileStorage` documentation for + more details about the used data structure. + """ + self._load_form_data() + return self.files + + @cached_property + def cookies(self): + """A :class:`dict` with the contents of all cookies transmitted with + the request.""" + return parse_cookie( + self.environ, + self.charset, + self.encoding_errors, + cls=self.dict_storage_class, + ) + + @cached_property + def headers(self): + """The headers from the WSGI environ as immutable + :class:`~werkzeug.datastructures.EnvironHeaders`. + """ + return EnvironHeaders(self.environ) + + @cached_property + def path(self): + """Requested path as unicode. This works a bit like the regular path + info in the WSGI environment but will always include a leading slash, + even if the URL root is accessed. + """ + raw_path = wsgi_decoding_dance( + self.environ.get("PATH_INFO") or "", self.charset, self.encoding_errors + ) + return "/" + raw_path.lstrip("/") + + @cached_property + def full_path(self): + """Requested path as unicode, including the query string.""" + return self.path + u"?" + to_unicode(self.query_string, self.url_charset) + + @cached_property + def script_root(self): + """The root path of the script without the trailing slash.""" + raw_path = wsgi_decoding_dance( + self.environ.get("SCRIPT_NAME") or "", self.charset, self.encoding_errors + ) + return raw_path.rstrip("/") + + @cached_property + def url(self): + """The reconstructed current URL as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url(self.environ, trusted_hosts=self.trusted_hosts) + + @cached_property + def base_url(self): + """Like :attr:`url` but without the querystring + See also: :attr:`trusted_hosts`. + """ + return get_current_url( + self.environ, strip_querystring=True, trusted_hosts=self.trusted_hosts + ) + + @cached_property + def url_root(self): + """The full URL root (with hostname), this is the application + root as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url(self.environ, True, trusted_hosts=self.trusted_hosts) + + @cached_property + def host_url(self): + """Just the host with scheme as IRI. + See also: :attr:`trusted_hosts`. + """ + return get_current_url( + self.environ, host_only=True, trusted_hosts=self.trusted_hosts + ) + + @cached_property + def host(self): + """Just the host including the port if available. + See also: :attr:`trusted_hosts`. + """ + return get_host(self.environ, trusted_hosts=self.trusted_hosts) + + query_string = environ_property( + "QUERY_STRING", + "", + read_only=True, + load_func=wsgi_get_bytes, + doc="The URL parameters as raw bytestring.", + ) + method = environ_property( + "REQUEST_METHOD", + "GET", + read_only=True, + load_func=lambda x: x.upper(), + doc="The request method. (For example ``'GET'`` or ``'POST'``).", + ) + + @cached_property + def access_route(self): + """If a forwarded header exists this is a list of all ip addresses + from the client ip to the last proxy server. + """ + if "HTTP_X_FORWARDED_FOR" in self.environ: + addr = self.environ["HTTP_X_FORWARDED_FOR"].split(",") + return self.list_storage_class([x.strip() for x in addr]) + elif "REMOTE_ADDR" in self.environ: + return self.list_storage_class([self.environ["REMOTE_ADDR"]]) + return self.list_storage_class() + + @property + def remote_addr(self): + """The remote address of the client.""" + return self.environ.get("REMOTE_ADDR") + + remote_user = environ_property( + "REMOTE_USER", + doc="""If the server supports user authentication, and the + script is protected, this attribute contains the username the + user has authenticated as.""", + ) + + scheme = environ_property( + "wsgi.url_scheme", + doc=""" + URL scheme (http or https). + + .. versionadded:: 0.7""", + ) + + @property + def is_xhr(self): + """True if the request was triggered via a JavaScript XMLHttpRequest. + This only works with libraries that support the ``X-Requested-With`` + header and set it to "XMLHttpRequest". Libraries that do that are + prototype, jQuery and Mochikit and probably some more. + + .. deprecated:: 0.13 + ``X-Requested-With`` is not standard and is unreliable. You + may be able to use :attr:`AcceptMixin.accept_mimetypes` + instead. + """ + warnings.warn( + "'Request.is_xhr' is deprecated as of version 0.13 and will" + " be removed in version 1.0. The 'X-Requested-With' header" + " is not standard and is unreliable. You may be able to use" + " 'accept_mimetypes' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.environ.get("HTTP_X_REQUESTED_WITH", "").lower() == "xmlhttprequest" + + is_secure = property( + lambda self: self.environ["wsgi.url_scheme"] == "https", + doc="`True` if the request is secure.", + ) + is_multithread = environ_property( + "wsgi.multithread", + doc="""boolean that is `True` if the application is served by a + multithreaded WSGI server.""", + ) + is_multiprocess = environ_property( + "wsgi.multiprocess", + doc="""boolean that is `True` if the application is served by a + WSGI server that spawns multiple processes.""", + ) + is_run_once = environ_property( + "wsgi.run_once", + doc="""boolean that is `True` if the application will be + executed only once in a process lifetime. This is the case for + CGI for example, but it's not guaranteed that the execution only + happens one time.""", + ) + + +def _assert_not_shallow(request): + if request.shallow: + raise RuntimeError( + "A shallow request tried to consume form data. If you really" + " want to do that, set `shallow` to False." + ) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py new file mode 100644 index 0000000..d944a7d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/base_response.py @@ -0,0 +1,702 @@ +import warnings + +from .._compat import integer_types +from .._compat import string_types +from .._compat import text_type +from .._compat import to_bytes +from .._compat import to_native +from ..datastructures import Headers +from ..http import dump_cookie +from ..http import HTTP_STATUS_CODES +from ..http import remove_entity_headers +from ..urls import iri_to_uri +from ..urls import url_join +from ..utils import get_content_type +from ..wsgi import ClosingIterator +from ..wsgi import get_current_url + + +def _run_wsgi_app(*args): + """This function replaces itself to ensure that the test module is not + imported unless required. DO NOT USE! + """ + global _run_wsgi_app + from ..test import run_wsgi_app as _run_wsgi_app + + return _run_wsgi_app(*args) + + +def _warn_if_string(iterable): + """Helper for the response objects to check if the iterable returned + to the WSGI server is not a string. + """ + if isinstance(iterable, string_types): + warnings.warn( + "Response iterable was set to a string. This will appear to" + " work but means that the server will send the data to the" + " client one character at a time. This is almost never" + " intended behavior, use 'response.data' to assign strings" + " to the response object.", + stacklevel=2, + ) + + +def _iter_encoded(iterable, charset): + for item in iterable: + if isinstance(item, text_type): + yield item.encode(charset) + else: + yield item + + +def _clean_accept_ranges(accept_ranges): + if accept_ranges is True: + return "bytes" + elif accept_ranges is False: + return "none" + elif isinstance(accept_ranges, text_type): + return to_native(accept_ranges) + raise ValueError("Invalid accept_ranges value") + + +class BaseResponse(object): + """Base response class. The most important fact about a response object + is that it's a regular WSGI application. It's initialized with a couple + of response parameters (headers, body, status code etc.) and will start a + valid WSGI response when called with the environ and start response + callable. + + Because it's a WSGI application itself processing usually ends before the + actual response is sent to the server. This helps debugging systems + because they can catch all the exceptions before responses are started. + + Here a small example WSGI application that takes advantage of the + response objects:: + + from werkzeug.wrappers import BaseResponse as Response + + def index(): + return Response('Index page') + + def application(environ, start_response): + path = environ.get('PATH_INFO') or '/' + if path == '/': + response = index() + else: + response = Response('Not Found', status=404) + return response(environ, start_response) + + Like :class:`BaseRequest` which object is lacking a lot of functionality + implemented in mixins. This gives you a better control about the actual + API of your response objects, so you can create subclasses and add custom + functionality. A full featured response object is available as + :class:`Response` which implements a couple of useful mixins. + + To enforce a new type of already existing responses you can use the + :meth:`force_type` method. This is useful if you're working with different + subclasses of response objects and you want to post process them with a + known interface. + + Per default the response object will assume all the text data is `utf-8` + encoded. Please refer to :doc:`the unicode chapter ` for more + details about customizing the behavior. + + Response can be any kind of iterable or string. If it's a string it's + considered being an iterable with one item which is the string passed. + Headers can be a list of tuples or a + :class:`~werkzeug.datastructures.Headers` object. + + Special note for `mimetype` and `content_type`: For most mime types + `mimetype` and `content_type` work the same, the difference affects + only 'text' mimetypes. If the mimetype passed with `mimetype` is a + mimetype starting with `text/`, the charset parameter of the response + object is appended to it. In contrast the `content_type` parameter is + always added as header unmodified. + + .. versionchanged:: 0.5 + the `direct_passthrough` parameter was added. + + :param response: a string or response iterable. + :param status: a string with a status or an integer with the status code. + :param headers: a list of headers or a + :class:`~werkzeug.datastructures.Headers` object. + :param mimetype: the mimetype for the response. See notice above. + :param content_type: the content type for the response. See notice above. + :param direct_passthrough: if set to `True` :meth:`iter_encoded` is not + called before iteration which makes it + possible to pass special iterators through + unchanged (see :func:`wrap_file` for more + details.) + """ + + #: the charset of the response. + charset = "utf-8" + + #: the default status if none is provided. + default_status = 200 + + #: the default mimetype if none is provided. + default_mimetype = "text/plain" + + #: if set to `False` accessing properties on the response object will + #: not try to consume the response iterator and convert it into a list. + #: + #: .. versionadded:: 0.6.2 + #: + #: That attribute was previously called `implicit_seqence_conversion`. + #: (Notice the typo). If you did use this feature, you have to adapt + #: your code to the name change. + implicit_sequence_conversion = True + + #: Should this response object correct the location header to be RFC + #: conformant? This is true by default. + #: + #: .. versionadded:: 0.8 + autocorrect_location_header = True + + #: Should this response object automatically set the content-length + #: header if possible? This is true by default. + #: + #: .. versionadded:: 0.8 + automatically_set_content_length = True + + #: Warn if a cookie header exceeds this size. The default, 4093, should be + #: safely `supported by most browsers `_. A cookie larger than + #: this size will still be sent, but it may be ignored or handled + #: incorrectly by some browsers. Set to 0 to disable this check. + #: + #: .. versionadded:: 0.13 + #: + #: .. _`cookie`: http://browsercookielimits.squawky.net/ + max_cookie_size = 4093 + + def __init__( + self, + response=None, + status=None, + headers=None, + mimetype=None, + content_type=None, + direct_passthrough=False, + ): + if isinstance(headers, Headers): + self.headers = headers + elif not headers: + self.headers = Headers() + else: + self.headers = Headers(headers) + + if content_type is None: + if mimetype is None and "content-type" not in self.headers: + mimetype = self.default_mimetype + if mimetype is not None: + mimetype = get_content_type(mimetype, self.charset) + content_type = mimetype + if content_type is not None: + self.headers["Content-Type"] = content_type + if status is None: + status = self.default_status + if isinstance(status, integer_types): + self.status_code = status + else: + self.status = status + + self.direct_passthrough = direct_passthrough + self._on_close = [] + + # we set the response after the headers so that if a class changes + # the charset attribute, the data is set in the correct charset. + if response is None: + self.response = [] + elif isinstance(response, (text_type, bytes, bytearray)): + self.set_data(response) + else: + self.response = response + + def call_on_close(self, func): + """Adds a function to the internal list of functions that should + be called as part of closing down the response. Since 0.7 this + function also returns the function that was passed so that this + can be used as a decorator. + + .. versionadded:: 0.6 + """ + self._on_close.append(func) + return func + + def __repr__(self): + if self.is_sequence: + body_info = "%d bytes" % sum(map(len, self.iter_encoded())) + else: + body_info = "streamed" if self.is_streamed else "likely-streamed" + return "<%s %s [%s]>" % (self.__class__.__name__, body_info, self.status) + + @classmethod + def force_type(cls, response, environ=None): + """Enforce that the WSGI response is a response object of the current + type. Werkzeug will use the :class:`BaseResponse` internally in many + situations like the exceptions. If you call :meth:`get_response` on an + exception you will get back a regular :class:`BaseResponse` object, even + if you are using a custom subclass. + + This method can enforce a given response type, and it will also + convert arbitrary WSGI callables into response objects if an environ + is provided:: + + # convert a Werkzeug response object into an instance of the + # MyResponseClass subclass. + response = MyResponseClass.force_type(response) + + # convert any WSGI application into a response object + response = MyResponseClass.force_type(response, environ) + + This is especially useful if you want to post-process responses in + the main dispatcher and use functionality provided by your subclass. + + Keep in mind that this will modify response objects in place if + possible! + + :param response: a response object or wsgi application. + :param environ: a WSGI environment object. + :return: a response object. + """ + if not isinstance(response, BaseResponse): + if environ is None: + raise TypeError( + "cannot convert WSGI application into response" + " objects without an environ" + ) + response = BaseResponse(*_run_wsgi_app(response, environ)) + response.__class__ = cls + return response + + @classmethod + def from_app(cls, app, environ, buffered=False): + """Create a new response object from an application output. This + works best if you pass it an application that returns a generator all + the time. Sometimes applications may use the `write()` callable + returned by the `start_response` function. This tries to resolve such + edge cases automatically. But if you don't get the expected output + you should set `buffered` to `True` which enforces buffering. + + :param app: the WSGI application to execute. + :param environ: the WSGI environment to execute against. + :param buffered: set to `True` to enforce buffering. + :return: a response object. + """ + return cls(*_run_wsgi_app(app, environ, buffered)) + + def _get_status_code(self): + return self._status_code + + def _set_status_code(self, code): + self._status_code = code + try: + self._status = "%d %s" % (code, HTTP_STATUS_CODES[code].upper()) + except KeyError: + self._status = "%d UNKNOWN" % code + + status_code = property( + _get_status_code, _set_status_code, doc="The HTTP Status code as number" + ) + del _get_status_code, _set_status_code + + def _get_status(self): + return self._status + + def _set_status(self, value): + try: + self._status = to_native(value) + except AttributeError: + raise TypeError("Invalid status argument") + + try: + self._status_code = int(self._status.split(None, 1)[0]) + except ValueError: + self._status_code = 0 + self._status = "0 %s" % self._status + except IndexError: + raise ValueError("Empty status argument") + + status = property(_get_status, _set_status, doc="The HTTP Status code") + del _get_status, _set_status + + def get_data(self, as_text=False): + """The string representation of the request body. Whenever you call + this property the request iterable is encoded and flattened. This + can lead to unwanted behavior if you stream big data. + + This behavior can be disabled by setting + :attr:`implicit_sequence_conversion` to `False`. + + If `as_text` is set to `True` the return value will be a decoded + unicode string. + + .. versionadded:: 0.9 + """ + self._ensure_sequence() + rv = b"".join(self.iter_encoded()) + if as_text: + rv = rv.decode(self.charset) + return rv + + def set_data(self, value): + """Sets a new string as response. The value set must either by a + unicode or bytestring. If a unicode string is set it's encoded + automatically to the charset of the response (utf-8 by default). + + .. versionadded:: 0.9 + """ + # if an unicode string is set, it's encoded directly so that we + # can set the content length + if isinstance(value, text_type): + value = value.encode(self.charset) + else: + value = bytes(value) + self.response = [value] + if self.automatically_set_content_length: + self.headers["Content-Length"] = str(len(value)) + + data = property( + get_data, + set_data, + doc="A descriptor that calls :meth:`get_data` and :meth:`set_data`.", + ) + + def calculate_content_length(self): + """Returns the content length if available or `None` otherwise.""" + try: + self._ensure_sequence() + except RuntimeError: + return None + return sum(len(x) for x in self.iter_encoded()) + + def _ensure_sequence(self, mutable=False): + """This method can be called by methods that need a sequence. If + `mutable` is true, it will also ensure that the response sequence + is a standard Python list. + + .. versionadded:: 0.6 + """ + if self.is_sequence: + # if we need a mutable object, we ensure it's a list. + if mutable and not isinstance(self.response, list): + self.response = list(self.response) + return + if self.direct_passthrough: + raise RuntimeError( + "Attempted implicit sequence conversion but the" + " response object is in direct passthrough mode." + ) + if not self.implicit_sequence_conversion: + raise RuntimeError( + "The response object required the iterable to be a" + " sequence, but the implicit conversion was disabled." + " Call make_sequence() yourself." + ) + self.make_sequence() + + def make_sequence(self): + """Converts the response iterator in a list. By default this happens + automatically if required. If `implicit_sequence_conversion` is + disabled, this method is not automatically called and some properties + might raise exceptions. This also encodes all the items. + + .. versionadded:: 0.6 + """ + if not self.is_sequence: + # if we consume an iterable we have to ensure that the close + # method of the iterable is called if available when we tear + # down the response + close = getattr(self.response, "close", None) + self.response = list(self.iter_encoded()) + if close is not None: + self.call_on_close(close) + + def iter_encoded(self): + """Iter the response encoded with the encoding of the response. + If the response object is invoked as WSGI application the return + value of this method is used as application iterator unless + :attr:`direct_passthrough` was activated. + """ + if __debug__: + _warn_if_string(self.response) + # Encode in a separate function so that self.response is fetched + # early. This allows us to wrap the response with the return + # value from get_app_iter or iter_encoded. + return _iter_encoded(self.response, self.charset) + + def set_cookie( + self, + key, + value="", + max_age=None, + expires=None, + path="/", + domain=None, + secure=False, + httponly=False, + samesite=None, + ): + """Sets a cookie. The parameters are the same as in the cookie `Morsel` + object in the Python standard library but it accepts unicode data, too. + + A warning is raised if the size of the cookie header exceeds + :attr:`max_cookie_size`, but the header will still be set. + + :param key: the key (name) of the cookie to be set. + :param value: the value of the cookie. + :param max_age: should be a number of seconds, or `None` (default) if + the cookie should last only as long as the client's + browser session. + :param expires: should be a `datetime` object or UNIX timestamp. + :param path: limits the cookie to a given path, per default it will + span the whole domain. + :param domain: if you want to set a cross-domain cookie. For example, + ``domain=".example.com"`` will set a cookie that is + readable by the domain ``www.example.com``, + ``foo.example.com`` etc. Otherwise, a cookie will only + be readable by the domain that set it. + :param secure: If `True`, the cookie will only be available via HTTPS + :param httponly: disallow JavaScript to access the cookie. This is an + extension to the cookie standard and probably not + supported by all browsers. + :param samesite: Limits the scope of the cookie such that it will only + be attached to requests if those requests are + "same-site". + """ + self.headers.add( + "Set-Cookie", + dump_cookie( + key, + value=value, + max_age=max_age, + expires=expires, + path=path, + domain=domain, + secure=secure, + httponly=httponly, + charset=self.charset, + max_size=self.max_cookie_size, + samesite=samesite, + ), + ) + + def delete_cookie(self, key, path="/", domain=None): + """Delete a cookie. Fails silently if key doesn't exist. + + :param key: the key (name) of the cookie to be deleted. + :param path: if the cookie that should be deleted was limited to a + path, the path has to be defined here. + :param domain: if the cookie that should be deleted was limited to a + domain, that domain has to be defined here. + """ + self.set_cookie(key, expires=0, max_age=0, path=path, domain=domain) + + @property + def is_streamed(self): + """If the response is streamed (the response is not an iterable with + a length information) this property is `True`. In this case streamed + means that there is no information about the number of iterations. + This is usually `True` if a generator is passed to the response object. + + This is useful for checking before applying some sort of post + filtering that should not take place for streamed responses. + """ + try: + len(self.response) + except (TypeError, AttributeError): + return True + return False + + @property + def is_sequence(self): + """If the iterator is buffered, this property will be `True`. A + response object will consider an iterator to be buffered if the + response attribute is a list or tuple. + + .. versionadded:: 0.6 + """ + return isinstance(self.response, (tuple, list)) + + def close(self): + """Close the wrapped response if possible. You can also use the object + in a with statement which will automatically close it. + + .. versionadded:: 0.9 + Can now be used in a with statement. + """ + if hasattr(self.response, "close"): + self.response.close() + for func in self._on_close: + func() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close() + + def freeze(self): + """Call this method if you want to make your response object ready for + being pickled. This buffers the generator if there is one. It will + also set the `Content-Length` header to the length of the body. + + .. versionchanged:: 0.6 + The `Content-Length` header is now set. + """ + # we explicitly set the length to a list of the *encoded* response + # iterator. Even if the implicit sequence conversion is disabled. + self.response = list(self.iter_encoded()) + self.headers["Content-Length"] = str(sum(map(len, self.response))) + + def get_wsgi_headers(self, environ): + """This is automatically called right before the response is started + and returns headers modified for the given environment. It returns a + copy of the headers from the response with some modifications applied + if necessary. + + For example the location header (if present) is joined with the root + URL of the environment. Also the content length is automatically set + to zero here for certain status codes. + + .. versionchanged:: 0.6 + Previously that function was called `fix_headers` and modified + the response object in place. Also since 0.6, IRIs in location + and content-location headers are handled properly. + + Also starting with 0.6, Werkzeug will attempt to set the content + length if it is able to figure it out on its own. This is the + case if all the strings in the response iterable are already + encoded and the iterable is buffered. + + :param environ: the WSGI environment of the request. + :return: returns a new :class:`~werkzeug.datastructures.Headers` + object. + """ + headers = Headers(self.headers) + location = None + content_location = None + content_length = None + status = self.status_code + + # iterate over the headers to find all values in one go. Because + # get_wsgi_headers is used each response that gives us a tiny + # speedup. + for key, value in headers: + ikey = key.lower() + if ikey == u"location": + location = value + elif ikey == u"content-location": + content_location = value + elif ikey == u"content-length": + content_length = value + + # make sure the location header is an absolute URL + if location is not None: + old_location = location + if isinstance(location, text_type): + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). + location = iri_to_uri(location, safe_conversion=True) + + if self.autocorrect_location_header: + current_url = get_current_url(environ, strip_querystring=True) + if isinstance(current_url, text_type): + current_url = iri_to_uri(current_url) + location = url_join(current_url, location) + if location != old_location: + headers["Location"] = location + + # make sure the content location is a URL + if content_location is not None and isinstance(content_location, text_type): + headers["Content-Location"] = iri_to_uri(content_location) + + if 100 <= status < 200 or status == 204: + # Per section 3.3.2 of RFC 7230, "a server MUST NOT send a + # Content-Length header field in any response with a status + # code of 1xx (Informational) or 204 (No Content)." + headers.remove("Content-Length") + elif status == 304: + remove_entity_headers(headers) + + # if we can determine the content length automatically, we + # should try to do that. But only if this does not involve + # flattening the iterator or encoding of unicode strings in + # the response. We however should not do that if we have a 304 + # response. + if ( + self.automatically_set_content_length + and self.is_sequence + and content_length is None + and status not in (204, 304) + and not (100 <= status < 200) + ): + try: + content_length = sum(len(to_bytes(x, "ascii")) for x in self.response) + except UnicodeError: + # aha, something non-bytestringy in there, too bad, we + # can't safely figure out the length of the response. + pass + else: + headers["Content-Length"] = str(content_length) + + return headers + + def get_app_iter(self, environ): + """Returns the application iterator for the given environ. Depending + on the request method and the current status code the return value + might be an empty response rather than the one from the response. + + If the request method is `HEAD` or the status code is in a range + where the HTTP specification requires an empty response, an empty + iterable is returned. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: a response iterable. + """ + status = self.status_code + if ( + environ["REQUEST_METHOD"] == "HEAD" + or 100 <= status < 200 + or status in (204, 304) + ): + iterable = () + elif self.direct_passthrough: + if __debug__: + _warn_if_string(self.response) + return self.response + else: + iterable = self.iter_encoded() + return ClosingIterator(iterable, self.close) + + def get_wsgi_response(self, environ): + """Returns the final WSGI response as tuple. The first item in + the tuple is the application iterator, the second the status and + the third the list of headers. The response returned is created + specially for the given environment. For example if the request + method in the WSGI environment is ``'HEAD'`` the response will + be empty and only the headers and status code will be present. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: an ``(app_iter, status, headers)`` tuple. + """ + headers = self.get_wsgi_headers(environ) + app_iter = self.get_app_iter(environ) + return app_iter, self.status, headers.to_wsgi_list() + + def __call__(self, environ, start_response): + """Process this response as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + :return: an application iterator + """ + app_iter, status, headers = self.get_wsgi_response(environ) + start_response(status, headers) + return app_iter diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py new file mode 100644 index 0000000..e4107ee --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/common_descriptors.py @@ -0,0 +1,322 @@ +from datetime import datetime +from datetime import timedelta + +from .._compat import string_types +from ..datastructures import CallbackDict +from ..http import dump_age +from ..http import dump_header +from ..http import dump_options_header +from ..http import http_date +from ..http import parse_age +from ..http import parse_date +from ..http import parse_options_header +from ..http import parse_set_header +from ..utils import cached_property +from ..utils import environ_property +from ..utils import get_content_type +from ..utils import header_property +from ..wsgi import get_content_length + + +class CommonRequestDescriptorsMixin(object): + """A mixin for :class:`BaseRequest` subclasses. Request objects that + mix this class in will automatically get descriptors for a couple of + HTTP headers with automatic type conversion. + + .. versionadded:: 0.5 + """ + + content_type = environ_property( + "CONTENT_TYPE", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + ) + + @cached_property + def content_length(self): + """The Content-Length entity-header field indicates the size of the + entity-body in bytes or, in the case of the HEAD method, the size of + the entity-body that would have been sent had the request been a + GET. + """ + return get_content_length(self.environ) + + content_encoding = environ_property( + "HTTP_CONTENT_ENCODING", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field. + + .. versionadded:: 0.9""", + ) + content_md5 = environ_property( + "HTTP_CONTENT_MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.) + + .. versionadded:: 0.9""", + ) + referrer = environ_property( + "HTTP_REFERER", + doc="""The Referer[sic] request-header field allows the client + to specify, for the server's benefit, the address (URI) of the + resource from which the Request-URI was obtained (the + "referrer", although the header field is misspelled).""", + ) + date = environ_property( + "HTTP_DATE", + None, + parse_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822.""", + ) + max_forwards = environ_property( + "HTTP_MAX_FORWARDS", + None, + int, + doc="""The Max-Forwards request-header field provides a + mechanism with the TRACE and OPTIONS methods to limit the number + of proxies or gateways that can forward the request to the next + inbound server.""", + ) + + def _parse_content_type(self): + if not hasattr(self, "_parsed_content_type"): + self._parsed_content_type = parse_options_header( + self.environ.get("CONTENT_TYPE", "") + ) + + @property + def mimetype(self): + """Like :attr:`content_type`, but without parameters (eg, without + charset, type etc.) and always lowercase. For example if the content + type is ``text/HTML; charset=utf-8`` the mimetype would be + ``'text/html'``. + """ + self._parse_content_type() + return self._parsed_content_type[0].lower() + + @property + def mimetype_params(self): + """The mimetype parameters as dict. For example if the content + type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + """ + self._parse_content_type() + return self._parsed_content_type[1] + + @cached_property + def pragma(self): + """The Pragma general-header field is used to include + implementation-specific directives that might apply to any recipient + along the request/response chain. All pragma directives specify + optional behavior from the viewpoint of the protocol; however, some + systems MAY require that behavior be consistent with the directives. + """ + return parse_set_header(self.environ.get("HTTP_PRAGMA", "")) + + +class CommonResponseDescriptorsMixin(object): + """A mixin for :class:`BaseResponse` subclasses. Response objects that + mix this class in will automatically get descriptors for a couple of + HTTP headers with automatic type conversion. + """ + + @property + def mimetype(self): + """The mimetype (content type without charset etc.)""" + ct = self.headers.get("content-type") + if ct: + return ct.split(";")[0].strip() + + @mimetype.setter + def mimetype(self, value): + self.headers["Content-Type"] = get_content_type(value, self.charset) + + @property + def mimetype_params(self): + """The mimetype parameters as dict. For example if the + content type is ``text/html; charset=utf-8`` the params would be + ``{'charset': 'utf-8'}``. + + .. versionadded:: 0.5 + """ + + def on_update(d): + self.headers["Content-Type"] = dump_options_header(self.mimetype, d) + + d = parse_options_header(self.headers.get("content-type", ""))[1] + return CallbackDict(d, on_update) + + location = header_property( + "Location", + doc="""The Location response-header field is used to redirect + the recipient to a location other than the Request-URI for + completion of the request or identification of a new + resource.""", + ) + age = header_property( + "Age", + None, + parse_age, + dump_age, + doc="""The Age response-header field conveys the sender's + estimate of the amount of time since the response (or its + revalidation) was generated at the origin server. + + Age values are non-negative decimal integers, representing time + in seconds.""", + ) + content_type = header_property( + "Content-Type", + doc="""The Content-Type entity-header field indicates the media + type of the entity-body sent to the recipient or, in the case of + the HEAD method, the media type that would have been sent had + the request been a GET.""", + ) + content_length = header_property( + "Content-Length", + None, + int, + str, + doc="""The Content-Length entity-header field indicates the size + of the entity-body, in decimal number of OCTETs, sent to the + recipient or, in the case of the HEAD method, the size of the + entity-body that would have been sent had the request been a + GET.""", + ) + content_location = header_property( + "Content-Location", + doc="""The Content-Location entity-header field MAY be used to + supply the resource location for the entity enclosed in the + message when that entity is accessible from a location separate + from the requested resource's URI.""", + ) + content_encoding = header_property( + "Content-Encoding", + doc="""The Content-Encoding entity-header field is used as a + modifier to the media-type. When present, its value indicates + what additional content codings have been applied to the + entity-body, and thus what decoding mechanisms must be applied + in order to obtain the media-type referenced by the Content-Type + header field.""", + ) + content_md5 = header_property( + "Content-MD5", + doc="""The Content-MD5 entity-header field, as defined in + RFC 1864, is an MD5 digest of the entity-body for the purpose of + providing an end-to-end message integrity check (MIC) of the + entity-body. (Note: a MIC is good for detecting accidental + modification of the entity-body in transit, but is not proof + against malicious attacks.)""", + ) + date = header_property( + "Date", + None, + parse_date, + http_date, + doc="""The Date general-header field represents the date and + time at which the message was originated, having the same + semantics as orig-date in RFC 822.""", + ) + expires = header_property( + "Expires", + None, + parse_date, + http_date, + doc="""The Expires entity-header field gives the date/time after + which the response is considered stale. A stale cache entry may + not normally be returned by a cache.""", + ) + last_modified = header_property( + "Last-Modified", + None, + parse_date, + http_date, + doc="""The Last-Modified entity-header field indicates the date + and time at which the origin server believes the variant was + last modified.""", + ) + + @property + def retry_after(self): + """The Retry-After response-header field can be used with a + 503 (Service Unavailable) response to indicate how long the + service is expected to be unavailable to the requesting client. + + Time in seconds until expiration or date. + """ + value = self.headers.get("retry-after") + if value is None: + return + elif value.isdigit(): + return datetime.utcnow() + timedelta(seconds=int(value)) + return parse_date(value) + + @retry_after.setter + def retry_after(self, value): + if value is None: + if "retry-after" in self.headers: + del self.headers["retry-after"] + return + elif isinstance(value, datetime): + value = http_date(value) + else: + value = str(value) + self.headers["Retry-After"] = value + + def _set_property(name, doc=None): # noqa: B902 + def fget(self): + def on_update(header_set): + if not header_set and name in self.headers: + del self.headers[name] + elif header_set: + self.headers[name] = header_set.to_header() + + return parse_set_header(self.headers.get(name), on_update) + + def fset(self, value): + if not value: + del self.headers[name] + elif isinstance(value, string_types): + self.headers[name] = value + else: + self.headers[name] = dump_header(value) + + return property(fget, fset, doc=doc) + + vary = _set_property( + "Vary", + doc="""The Vary field value indicates the set of request-header + fields that fully determines, while the response is fresh, + whether a cache is permitted to use the response to reply to a + subsequent request without revalidation.""", + ) + content_language = _set_property( + "Content-Language", + doc="""The Content-Language entity-header field describes the + natural language(s) of the intended audience for the enclosed + entity. Note that this might not be equivalent to all the + languages used within the entity-body.""", + ) + allow = _set_property( + "Allow", + doc="""The Allow entity-header field lists the set of methods + supported by the resource identified by the Request-URI. The + purpose of this field is strictly to inform the recipient of + valid methods associated with the resource. An Allow header + field MUST be present in a 405 (Method Not Allowed) + response.""", + ) + + del _set_property diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py new file mode 100644 index 0000000..0733506 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/etag.py @@ -0,0 +1,304 @@ +from .._compat import string_types +from .._internal import _get_environ +from ..datastructures import ContentRange +from ..datastructures import RequestCacheControl +from ..datastructures import ResponseCacheControl +from ..http import generate_etag +from ..http import http_date +from ..http import is_resource_modified +from ..http import parse_cache_control_header +from ..http import parse_content_range_header +from ..http import parse_date +from ..http import parse_etags +from ..http import parse_if_range_header +from ..http import parse_range_header +from ..http import quote_etag +from ..http import unquote_etag +from ..utils import cached_property +from ..utils import header_property +from ..wrappers.base_response import _clean_accept_ranges +from ..wsgi import _RangeWrapper + + +class ETagRequestMixin(object): + """Add entity tag and cache descriptors to a request object or object with + a WSGI environment available as :attr:`~BaseRequest.environ`. This not + only provides access to etags but also to the cache control header. + """ + + @cached_property + def cache_control(self): + """A :class:`~werkzeug.datastructures.RequestCacheControl` object + for the incoming cache control headers. + """ + cache_control = self.environ.get("HTTP_CACHE_CONTROL") + return parse_cache_control_header(cache_control, None, RequestCacheControl) + + @cached_property + def if_match(self): + """An object containing all the etags in the `If-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.environ.get("HTTP_IF_MATCH")) + + @cached_property + def if_none_match(self): + """An object containing all the etags in the `If-None-Match` header. + + :rtype: :class:`~werkzeug.datastructures.ETags` + """ + return parse_etags(self.environ.get("HTTP_IF_NONE_MATCH")) + + @cached_property + def if_modified_since(self): + """The parsed `If-Modified-Since` header as datetime object.""" + return parse_date(self.environ.get("HTTP_IF_MODIFIED_SINCE")) + + @cached_property + def if_unmodified_since(self): + """The parsed `If-Unmodified-Since` header as datetime object.""" + return parse_date(self.environ.get("HTTP_IF_UNMODIFIED_SINCE")) + + @cached_property + def if_range(self): + """The parsed `If-Range` header. + + .. versionadded:: 0.7 + + :rtype: :class:`~werkzeug.datastructures.IfRange` + """ + return parse_if_range_header(self.environ.get("HTTP_IF_RANGE")) + + @cached_property + def range(self): + """The parsed `Range` header. + + .. versionadded:: 0.7 + + :rtype: :class:`~werkzeug.datastructures.Range` + """ + return parse_range_header(self.environ.get("HTTP_RANGE")) + + +class ETagResponseMixin(object): + """Adds extra functionality to a response object for etag and cache + handling. This mixin requires an object with at least a `headers` + object that implements a dict like interface similar to + :class:`~werkzeug.datastructures.Headers`. + + If you want the :meth:`freeze` method to automatically add an etag, you + have to mixin this method before the response base class. The default + response class does not do that. + """ + + @property + def cache_control(self): + """The Cache-Control general-header field is used to specify + directives that MUST be obeyed by all caching mechanisms along the + request/response chain. + """ + + def on_update(cache_control): + if not cache_control and "cache-control" in self.headers: + del self.headers["cache-control"] + elif cache_control: + self.headers["Cache-Control"] = cache_control.to_header() + + return parse_cache_control_header( + self.headers.get("cache-control"), on_update, ResponseCacheControl + ) + + def _wrap_response(self, start, length): + """Wrap existing Response in case of Range Request context.""" + if self.status_code == 206: + self.response = _RangeWrapper(self.response, start, length) + + def _is_range_request_processable(self, environ): + """Return ``True`` if `Range` header is present and if underlying + resource is considered unchanged when compared with `If-Range` header. + """ + return ( + "HTTP_IF_RANGE" not in environ + or not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ignore_if_range=False, + ) + ) and "HTTP_RANGE" in environ + + def _process_range_request(self, environ, complete_length=None, accept_ranges=None): + """Handle Range Request related headers (RFC7233). If `Accept-Ranges` + header is valid, and Range Request is processable, we set the headers + as described by the RFC, and wrap the underlying response in a + RangeWrapper. + + Returns ``True`` if Range Request can be fulfilled, ``False`` otherwise. + + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + """ + from ..exceptions import RequestedRangeNotSatisfiable + + if accept_ranges is None: + return False + self.headers["Accept-Ranges"] = accept_ranges + if not self._is_range_request_processable(environ) or complete_length is None: + return False + parsed_range = parse_range_header(environ.get("HTTP_RANGE")) + if parsed_range is None: + raise RequestedRangeNotSatisfiable(complete_length) + range_tuple = parsed_range.range_for_length(complete_length) + content_range_header = parsed_range.to_content_range_header(complete_length) + if range_tuple is None or content_range_header is None: + raise RequestedRangeNotSatisfiable(complete_length) + content_length = range_tuple[1] - range_tuple[0] + # Be sure not to send 206 response + # if requested range is the full content. + if content_length != complete_length: + self.headers["Content-Length"] = content_length + self.content_range = content_range_header + self.status_code = 206 + self._wrap_response(range_tuple[0], content_length) + return True + return False + + def make_conditional( + self, request_or_environ, accept_ranges=False, complete_length=None + ): + """Make the response conditional to the request. This method works + best if an etag was defined for the response already. The `add_etag` + method can be used to do that. If called without etag just the date + header is set. + + This does nothing if the request method in the request or environ is + anything but GET or HEAD. + + For optimal performance when handling range requests, it's recommended + that your response data object implements `seekable`, `seek` and `tell` + methods as described by :py:class:`io.IOBase`. Objects returned by + :meth:`~werkzeug.wsgi.wrap_file` automatically implement those methods. + + It does not remove the body of the response because that's something + the :meth:`__call__` function does for us automatically. + + Returns self so that you can do ``return resp.make_conditional(req)`` + but modifies the object in-place. + + :param request_or_environ: a request object or WSGI environment to be + used to make the response conditional + against. + :param accept_ranges: This parameter dictates the value of + `Accept-Ranges` header. If ``False`` (default), + the header is not set. If ``True``, it will be set + to ``"bytes"``. If ``None``, it will be set to + ``"none"``. If it's a string, it will use this + value. + :param complete_length: Will be used only in valid Range Requests. + It will set `Content-Range` complete length + value and compute `Content-Length` real value. + This parameter is mandatory for successful + Range Requests completion. + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + """ + environ = _get_environ(request_or_environ) + if environ["REQUEST_METHOD"] in ("GET", "HEAD"): + # if the date is not in the headers, add it now. We however + # will not override an already existing header. Unfortunately + # this header will be overriden by many WSGI servers including + # wsgiref. + if "date" not in self.headers: + self.headers["Date"] = http_date() + accept_ranges = _clean_accept_ranges(accept_ranges) + is206 = self._process_range_request(environ, complete_length, accept_ranges) + if not is206 and not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ): + if parse_etags(environ.get("HTTP_IF_MATCH")): + self.status_code = 412 + else: + self.status_code = 304 + if ( + self.automatically_set_content_length + and "content-length" not in self.headers + ): + length = self.calculate_content_length() + if length is not None: + self.headers["Content-Length"] = length + return self + + def add_etag(self, overwrite=False, weak=False): + """Add an etag for the current response if there is none yet.""" + if overwrite or "etag" not in self.headers: + self.set_etag(generate_etag(self.get_data()), weak) + + def set_etag(self, etag, weak=False): + """Set the etag, and override the old one if there was one.""" + self.headers["ETag"] = quote_etag(etag, weak) + + def get_etag(self): + """Return a tuple in the form ``(etag, is_weak)``. If there is no + ETag the return value is ``(None, None)``. + """ + return unquote_etag(self.headers.get("ETag")) + + def freeze(self, no_etag=False): + """Call this method if you want to make your response object ready for + pickeling. This buffers the generator if there is one. This also + sets the etag unless `no_etag` is set to `True`. + """ + if not no_etag: + self.add_etag() + super(ETagResponseMixin, self).freeze() + + accept_ranges = header_property( + "Accept-Ranges", + doc="""The `Accept-Ranges` header. Even though the name would + indicate that multiple values are supported, it must be one + string token only. + + The values ``'bytes'`` and ``'none'`` are common. + + .. versionadded:: 0.7""", + ) + + def _get_content_range(self): + def on_update(rng): + if not rng: + del self.headers["content-range"] + else: + self.headers["Content-Range"] = rng.to_header() + + rv = parse_content_range_header(self.headers.get("content-range"), on_update) + # always provide a content range object to make the descriptor + # more user friendly. It provides an unset() method that can be + # used to remove the header quickly. + if rv is None: + rv = ContentRange(None, None, None, on_update=on_update) + return rv + + def _set_content_range(self, value): + if not value: + del self.headers["content-range"] + elif isinstance(value, string_types): + self.headers["Content-Range"] = value + else: + self.headers["Content-Range"] = value.to_header() + + content_range = property( + _get_content_range, + _set_content_range, + doc="""The ``Content-Range`` header as + :class:`~werkzeug.datastructures.ContentRange` object. Even if + the header is not set it wil provide such an object for easier + manipulation. + + .. versionadded:: 0.7""", + ) + del _get_content_range, _set_content_range diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py new file mode 100644 index 0000000..6d5dc33 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/json.py @@ -0,0 +1,145 @@ +from __future__ import absolute_import + +import datetime +import uuid + +from .._compat import text_type +from ..exceptions import BadRequest +from ..utils import detect_utf_encoding + +try: + import simplejson as _json +except ImportError: + import json as _json + + +class _JSONModule(object): + @staticmethod + def _default(o): + if isinstance(o, datetime.date): + return o.isoformat() + + if isinstance(o, uuid.UUID): + return str(o) + + if hasattr(o, "__html__"): + return text_type(o.__html__()) + + raise TypeError() + + @classmethod + def dumps(cls, obj, **kw): + kw.setdefault("separators", (",", ":")) + kw.setdefault("default", cls._default) + kw.setdefault("sort_keys", True) + return _json.dumps(obj, **kw) + + @staticmethod + def loads(s, **kw): + if isinstance(s, bytes): + # Needed for Python < 3.6 + encoding = detect_utf_encoding(s) + s = s.decode(encoding) + + return _json.loads(s, **kw) + + +class JSONMixin(object): + """Mixin to parse :attr:`data` as JSON. Can be mixed in for both + :class:`~werkzeug.wrappers.Request` and + :class:`~werkzeug.wrappers.Response` classes. + + If `simplejson`_ is installed it is preferred over Python's built-in + :mod:`json` module. + + .. _simplejson: https://simplejson.readthedocs.io/en/latest/ + """ + + #: A module or other object that has ``dumps`` and ``loads`` + #: functions that match the API of the built-in :mod:`json` module. + json_module = _JSONModule + + @property + def json(self): + """The parsed JSON data if :attr:`mimetype` indicates JSON + (:mimetype:`application/json`, see :meth:`is_json`). + + Calls :meth:`get_json` with default arguments. + """ + return self.get_json() + + @property + def is_json(self): + """Check if the mimetype indicates JSON data, either + :mimetype:`application/json` or :mimetype:`application/*+json`. + """ + mt = self.mimetype + return ( + mt == "application/json" + or mt.startswith("application/") + and mt.endswith("+json") + ) + + def _get_data_for_json(self, cache): + try: + return self.get_data(cache=cache) + except TypeError: + # Response doesn't have cache param. + return self.get_data() + + # Cached values for ``(silent=False, silent=True)``. Initialized + # with sentinel values. + _cached_json = (Ellipsis, Ellipsis) + + def get_json(self, force=False, silent=False, cache=True): + """Parse :attr:`data` as JSON. + + If the mimetype does not indicate JSON + (:mimetype:`application/json`, see :meth:`is_json`), this + returns ``None``. + + If parsing fails, :meth:`on_json_loading_failed` is called and + its return value is used as the return value. + + :param force: Ignore the mimetype and always try to parse JSON. + :param silent: Silence parsing errors and return ``None`` + instead. + :param cache: Store the parsed JSON to return for subsequent + calls. + """ + if cache and self._cached_json[silent] is not Ellipsis: + return self._cached_json[silent] + + if not (force or self.is_json): + return None + + data = self._get_data_for_json(cache=cache) + + try: + rv = self.json_module.loads(data) + except ValueError as e: + if silent: + rv = None + + if cache: + normal_rv, _ = self._cached_json + self._cached_json = (normal_rv, rv) + else: + rv = self.on_json_loading_failed(e) + + if cache: + _, silent_rv = self._cached_json + self._cached_json = (rv, silent_rv) + else: + if cache: + self._cached_json = (rv, rv) + + return rv + + def on_json_loading_failed(self, e): + """Called if :meth:`get_json` parsing fails and isn't silenced. + If this method returns a value, it is used as the return value + for :meth:`get_json`. The default implementation raises + :exc:`~werkzeug.exceptions.BadRequest`. + """ + raise BadRequest("Failed to decode JSON object: {0}".format(e)) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py new file mode 100644 index 0000000..d1c71b6 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/request.py @@ -0,0 +1,44 @@ +from .accept import AcceptMixin +from .auth import AuthorizationMixin +from .base_request import BaseRequest +from .common_descriptors import CommonRequestDescriptorsMixin +from .etag import ETagRequestMixin +from .user_agent import UserAgentMixin + + +class Request( + BaseRequest, + AcceptMixin, + ETagRequestMixin, + UserAgentMixin, + AuthorizationMixin, + CommonRequestDescriptorsMixin, +): + """Full featured request object implementing the following mixins: + + - :class:`AcceptMixin` for accept header parsing + - :class:`ETagRequestMixin` for etag and cache control handling + - :class:`UserAgentMixin` for user agent introspection + - :class:`AuthorizationMixin` for http auth handling + - :class:`CommonRequestDescriptorsMixin` for common headers + """ + + +class StreamOnlyMixin(object): + """If mixed in before the request object this will change the bahavior + of it to disable handling of form parsing. This disables the + :attr:`files`, :attr:`form` attributes and will just provide a + :attr:`stream` attribute that however is always available. + + .. versionadded:: 0.9 + """ + + disable_data_descriptor = True + want_form_data_parsed = False + + +class PlainRequest(StreamOnlyMixin, Request): + """A request object without special form parsing capabilities. + + .. versionadded:: 0.9 + """ diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py new file mode 100644 index 0000000..cd86cac --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/response.py @@ -0,0 +1,78 @@ +from ..utils import cached_property +from .auth import WWWAuthenticateMixin +from .base_response import BaseResponse +from .common_descriptors import CommonResponseDescriptorsMixin +from .etag import ETagResponseMixin + + +class ResponseStream(object): + """A file descriptor like object used by the :class:`ResponseStreamMixin` to + represent the body of the stream. It directly pushes into the response + iterable of the response object. + """ + + mode = "wb+" + + def __init__(self, response): + self.response = response + self.closed = False + + def write(self, value): + if self.closed: + raise ValueError("I/O operation on closed file") + self.response._ensure_sequence(mutable=True) + self.response.response.append(value) + self.response.headers.pop("Content-Length", None) + return len(value) + + def writelines(self, seq): + for item in seq: + self.write(item) + + def close(self): + self.closed = True + + def flush(self): + if self.closed: + raise ValueError("I/O operation on closed file") + + def isatty(self): + if self.closed: + raise ValueError("I/O operation on closed file") + return False + + def tell(self): + self.response._ensure_sequence() + return sum(map(len, self.response.response)) + + @property + def encoding(self): + return self.response.charset + + +class ResponseStreamMixin(object): + """Mixin for :class:`BaseRequest` subclasses. Classes that inherit from + this mixin will automatically get a :attr:`stream` property that provides + a write-only interface to the response iterable. + """ + + @cached_property + def stream(self): + """The response iterable as write-only stream.""" + return ResponseStream(self) + + +class Response( + BaseResponse, + ETagResponseMixin, + ResponseStreamMixin, + CommonResponseDescriptorsMixin, + WWWAuthenticateMixin, +): + """Full featured response object implementing the following mixins: + + - :class:`ETagResponseMixin` for etag and cache control handling + - :class:`ResponseStreamMixin` to add support for the `stream` property + - :class:`CommonResponseDescriptorsMixin` for various HTTP descriptors + - :class:`WWWAuthenticateMixin` for HTTP authentication support + """ diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py new file mode 100644 index 0000000..72588dd --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wrappers/user_agent.py @@ -0,0 +1,15 @@ +from ..utils import cached_property + + +class UserAgentMixin(object): + """Adds a `user_agent` attribute to the request object which + contains the parsed user agent of the browser that triggered the + request as a :class:`~werkzeug.useragents.UserAgent` object. + """ + + @cached_property + def user_agent(self): + """The current user agent.""" + from ..useragents import UserAgent + + return UserAgent(self.environ) diff --git a/backend/venv/lib/python3.7/site-packages/werkzeug/wsgi.py b/backend/venv/lib/python3.7/site-packages/werkzeug/wsgi.py new file mode 100644 index 0000000..f069f2d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/werkzeug/wsgi.py @@ -0,0 +1,1067 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.wsgi + ~~~~~~~~~~~~~ + + This module implements WSGI related helpers. + + :copyright: 2007 Pallets + :license: BSD-3-Clause +""" +import io +import re +import warnings +from functools import partial +from functools import update_wrapper +from itertools import chain + +from ._compat import BytesIO +from ._compat import implements_iterator +from ._compat import make_literal_wrapper +from ._compat import string_types +from ._compat import text_type +from ._compat import to_bytes +from ._compat import to_unicode +from ._compat import try_coerce_native +from ._compat import wsgi_get_bytes +from ._internal import _encode_idna +from .urls import uri_to_iri +from .urls import url_join +from .urls import url_parse +from .urls import url_quote + + +def responder(f): + """Marks a function as responder. Decorate a function with it and it + will automatically call the return value as WSGI application. + + Example:: + + @responder + def application(environ, start_response): + return Response('Hello World!') + """ + return update_wrapper(lambda *a: f(*a)(*a[-2:]), f) + + +def get_current_url( + environ, + root_only=False, + strip_querystring=False, + host_only=False, + trusted_hosts=None, +): + """A handy helper function that recreates the full URL as IRI for the + current request or parts of it. Here's an example: + + >>> from werkzeug.test import create_environ + >>> env = create_environ("/?param=foo", "http://localhost/script") + >>> get_current_url(env) + 'http://localhost/script/?param=foo' + >>> get_current_url(env, root_only=True) + 'http://localhost/script/' + >>> get_current_url(env, host_only=True) + 'http://localhost/' + >>> get_current_url(env, strip_querystring=True) + 'http://localhost/script/' + + This optionally it verifies that the host is in a list of trusted hosts. + If the host is not in there it will raise a + :exc:`~werkzeug.exceptions.SecurityError`. + + Note that the string returned might contain unicode characters as the + representation is an IRI not an URI. If you need an ASCII only + representation you can use the :func:`~werkzeug.urls.iri_to_uri` + function: + + >>> from werkzeug.urls import iri_to_uri + >>> iri_to_uri(get_current_url(env)) + 'http://localhost/script/?param=foo' + + :param environ: the WSGI environment to get the current URL from. + :param root_only: set `True` if you only want the root URL. + :param strip_querystring: set to `True` if you don't want the querystring. + :param host_only: set to `True` if the host URL should be returned. + :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted` + for more information. + """ + tmp = [environ["wsgi.url_scheme"], "://", get_host(environ, trusted_hosts)] + cat = tmp.append + if host_only: + return uri_to_iri("".join(tmp) + "/") + cat(url_quote(wsgi_get_bytes(environ.get("SCRIPT_NAME", ""))).rstrip("/")) + cat("/") + if not root_only: + cat(url_quote(wsgi_get_bytes(environ.get("PATH_INFO", "")).lstrip(b"/"))) + if not strip_querystring: + qs = get_query_string(environ) + if qs: + cat("?" + qs) + return uri_to_iri("".join(tmp)) + + +def host_is_trusted(hostname, trusted_list): + """Checks if a host is trusted against a list. This also takes care + of port normalization. + + .. versionadded:: 0.9 + + :param hostname: the hostname to check + :param trusted_list: a list of hostnames to check against. If a + hostname starts with a dot it will match against + all subdomains as well. + """ + if not hostname: + return False + + if isinstance(trusted_list, string_types): + trusted_list = [trusted_list] + + def _normalize(hostname): + if ":" in hostname: + hostname = hostname.rsplit(":", 1)[0] + return _encode_idna(hostname) + + try: + hostname = _normalize(hostname) + except UnicodeError: + return False + for ref in trusted_list: + if ref.startswith("."): + ref = ref[1:] + suffix_match = True + else: + suffix_match = False + try: + ref = _normalize(ref) + except UnicodeError: + return False + if ref == hostname: + return True + if suffix_match and hostname.endswith(b"." + ref): + return True + return False + + +def get_host(environ, trusted_hosts=None): + """Return the host for the given WSGI environment. This first checks + the ``Host`` header. If it's not present, then ``SERVER_NAME`` and + ``SERVER_PORT`` are used. The host will only contain the port if it + is different than the standard port for the protocol. + + Optionally, verify that the host is trusted using + :func:`host_is_trusted` and raise a + :exc:`~werkzeug.exceptions.SecurityError` if it is not. + + :param environ: The WSGI environment to get the host from. + :param trusted_hosts: A list of trusted hosts. + :return: Host, with port if necessary. + :raise ~werkzeug.exceptions.SecurityError: If the host is not + trusted. + """ + if "HTTP_HOST" in environ: + rv = environ["HTTP_HOST"] + if environ["wsgi.url_scheme"] == "http" and rv.endswith(":80"): + rv = rv[:-3] + elif environ["wsgi.url_scheme"] == "https" and rv.endswith(":443"): + rv = rv[:-4] + else: + rv = environ["SERVER_NAME"] + if (environ["wsgi.url_scheme"], environ["SERVER_PORT"]) not in ( + ("https", "443"), + ("http", "80"), + ): + rv += ":" + environ["SERVER_PORT"] + if trusted_hosts is not None: + if not host_is_trusted(rv, trusted_hosts): + from .exceptions import SecurityError + + raise SecurityError('Host "%s" is not trusted' % rv) + return rv + + +def get_content_length(environ): + """Returns the content length from the WSGI environment as + integer. If it's not available or chunked transfer encoding is used, + ``None`` is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the content length from. + """ + if environ.get("HTTP_TRANSFER_ENCODING", "") == "chunked": + return None + + content_length = environ.get("CONTENT_LENGTH") + if content_length is not None: + try: + return max(0, int(content_length)) + except (ValueError, TypeError): + pass + + +def get_input_stream(environ, safe_fallback=True): + """Returns the input stream from the WSGI environment and wraps it + in the most sensible way possible. The stream returned is not the + raw WSGI stream in most cases but one that is safe to read from + without taking into account the content length. + + If content length is not set, the stream will be empty for safety reasons. + If the WSGI server supports chunked or infinite streams, it should set + the ``wsgi.input_terminated`` value in the WSGI environ to indicate that. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the stream from. + :param safe_fallback: use an empty stream as a safe fallback when the + content length is not set. Disabling this allows infinite streams, + which can be a denial-of-service risk. + """ + stream = environ["wsgi.input"] + content_length = get_content_length(environ) + + # A wsgi extension that tells us if the input is terminated. In + # that case we return the stream unchanged as we know we can safely + # read it until the end. + if environ.get("wsgi.input_terminated"): + return stream + + # If the request doesn't specify a content length, returning the stream is + # potentially dangerous because it could be infinite, malicious or not. If + # safe_fallback is true, return an empty stream instead for safety. + if content_length is None: + return BytesIO() if safe_fallback else stream + + # Otherwise limit the stream to the content length + return LimitedStream(stream, content_length) + + +def get_query_string(environ): + """Returns the `QUERY_STRING` from the WSGI environment. This also takes + care about the WSGI decoding dance on Python 3 environments as a + native string. The string returned will be restricted to ASCII + characters. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the query string from. + """ + qs = wsgi_get_bytes(environ.get("QUERY_STRING", "")) + # QUERY_STRING really should be ascii safe but some browsers + # will send us some unicode stuff (I am looking at you IE). + # In that case we want to urllib quote it badly. + return try_coerce_native(url_quote(qs, safe=":&%=+$!*'(),")) + + +def get_path_info(environ, charset="utf-8", errors="replace"): + """Returns the `PATH_INFO` from the WSGI environment and properly + decodes it. This also takes care about the WSGI decoding dance + on Python 3 environments. if the `charset` is set to `None` a + bytestring is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the path from. + :param charset: the charset for the path info, or `None` if no + decoding should be performed. + :param errors: the decoding error handling. + """ + path = wsgi_get_bytes(environ.get("PATH_INFO", "")) + return to_unicode(path, charset, errors, allow_none_charset=True) + + +def get_script_name(environ, charset="utf-8", errors="replace"): + """Returns the `SCRIPT_NAME` from the WSGI environment and properly + decodes it. This also takes care about the WSGI decoding dance + on Python 3 environments. if the `charset` is set to `None` a + bytestring is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environment object to get the path from. + :param charset: the charset for the path, or `None` if no + decoding should be performed. + :param errors: the decoding error handling. + """ + path = wsgi_get_bytes(environ.get("SCRIPT_NAME", "")) + return to_unicode(path, charset, errors, allow_none_charset=True) + + +def pop_path_info(environ, charset="utf-8", errors="replace"): + """Removes and returns the next segment of `PATH_INFO`, pushing it onto + `SCRIPT_NAME`. Returns `None` if there is nothing left on `PATH_INFO`. + + If the `charset` is set to `None` a bytestring is returned. + + If there are empty segments (``'/foo//bar``) these are ignored but + properly pushed to the `SCRIPT_NAME`: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> pop_path_info(env) + 'a' + >>> env['SCRIPT_NAME'] + '/foo/a' + >>> pop_path_info(env) + 'b' + >>> env['SCRIPT_NAME'] + '/foo/a/b' + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is modified. + """ + path = environ.get("PATH_INFO") + if not path: + return None + + script_name = environ.get("SCRIPT_NAME", "") + + # shift multiple leading slashes over + old_path = path + path = path.lstrip("/") + if path != old_path: + script_name += "/" * (len(old_path) - len(path)) + + if "/" not in path: + environ["PATH_INFO"] = "" + environ["SCRIPT_NAME"] = script_name + path + rv = wsgi_get_bytes(path) + else: + segment, path = path.split("/", 1) + environ["PATH_INFO"] = "/" + path + environ["SCRIPT_NAME"] = script_name + segment + rv = wsgi_get_bytes(segment) + + return to_unicode(rv, charset, errors, allow_none_charset=True) + + +def peek_path_info(environ, charset="utf-8", errors="replace"): + """Returns the next segment on the `PATH_INFO` or `None` if there + is none. Works like :func:`pop_path_info` without modifying the + environment: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> peek_path_info(env) + 'a' + >>> peek_path_info(env) + 'a' + + If the `charset` is set to `None` a bytestring is returned. + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is checked. + """ + segments = environ.get("PATH_INFO", "").lstrip("/").split("/", 1) + if segments: + return to_unicode( + wsgi_get_bytes(segments[0]), charset, errors, allow_none_charset=True + ) + + +def extract_path_info( + environ_or_baseurl, + path_or_url, + charset="utf-8", + errors="werkzeug.url_quote", + collapse_http_schemes=True, +): + """Extracts the path info from the given URL (or WSGI environment) and + path. The path info returned is a unicode string, not a bytestring + suitable for a WSGI environment. The URLs might also be IRIs. + + If the path info could not be determined, `None` is returned. + + Some examples: + + >>> extract_path_info('http://example.com/app', '/app/hello') + u'/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello') + u'/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello', + ... collapse_http_schemes=False) is None + True + + Instead of providing a base URL you can also pass a WSGI environment. + + :param environ_or_baseurl: a WSGI environment dict, a base URL or + base IRI. This is the root of the + application. + :param path_or_url: an absolute path from the server root, a + relative path (in which case it's the path info) + or a full URL. Also accepts IRIs and unicode + parameters. + :param charset: the charset for byte data in URLs + :param errors: the error handling on decode + :param collapse_http_schemes: if set to `False` the algorithm does + not assume that http and https on the + same server point to the same + resource. + + .. versionchanged:: 0.15 + The ``errors`` parameter defaults to leaving invalid bytes + quoted instead of replacing them. + + .. versionadded:: 0.6 + """ + + def _normalize_netloc(scheme, netloc): + parts = netloc.split(u"@", 1)[-1].split(u":", 1) + if len(parts) == 2: + netloc, port = parts + if (scheme == u"http" and port == u"80") or ( + scheme == u"https" and port == u"443" + ): + port = None + else: + netloc = parts[0] + port = None + if port is not None: + netloc += u":" + port + return netloc + + # make sure whatever we are working on is a IRI and parse it + path = uri_to_iri(path_or_url, charset, errors) + if isinstance(environ_or_baseurl, dict): + environ_or_baseurl = get_current_url(environ_or_baseurl, root_only=True) + base_iri = uri_to_iri(environ_or_baseurl, charset, errors) + base_scheme, base_netloc, base_path = url_parse(base_iri)[:3] + cur_scheme, cur_netloc, cur_path, = url_parse(url_join(base_iri, path))[:3] + + # normalize the network location + base_netloc = _normalize_netloc(base_scheme, base_netloc) + cur_netloc = _normalize_netloc(cur_scheme, cur_netloc) + + # is that IRI even on a known HTTP scheme? + if collapse_http_schemes: + for scheme in base_scheme, cur_scheme: + if scheme not in (u"http", u"https"): + return None + else: + if not (base_scheme in (u"http", u"https") and base_scheme == cur_scheme): + return None + + # are the netlocs compatible? + if base_netloc != cur_netloc: + return None + + # are we below the application path? + base_path = base_path.rstrip(u"/") + if not cur_path.startswith(base_path): + return None + + return u"/" + cur_path[len(base_path) :].lstrip(u"/") + + +@implements_iterator +class ClosingIterator(object): + """The WSGI specification requires that all middlewares and gateways + respect the `close` callback of the iterable returned by the application. + Because it is useful to add another close action to a returned iterable + and adding a custom iterable is a boring task this class can be used for + that:: + + return ClosingIterator(app(environ, start_response), [cleanup_session, + cleanup_locals]) + + If there is just one close function it can be passed instead of the list. + + A closing iterator is not needed if the application uses response objects + and finishes the processing if the response is started:: + + try: + return response(environ, start_response) + finally: + cleanup_session() + cleanup_locals() + """ + + def __init__(self, iterable, callbacks=None): + iterator = iter(iterable) + self._next = partial(next, iterator) + if callbacks is None: + callbacks = [] + elif callable(callbacks): + callbacks = [callbacks] + else: + callbacks = list(callbacks) + iterable_close = getattr(iterable, "close", None) + if iterable_close: + callbacks.insert(0, iterable_close) + self._callbacks = callbacks + + def __iter__(self): + return self + + def __next__(self): + return self._next() + + def close(self): + for callback in self._callbacks: + callback() + + +def wrap_file(environ, file, buffer_size=8192): + """Wraps a file. This uses the WSGI server's file wrapper if available + or otherwise the generic :class:`FileWrapper`. + + .. versionadded:: 0.5 + + If the file wrapper from the WSGI server is used it's important to not + iterate over it from inside the application but to pass it through + unchanged. If you want to pass out a file wrapper inside a response + object you have to set :attr:`~BaseResponse.direct_passthrough` to `True`. + + More information about file wrappers are available in :pep:`333`. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + return environ.get("wsgi.file_wrapper", FileWrapper)(file, buffer_size) + + +@implements_iterator +class FileWrapper(object): + """This class can be used to convert a :class:`file`-like object into + an iterable. It yields `buffer_size` blocks until the file is fully + read. + + You should not use this class directly but rather use the + :func:`wrap_file` function that uses the WSGI server's file wrapper + support if it's available. + + .. versionadded:: 0.5 + + If you're using this object together with a :class:`BaseResponse` you have + to use the `direct_passthrough` mode. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + + def __init__(self, file, buffer_size=8192): + self.file = file + self.buffer_size = buffer_size + + def close(self): + if hasattr(self.file, "close"): + self.file.close() + + def seekable(self): + if hasattr(self.file, "seekable"): + return self.file.seekable() + if hasattr(self.file, "seek"): + return True + return False + + def seek(self, *args): + if hasattr(self.file, "seek"): + self.file.seek(*args) + + def tell(self): + if hasattr(self.file, "tell"): + return self.file.tell() + return None + + def __iter__(self): + return self + + def __next__(self): + data = self.file.read(self.buffer_size) + if data: + return data + raise StopIteration() + + +@implements_iterator +class _RangeWrapper(object): + # private for now, but should we make it public in the future ? + + """This class can be used to convert an iterable object into + an iterable that will only yield a piece of the underlying content. + It yields blocks until the underlying stream range is fully read. + The yielded blocks will have a size that can't exceed the original + iterator defined block size, but that can be smaller. + + If you're using this object together with a :class:`BaseResponse` you have + to use the `direct_passthrough` mode. + + :param iterable: an iterable object with a :meth:`__next__` method. + :param start_byte: byte from which read will start. + :param byte_range: how many bytes to read. + """ + + def __init__(self, iterable, start_byte=0, byte_range=None): + self.iterable = iter(iterable) + self.byte_range = byte_range + self.start_byte = start_byte + self.end_byte = None + if byte_range is not None: + self.end_byte = self.start_byte + self.byte_range + self.read_length = 0 + self.seekable = hasattr(iterable, "seekable") and iterable.seekable() + self.end_reached = False + + def __iter__(self): + return self + + def _next_chunk(self): + try: + chunk = next(self.iterable) + self.read_length += len(chunk) + return chunk + except StopIteration: + self.end_reached = True + raise + + def _first_iteration(self): + chunk = None + if self.seekable: + self.iterable.seek(self.start_byte) + self.read_length = self.iterable.tell() + contextual_read_length = self.read_length + else: + while self.read_length <= self.start_byte: + chunk = self._next_chunk() + if chunk is not None: + chunk = chunk[self.start_byte - self.read_length :] + contextual_read_length = self.start_byte + return chunk, contextual_read_length + + def _next(self): + if self.end_reached: + raise StopIteration() + chunk = None + contextual_read_length = self.read_length + if self.read_length == 0: + chunk, contextual_read_length = self._first_iteration() + if chunk is None: + chunk = self._next_chunk() + if self.end_byte is not None and self.read_length >= self.end_byte: + self.end_reached = True + return chunk[: self.end_byte - contextual_read_length] + return chunk + + def __next__(self): + chunk = self._next() + if chunk: + return chunk + self.end_reached = True + raise StopIteration() + + def close(self): + if hasattr(self.iterable, "close"): + self.iterable.close() + + +def _make_chunk_iter(stream, limit, buffer_size): + """Helper for the line and chunk iter functions.""" + if isinstance(stream, (bytes, bytearray, text_type)): + raise TypeError( + "Passed a string or byte object instead of true iterator or stream." + ) + if not hasattr(stream, "read"): + for item in stream: + if item: + yield item + return + if not isinstance(stream, LimitedStream) and limit is not None: + stream = LimitedStream(stream, limit) + _read = stream.read + while 1: + item = _read(buffer_size) + if not item: + break + yield item + + +def make_line_iter(stream, limit=None, buffer_size=10 * 1024, cap_at_buffer=False): + """Safely iterates line-based over an input stream. If the input stream + is not a :class:`LimitedStream` the `limit` parameter is mandatory. + + This uses the stream's :meth:`~file.read` method internally as opposite + to the :meth:`~file.readline` method that is unsafe and can only be used + in violation of the WSGI specification. The same problem applies to the + `__iter__` function of the input stream which calls :meth:`~file.readline` + without arguments. + + If you need line-by-line processing it's strongly recommended to iterate + over the input stream using this helper function. + + .. versionchanged:: 0.8 + This function now ensures that the limit was reached. + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is a :class:`LimitedStream`. + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, "") + if not first_item: + return + + s = make_literal_wrapper(first_item) + empty = s("") + cr = s("\r") + lf = s("\n") + crlf = s("\r\n") + + _iter = chain((first_item,), _iter) + + def _iter_basic_lines(): + _join = empty.join + buffer = [] + while 1: + new_data = next(_iter, "") + if not new_data: + break + new_buf = [] + buf_size = 0 + for item in chain(buffer, new_data.splitlines(True)): + new_buf.append(item) + buf_size += len(item) + if item and item[-1:] in crlf: + yield _join(new_buf) + new_buf = [] + elif cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buffer = new_buf + if buffer: + yield _join(buffer) + + # This hackery is necessary to merge 'foo\r' and '\n' into one item + # of 'foo\r\n' if we were unlucky and we hit a chunk boundary. + previous = empty + for item in _iter_basic_lines(): + if item == lf and previous[-1:] == cr: + previous += item + item = empty + if previous: + yield previous + previous = item + if previous: + yield previous + + +def make_chunk_iter( + stream, separator, limit=None, buffer_size=10 * 1024, cap_at_buffer=False +): + """Works like :func:`make_line_iter` but accepts a separator + which divides chunks. If you want newline based processing + you should use :func:`make_line_iter` instead as it + supports arbitrary newline markers. + + .. versionadded:: 0.8 + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param separator: the separator that divides chunks. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is otherwise already limited). + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, "") + if not first_item: + return + + _iter = chain((first_item,), _iter) + if isinstance(first_item, text_type): + separator = to_unicode(separator) + _split = re.compile(r"(%s)" % re.escape(separator)).split + _join = u"".join + else: + separator = to_bytes(separator) + _split = re.compile(b"(" + re.escape(separator) + b")").split + _join = b"".join + + buffer = [] + while 1: + new_data = next(_iter, "") + if not new_data: + break + chunks = _split(new_data) + new_buf = [] + buf_size = 0 + for item in chain(buffer, chunks): + if item == separator: + yield _join(new_buf) + new_buf = [] + buf_size = 0 + else: + buf_size += len(item) + new_buf.append(item) + + if cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buf_size = len(rv) + + buffer = new_buf + if buffer: + yield _join(buffer) + + +@implements_iterator +class LimitedStream(io.IOBase): + """Wraps a stream so that it doesn't read more than n bytes. If the + stream is exhausted and the caller tries to get more bytes from it + :func:`on_exhausted` is called which by default returns an empty + string. The return value of that function is forwarded + to the reader function. So if it returns an empty string + :meth:`read` will return an empty string as well. + + The limit however must never be higher than what the stream can + output. Otherwise :meth:`readlines` will try to read past the + limit. + + .. admonition:: Note on WSGI compliance + + calls to :meth:`readline` and :meth:`readlines` are not + WSGI compliant because it passes a size argument to the + readline methods. Unfortunately the WSGI PEP is not safely + implementable without a size argument to :meth:`readline` + because there is no EOF marker in the stream. As a result + of that the use of :meth:`readline` is discouraged. + + For the same reason iterating over the :class:`LimitedStream` + is not portable. It internally calls :meth:`readline`. + + We strongly suggest using :meth:`read` only or using the + :func:`make_line_iter` which safely iterates line-based + over a WSGI input stream. + + :param stream: the stream to wrap. + :param limit: the limit for the stream, must not be longer than + what the string can provide if the stream does not + end with `EOF` (like `wsgi.input`) + """ + + def __init__(self, stream, limit): + self._read = stream.read + self._readline = stream.readline + self._pos = 0 + self.limit = limit + + def __iter__(self): + return self + + @property + def is_exhausted(self): + """If the stream is exhausted this attribute is `True`.""" + return self._pos >= self.limit + + def on_exhausted(self): + """This is called when the stream tries to read past the limit. + The return value of this function is returned from the reading + function. + """ + # Read null bytes from the stream so that we get the + # correct end of stream marker. + return self._read(0) + + def on_disconnect(self): + """What should happen if a disconnect is detected? The return + value of this function is returned from read functions in case + the client went away. By default a + :exc:`~werkzeug.exceptions.ClientDisconnected` exception is raised. + """ + from .exceptions import ClientDisconnected + + raise ClientDisconnected() + + def exhaust(self, chunk_size=1024 * 64): + """Exhaust the stream. This consumes all the data left until the + limit is reached. + + :param chunk_size: the size for a chunk. It will read the chunk + until the stream is exhausted and throw away + the results. + """ + to_read = self.limit - self._pos + chunk = chunk_size + while to_read > 0: + chunk = min(to_read, chunk) + self.read(chunk) + to_read -= chunk + + def read(self, size=None): + """Read `size` bytes or if size is not provided everything is read. + + :param size: the number of bytes read. + """ + if self._pos >= self.limit: + return self.on_exhausted() + if size is None or size == -1: # -1 is for consistence with file + size = self.limit + to_read = min(self.limit - self._pos, size) + try: + read = self._read(to_read) + except (IOError, ValueError): + return self.on_disconnect() + if to_read and len(read) != to_read: + return self.on_disconnect() + self._pos += len(read) + return read + + def readline(self, size=None): + """Reads one line from the stream.""" + if self._pos >= self.limit: + return self.on_exhausted() + if size is None: + size = self.limit - self._pos + else: + size = min(size, self.limit - self._pos) + try: + line = self._readline(size) + except (ValueError, IOError): + return self.on_disconnect() + if size and not line: + return self.on_disconnect() + self._pos += len(line) + return line + + def readlines(self, size=None): + """Reads a file into a list of strings. It calls :meth:`readline` + until the file is read to the end. It does support the optional + `size` argument if the underlaying stream supports it for + `readline`. + """ + last_pos = self._pos + result = [] + if size is not None: + end = min(self.limit, last_pos + size) + else: + end = self.limit + while 1: + if size is not None: + size -= last_pos - self._pos + if self._pos >= end: + break + result.append(self.readline(size)) + if size is not None: + last_pos = self._pos + return result + + def tell(self): + """Returns the position of the stream. + + .. versionadded:: 0.9 + """ + return self._pos + + def __next__(self): + line = self.readline() + if not line: + raise StopIteration() + return line + + def readable(self): + return True + + +# DEPRECATED +from .middleware.dispatcher import DispatcherMiddleware as _DispatcherMiddleware +from .middleware.http_proxy import ProxyMiddleware as _ProxyMiddleware +from .middleware.shared_data import SharedDataMiddleware as _SharedDataMiddleware + + +class ProxyMiddleware(_ProxyMiddleware): + """ + .. deprecated:: 0.15 + ``werkzeug.wsgi.ProxyMiddleware`` has moved to + :mod:`werkzeug.middleware.http_proxy`. This import will be + removed in 1.0. + """ + + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.wsgi.ProxyMiddleware' has moved to 'werkzeug" + ".middleware.http_proxy.ProxyMiddleware'. This import is" + " deprecated as of version 0.15 and will be removed in" + " version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(ProxyMiddleware, self).__init__(*args, **kwargs) + + +class SharedDataMiddleware(_SharedDataMiddleware): + """ + .. deprecated:: 0.15 + ``werkzeug.wsgi.SharedDataMiddleware`` has moved to + :mod:`werkzeug.middleware.shared_data`. This import will be + removed in 1.0. + """ + + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.wsgi.SharedDataMiddleware' has moved to" + " 'werkzeug.middleware.shared_data.SharedDataMiddleware'." + " This import is deprecated as of version 0.15 and will be" + " removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(SharedDataMiddleware, self).__init__(*args, **kwargs) + + +class DispatcherMiddleware(_DispatcherMiddleware): + """ + .. deprecated:: 0.15 + ``werkzeug.wsgi.DispatcherMiddleware`` has moved to + :mod:`werkzeug.middleware.dispatcher`. This import will be + removed in 1.0. + """ + + def __init__(self, *args, **kwargs): + warnings.warn( + "'werkzeug.wsgi.DispatcherMiddleware' has moved to" + " 'werkzeug.middleware.dispatcher.DispatcherMiddleware'." + " This import is deprecated as of version 0.15 and will be" + " removed in version 1.0.", + DeprecationWarning, + stacklevel=2, + ) + super(DispatcherMiddleware, self).__init__(*args, **kwargs) diff --git a/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt new file mode 100644 index 0000000..c3441e6 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +"wheel" copyright (c) 2012-2014 Daniel Holth and +contributors. + +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA new file mode 100644 index 0000000..3685e11 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: wheel +Version: 0.33.4 +Summary: A built-package format for Python. +Home-page: https://github.com/pypa/wheel +Author: Daniel Holth +Author-email: dholth@fastmail.fm +Maintainer: Alex Grönholm +Maintainer-email: alex.gronholm@nextday.fi +License: MIT +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Keywords: wheel,packaging +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: test +Requires-Dist: pytest (>=3.0.0) ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' + +wheel +===== + +This library is the reference implementation of the Python wheel packaging +standard, as defined in `PEP 427`_. + +It has two different roles: + +#. A setuptools_ extension for building wheels that provides the + ``bdist_wheel`` setuptools command +#. A command line tool for working with wheel files + +It should be noted that wheel is **not** intended to be used as a library, and +as such there is no stable, public API. + +.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ +.. _setuptools: https://pypi.org/project/setuptools/ + + +Code of Conduct +--------------- + +Everyone interacting in the wheel project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD new file mode 100644 index 0000000..b894906 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD @@ -0,0 +1,32 @@ +../../../bin/wheel,sha256=nL1WFQsK6vyHEN-gV5h8HkNFT4pGFAf3C-lVCB0T624,277 +wheel-0.33.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel-0.33.4.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 +wheel-0.33.4.dist-info/METADATA,sha256=wyJg2oitG9m-Uh5ia99JynhzPDzo2cJmrCSsqYpRMtc,2082 +wheel-0.33.4.dist-info/RECORD,, +wheel-0.33.4.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 +wheel-0.33.4.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108 +wheel-0.33.4.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 +wheel/__init__.py,sha256=gdfDa6ufU3P8afREFDBD26jo-ncuKtumgvlnZIGSmKc,96 +wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417 +wheel/__pycache__/__init__.cpython-37.pyc,, +wheel/__pycache__/__main__.cpython-37.pyc,, +wheel/__pycache__/bdist_wheel.cpython-37.pyc,, +wheel/__pycache__/metadata.cpython-37.pyc,, +wheel/__pycache__/pep425tags.cpython-37.pyc,, +wheel/__pycache__/pkginfo.cpython-37.pyc,, +wheel/__pycache__/util.cpython-37.pyc,, +wheel/__pycache__/wheelfile.cpython-37.pyc,, +wheel/bdist_wheel.py,sha256=U3ljAOGgc8UGMKqxOf5YEKE1W-nt99X6RemMi-poBB8,14757 +wheel/cli/__init__.py,sha256=GWSoGUpRabTf8bk3FsNTPrc5Fsr8YOv2dX55iY2W7eY,2572 +wheel/cli/__pycache__/__init__.cpython-37.pyc,, +wheel/cli/__pycache__/convert.cpython-37.pyc,, +wheel/cli/__pycache__/pack.cpython-37.pyc,, +wheel/cli/__pycache__/unpack.cpython-37.pyc,, +wheel/cli/convert.py,sha256=me0l6G4gSw-EBVhzjSr7yWYWBp9spMz7mnXlyJTiXso,9497 +wheel/cli/pack.py,sha256=vkvZc4-rRZyWiwc6sHjpqIjzwDRMEF5u3JUNU9NY_jA,2263 +wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673 +wheel/metadata.py,sha256=uBv2aOz4U2sERF834C8DeNo235drcsp3ypTzT7MTWEA,4699 +wheel/pep425tags.py,sha256=Jdjbnq17kqwPRKJCMb2E1VccNgnC3H6iQL7VGaxkPao,5908 +wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 +wheel/util.py,sha256=zwVIk-9qWVQLRMgkgQTMp4TRE4HY03-tCUxLrtCpsfU,924 +wheel/wheelfile.py,sha256=Mtt6mUaea-wABqtN5SW3Rn6bVvw-bdcSKaR2SjWZLG4,7222 diff --git a/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL new file mode 100644 index 0000000..78e6f69 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt new file mode 100644 index 0000000..b27acad --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt @@ -0,0 +1,6 @@ +[console_scripts] +wheel = wheel.cli:main + +[distutils.commands] +bdist_wheel = wheel.bdist_wheel:bdist_wheel + diff --git a/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt new file mode 100644 index 0000000..2309722 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt @@ -0,0 +1 @@ +wheel diff --git a/backend/venv/lib/python3.7/site-packages/wheel/__init__.py b/backend/venv/lib/python3.7/site-packages/wheel/__init__.py new file mode 100644 index 0000000..0f8ca70 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/__init__.py @@ -0,0 +1,2 @@ +# __variables__ with double-quoted values will be available in setup.py: +__version__ = "0.33.4" diff --git a/backend/venv/lib/python3.7/site-packages/wheel/__main__.py b/backend/venv/lib/python3.7/site-packages/wheel/__main__.py new file mode 100644 index 0000000..b3773a2 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/__main__.py @@ -0,0 +1,19 @@ +""" +Wheel command line tool (enable python -m wheel syntax) +""" + +import sys + + +def main(): # needed for console script + if __package__ == '': + # To be able to run 'python wheel-0.9.whl/wheel': + import os.path + path = os.path.dirname(os.path.dirname(__file__)) + sys.path[0:0] = [path] + import wheel.cli + sys.exit(wheel.cli.main()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..436e85eb8605a49bd2bd5a212372b0cc2225ca2a GIT binary patch literal 210 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8f7698e4b7ca4de0b8fada0d92b427f105a6e21 GIT binary patch literal 3786 zcmZu!OLH5?5uSZuu~>j0Ma5DnWxKW#DB*0MH~Iux9o#v%S6jb$?&;lc}kI z;rI9dTzd6#ma+fR#pLJUbDETdp~lS|#pqH}SU0t+K_0 zbL8{V&}vn<$IIWaR=|B;!LiB%Ud6G-YkUgFDPHH(IM(?LKZoNqx1X}+Z2wyDEKL&? zc2gO4(%!C+I_|B9X~O42orXQJH?Q7SuHSc)yt(_!2T*B-5f*FU#~wU&~;sVI?cRd`XBi5@T9%{1;6o=T+_yy+Iz6R&C^#^$}M&10ntJIx9Q zF8+hbX_$H=7Bd;|Mp`WHMsl$W?BM?5mR$U5v)#U}ZuD;L@{c<0Z1>t#-MziODU%Po zH}2e7e72ay*?innI!coH_4VHC&3?DPxVIrhGM>5u6HNQR${Fxl8CV)P9@#n27}y%99a;nAy}`)d^a!Pa zo4fKZw{!Ob!@0d#&fSZQ(0$H;uJ?j*2ROR@<=@95;o*~U$mUnz;N4JZiM$@=c@{|} z_(?F;WPL$;@T>2>ysTcWHvM9X5?czD?#PZ%MRjbI5}+sX?`v zST)N>XX*PgtI`oTGOhPK(` zXdCrJNLaZgH@TZzU7KQ`JMv3jA|$wXk-?6`%Q>p*mN}QZ+^4mHv;VFJZig1$Iy-QA zC3orm$j0^`Ua;)|7zV(w8eKv82O)kBN0f9LtFBD9!YEXz*KDpi<|iI^h+86gK)f~A zIE8=XO4v9N|3=dok9r&%*JQdIbD`!R5h2k|gJ7c>!h9msLSQzJV4Va%j1@dM@y@gx zer>kg4PTyklX^7>BNb+mqKt!MW2dhen>&iQmIy~|W%?jA2Ewl!jUO7pqZ=q}u#TzL zi68Ke!X&Az-dJ~~jbp!l`jg&RbA7KF(%1H~3;XLI_kb>z4c}c68{A=~u(3U_8W7|HcHN0KE_F+(sHB zk%u-?73sW8v%Ac+z3Cje5R=jnVqvb3#6wH|Q+v5{X#J&5lyg)bvOx)n>HU^HVV^VY z>&j7(LvneU``<8L`LjLn_CLuzr1f1CN_pV#U)9yTocl4}kGmo6Rt7;{$%8I=Qya3^ zW%+F$K%6Q|Z2McJzJxg0Jh;RL)x0YIg#=-?*A_k`G24o?G1Q-#tjs?jiC*8qma{o@ zCQ14eHd70FU#}iB4XHK(@{~XzL`bVIu`Dp%hO;VZgGpAC31}az{j)jYFD22|S3J5$ zYOgR@|1wyZKC%trIaZ{lB<)0ry0PQmqNtwmZ7Xpv8z}XdzdN{P6vi;i-B-aSi z6(b<_B_mJ}A{#>Fa0k~V?ozEDdEBEmVU2Cyq^dE^+tM%4aZ;{#(r7>YT`%sWT!iV4 z4nfRO5BwU%35q}|w54;+a6Vi+&>QIRt}k5wps2`buWdMQl%SNtMJZC9I4-8uj+E&- zI0~>vndp~xba(!Cvs{#tbPuT%#9(oda<3x_2W>`C-iVax^KO$FPxQ!_!sCLDO;=ts z*3nfaX!|rsvvBF%XAzp7Aha|38ji=*1xySG_&_DVTqi_;6VO<}%5fo*9#BtW*ihnR zREQ+*Xt02crue_d9bDNXG)UHu93X{%FTjfqFHy{gOnXP=@g4k&@kbyt1S@g33$CO_ zO!mN%KKF;#QH57{05%108m@X^C}zc!h0&jJ3lmP#{$=Attu|f}fMe{&y4HZ}kDnD* z@I5fAg$o33%R5+-cQG{sxkTs7G*J{FRwP_W+!JbC-wE}9S>aQ-_hgh298|3GK0WjR zQ?q1%kvDPP3XVZnt#c=;sBLVvQ0d1dj&e7KPIqhaD$Hn%k&d~(Gg7aBs>caXNj_A} z1#-S^_BLmVa=XpbPP<){Q?+2YsR;vxErt9HCx(k!<#ASwXsz5yw=xh!%YXFwvnM}q zKY282N2&cA(G=CF35t2ki5xTjn#R&!+DiFOBJL4WDtgp48Rpx*U31~1<4^fj|84&r Gf98L96aO^; literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cb23e57c49b7d03796485db74b403bfbfe3f327 GIT binary patch literal 4721 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 LhP@GY#`XROCmfB^ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ce8ee9df9c948c8ef6e8045b548ad6ee789511a GIT binary patch literal 1581 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py b/backend/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py new file mode 100644 index 0000000..c79307b --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py @@ -0,0 +1,372 @@ +""" +Create a wheel (.whl) distribution. + +A wheel is a built archive format. +""" + +import os +import shutil +import sys +import re +from email.generator import Generator +from distutils.core import Command +from distutils.sysconfig import get_python_version +from distutils import log as logger +from glob import iglob +from shutil import rmtree +from warnings import warn + +import pkg_resources + +from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform +from .pkginfo import write_pkg_info +from .metadata import pkginfo_to_metadata +from .wheelfile import WheelFile +from . import pep425tags +from . import __version__ as wheel_version + + +safe_name = pkg_resources.safe_name +safe_version = pkg_resources.safe_version + +PY_LIMITED_API_PATTERN = r'cp3\d' + + +def safer_name(name): + return safe_name(name).replace('-', '_') + + +def safer_version(version): + return safe_version(version).replace('-', '_') + + +class bdist_wheel(Command): + + description = 'create a wheel distribution' + + user_options = [('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_platform()), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ('relative', None, + "build the archive using relative paths " + "(default: false)"), + ('owner=', 'u', + "Owner name used when creating a tar file" + " [default: current user]"), + ('group=', 'g', + "Group name used when creating a tar file" + " [default: current group]"), + ('universal', None, + "make a universal wheel" + " (default: false)"), + ('python-tag=', None, + "Python implementation compatibility tag" + " (default: py%s)" % get_impl_ver()[0]), + ('build-number=', None, + "Build number for this particular version. " + "As specified in PEP-0427, this must start with a digit. " + "[default: None]"), + ('py-limited-api=', None, + "Python tag (cp32|cp33|cpNN) for abi3 wheel tag" + " (default: false)"), + ] + + boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal'] + + def initialize_options(self): + self.bdist_dir = None + self.data_dir = None + self.plat_name = None + self.plat_tag = None + self.format = 'zip' + self.keep_temp = False + self.dist_dir = None + self.egginfo_dir = None + self.root_is_pure = None + self.skip_build = None + self.relative = False + self.owner = None + self.group = None + self.universal = False + self.python_tag = 'py' + get_impl_ver()[0] + self.build_number = None + self.py_limited_api = False + self.plat_name_supplied = False + + def finalize_options(self): + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'wheel') + + self.data_dir = self.wheel_dist_name + '.data' + self.plat_name_supplied = self.plat_name is not None + + need_options = ('dist_dir', 'plat_name', 'skip_build') + + self.set_undefined_options('bdist', + *zip(need_options, need_options)) + + self.root_is_pure = not (self.distribution.has_ext_modules() + or self.distribution.has_c_libraries()) + + if self.py_limited_api and not re.match(PY_LIMITED_API_PATTERN, self.py_limited_api): + raise ValueError("py-limited-api must match '%s'" % PY_LIMITED_API_PATTERN) + + # Support legacy [wheel] section for setting universal + wheel = self.distribution.get_option_dict('wheel') + if 'universal' in wheel: + # please don't define this in your global configs + logger.warn('The [wheel] section is deprecated. Use [bdist_wheel] instead.') + val = wheel['universal'][1].strip() + if val.lower() in ('1', 'true', 'yes'): + self.universal = True + + if self.build_number is not None and not self.build_number[:1].isdigit(): + raise ValueError("Build tag (build-number) must start with a digit.") + + @property + def wheel_dist_name(self): + """Return distribution full name with - replaced with _""" + components = (safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + if self.build_number: + components += (self.build_number,) + return '-'.join(components) + + def get_tag(self): + # bdist sets self.plat_name if unset, we should only use it for purepy + # wheels if the user supplied it. + if self.plat_name_supplied: + plat_name = self.plat_name + elif self.root_is_pure: + plat_name = 'any' + else: + plat_name = self.plat_name or get_platform() + if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: + plat_name = 'linux_i686' + plat_name = plat_name.replace('-', '_').replace('.', '_') + + if self.root_is_pure: + if self.universal: + impl = 'py2.py3' + else: + impl = self.python_tag + tag = (impl, 'none', plat_name) + else: + impl_name = get_abbr_impl() + impl_ver = get_impl_ver() + impl = impl_name + impl_ver + # We don't work on CPython 3.1, 3.0. + if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'): + impl = self.py_limited_api + abi_tag = 'abi3' + else: + abi_tag = str(get_abi_tag()).lower() + tag = (impl, abi_tag, plat_name) + supported_tags = pep425tags.get_supported( + supplied_platform=plat_name if self.plat_name_supplied else None) + # XXX switch to this alternate implementation for non-pure: + if not self.py_limited_api: + assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0]) + assert tag in supported_tags, "would build wheel with unsupported tag {}".format(tag) + return tag + + def run(self): + build_scripts = self.reinitialize_command('build_scripts') + build_scripts.executable = 'python' + build_scripts.force = True + + build_ext = self.reinitialize_command('build_ext') + build_ext.inplace = False + + if not self.skip_build: + self.run_command('build') + + install = self.reinitialize_command('install', + reinit_subcommands=True) + install.root = self.bdist_dir + install.compile = False + install.skip_build = self.skip_build + install.warn_dir = False + + # A wheel without setuptools scripts is more cross-platform. + # Use the (undocumented) `no_ep` option to setuptools' + # install_scripts command to avoid creating entry point scripts. + install_scripts = self.reinitialize_command('install_scripts') + install_scripts.no_ep = True + + # Use a custom scheme for the archive, because we have to decide + # at installation time which scheme to use. + for key in ('headers', 'scripts', 'data', 'purelib', 'platlib'): + setattr(install, + 'install_' + key, + os.path.join(self.data_dir, key)) + + basedir_observed = '' + + if os.name == 'nt': + # win32 barfs if any of these are ''; could be '.'? + # (distutils.command.install:change_roots bug) + basedir_observed = os.path.normpath(os.path.join(self.data_dir, '..')) + self.install_libbase = self.install_lib = basedir_observed + + setattr(install, + 'install_purelib' if self.root_is_pure else 'install_platlib', + basedir_observed) + + logger.info("installing to %s", self.bdist_dir) + + self.run_command('install') + + impl_tag, abi_tag, plat_tag = self.get_tag() + archive_basename = "{}-{}-{}-{}".format(self.wheel_dist_name, impl_tag, abi_tag, plat_tag) + if not self.relative: + archive_root = self.bdist_dir + else: + archive_root = os.path.join( + self.bdist_dir, + self._ensure_relative(install.install_base)) + + self.set_undefined_options('install_egg_info', ('target', 'egginfo_dir')) + distinfo_dirname = '{}-{}.dist-info'.format( + safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + distinfo_dir = os.path.join(self.bdist_dir, distinfo_dirname) + self.egg2dist(self.egginfo_dir, distinfo_dir) + + self.write_wheelfile(distinfo_dir) + + # Make the archive + if not os.path.exists(self.dist_dir): + os.makedirs(self.dist_dir) + + wheel_path = os.path.join(self.dist_dir, archive_basename + '.whl') + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(archive_root) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_wheel', get_python_version(), wheel_path)) + + if not self.keep_temp: + logger.info('removing %s', self.bdist_dir) + if not self.dry_run: + rmtree(self.bdist_dir) + + def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): + from email.message import Message + msg = Message() + msg['Wheel-Version'] = '1.0' # of the spec + msg['Generator'] = generator + msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() + if self.build_number is not None: + msg['Build'] = self.build_number + + # Doesn't work for bdist_wininst + impl_tag, abi_tag, plat_tag = self.get_tag() + for impl in impl_tag.split('.'): + for abi in abi_tag.split('.'): + for plat in plat_tag.split('.'): + msg['Tag'] = '-'.join((impl, abi, plat)) + + wheelfile_path = os.path.join(wheelfile_base, 'WHEEL') + logger.info('creating %s', wheelfile_path) + with open(wheelfile_path, 'w') as f: + Generator(f, maxheaderlen=0).flatten(msg) + + def _ensure_relative(self, path): + # copied from dir_util, deleted + drive, path = os.path.splitdrive(path) + if path[0:1] == os.sep: + path = drive + path[1:] + return path + + @property + def license_paths(self): + metadata = self.distribution.get_option_dict('metadata') + files = set() + patterns = sorted({ + option for option in metadata.get('license_files', ('', ''))[1].split() + }) + + if 'license_file' in metadata: + warn('The "license_file" option is deprecated. Use "license_files" instead.', + DeprecationWarning) + files.add(metadata['license_file'][1]) + + if 'license_file' not in metadata and 'license_files' not in metadata: + patterns = ('LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*') + + for pattern in patterns: + for path in iglob(pattern): + if path not in files and os.path.isfile(path): + logger.info('adding license file "%s" (matched pattern "%s")', path, pattern) + files.add(path) + + return files + + def egg2dist(self, egginfo_path, distinfo_path): + """Convert an .egg-info directory into a .dist-info directory""" + def adios(p): + """Appropriately delete directory, file or link.""" + if os.path.exists(p) and not os.path.islink(p) and os.path.isdir(p): + shutil.rmtree(p) + elif os.path.exists(p): + os.unlink(p) + + adios(distinfo_path) + + if not os.path.exists(egginfo_path): + # There is no egg-info. This is probably because the egg-info + # file/directory is not named matching the distribution name used + # to name the archive file. Check for this case and report + # accordingly. + import glob + pat = os.path.join(os.path.dirname(egginfo_path), '*.egg-info') + possible = glob.glob(pat) + err = "Egg metadata expected at %s but not found" % (egginfo_path,) + if possible: + alt = os.path.basename(possible[0]) + err += " (%s found - possible misnamed archive file?)" % (alt,) + + raise ValueError(err) + + if os.path.isfile(egginfo_path): + # .egg-info is a single file + pkginfo_path = egginfo_path + pkg_info = pkginfo_to_metadata(egginfo_path, egginfo_path) + os.mkdir(distinfo_path) + else: + # .egg-info is a directory + pkginfo_path = os.path.join(egginfo_path, 'PKG-INFO') + pkg_info = pkginfo_to_metadata(egginfo_path, pkginfo_path) + + # ignore common egg metadata that is useless to wheel + shutil.copytree(egginfo_path, distinfo_path, + ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt', + 'not-zip-safe'} + ) + + # delete dependency_links if it is only whitespace + dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt') + with open(dependency_links_path, 'r') as dependency_links_file: + dependency_links = dependency_links_file.read().strip() + if not dependency_links: + adios(dependency_links_path) + + write_pkg_info(os.path.join(distinfo_path, 'METADATA'), pkg_info) + + for license_path in self.license_paths: + filename = os.path.basename(license_path) + shutil.copy(license_path, os.path.join(distinfo_path, filename)) + + adios(egginfo_path) diff --git a/backend/venv/lib/python3.7/site-packages/wheel/cli/__init__.py b/backend/venv/lib/python3.7/site-packages/wheel/cli/__init__.py new file mode 100644 index 0000000..95740bf --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/cli/__init__.py @@ -0,0 +1,88 @@ +""" +Wheel command-line utility. +""" + +from __future__ import print_function + +import argparse +import os +import sys + + +def require_pkgresources(name): + try: + import pkg_resources # noqa: F401 + except ImportError: + raise RuntimeError("'{0}' needs pkg_resources (part of setuptools).".format(name)) + + +class WheelError(Exception): + pass + + +def unpack_f(args): + from .unpack import unpack + unpack(args.wheelfile, args.dest) + + +def pack_f(args): + from .pack import pack + pack(args.directory, args.dest_dir, args.build_number) + + +def convert_f(args): + from .convert import convert + convert(args.files, args.dest_dir, args.verbose) + + +def version_f(args): + from .. import __version__ + print("wheel %s" % __version__) + + +def parser(): + p = argparse.ArgumentParser() + s = p.add_subparsers(help="commands") + + unpack_parser = s.add_parser('unpack', help='Unpack wheel') + unpack_parser.add_argument('--dest', '-d', help='Destination directory', + default='.') + unpack_parser.add_argument('wheelfile', help='Wheel file') + unpack_parser.set_defaults(func=unpack_f) + + repack_parser = s.add_parser('pack', help='Repack wheel') + repack_parser.add_argument('directory', help='Root directory of the unpacked wheel') + repack_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store the wheel (default %(default)s)") + repack_parser.add_argument('--build-number', help="Build tag to use in the wheel name") + repack_parser.set_defaults(func=pack_f) + + convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel') + convert_parser.add_argument('files', nargs='*', help='Files to convert') + convert_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store wheels (default %(default)s)") + convert_parser.add_argument('--verbose', '-v', action='store_true') + convert_parser.set_defaults(func=convert_f) + + version_parser = s.add_parser('version', help='Print version and exit') + version_parser.set_defaults(func=version_f) + + help_parser = s.add_parser('help', help='Show this help') + help_parser.set_defaults(func=lambda args: p.print_help()) + + return p + + +def main(): + p = parser() + args = p.parse_args() + if not hasattr(args, 'func'): + p.print_help() + else: + try: + args.func(args) + return 0 + except WheelError as e: + print(e, file=sys.stderr) + + return 1 diff --git a/backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bee962bdc35ec6c66dff447dacbc5420610d6f7 GIT binary patch literal 3052 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.+?)-(?P.+?) + (-(?Ppy\d\.\d) + (-(?P.+?))? + )?.egg$''', re.VERBOSE) + + +class _bdist_wheel_tag(bdist_wheel): + # allow the client to override the default generated wheel tag + # The default bdist_wheel implementation uses python and abi tags + # of the running python process. This is not suitable for + # generating/repackaging prebuild binaries. + + full_tag_supplied = False + full_tag = None # None or a (pytag, soabitag, plattag) triple + + def get_tag(self): + if self.full_tag_supplied and self.full_tag is not None: + return self.full_tag + else: + return bdist_wheel.get_tag(self) + + +def egg2wheel(egg_path, dest_dir): + filename = os.path.basename(egg_path) + match = egg_info_re.match(filename) + if not match: + raise WheelError('Invalid egg file name: {}'.format(filename)) + + egg_info = match.groupdict() + dir = tempfile.mkdtemp(suffix="_e2w") + if os.path.isfile(egg_path): + # assume we have a bdist_egg otherwise + with zipfile.ZipFile(egg_path) as egg: + egg.extractall(dir) + else: + # support buildout-style installed eggs directories + for pth in os.listdir(egg_path): + src = os.path.join(egg_path, pth) + if os.path.isfile(src): + shutil.copy2(src, dir) + else: + shutil.copytree(src, os.path.join(dir, pth)) + + pyver = egg_info['pyver'] + if pyver: + pyver = egg_info['pyver'] = pyver.replace('.', '') + + arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_') + + # assume all binary eggs are for CPython + abi = 'cp' + pyver[2:] if arch != 'any' else 'none' + + root_is_purelib = egg_info['arch'] is None + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = egg_info['arch'] or 'any' + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info)) + bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='egg2wheel') + wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info) + with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def parse_wininst_info(wininfo_name, egginfo_name): + """Extract metadata from filenames. + + Extracts the 4 metadataitems needed (name, version, pyversion, arch) from + the installer filename and the name of the egg-info directory embedded in + the zipfile (if any). + + The egginfo filename has the format:: + + name-ver(-pyver)(-arch).egg-info + + The installer filename has the format:: + + name-ver.arch(-pyver).exe + + Some things to note: + + 1. The installer filename is not definitive. An installer can be renamed + and work perfectly well as an installer. So more reliable data should + be used whenever possible. + 2. The egg-info data should be preferred for the name and version, because + these come straight from the distutils metadata, and are mandatory. + 3. The pyver from the egg-info data should be ignored, as it is + constructed from the version of Python used to build the installer, + which is irrelevant - the installer filename is correct here (even to + the point that when it's not there, any version is implied). + 4. The architecture must be taken from the installer filename, as it is + not included in the egg-info data. + 5. Architecture-neutral installers still have an architecture because the + installer format itself (being executable) is architecture-specific. We + should therefore ignore the architecture if the content is pure-python. + """ + + egginfo = None + if egginfo_name: + egginfo = egg_info_re.search(egginfo_name) + if not egginfo: + raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) + + # Parse the wininst filename + # 1. Distribution name (up to the first '-') + w_name, sep, rest = wininfo_name.partition('-') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + # Strip '.exe' + rest = rest[:-4] + # 2. Python version (from the last '-', must start with 'py') + rest2, sep, w_pyver = rest.rpartition('-') + if sep and w_pyver.startswith('py'): + rest = rest2 + w_pyver = w_pyver.replace('.', '') + else: + # Not version specific - use py2.py3. While it is possible that + # pure-Python code is not compatible with both Python 2 and 3, there + # is no way of knowing from the wininst format, so we assume the best + # here (the user can always manually rename the wheel to be more + # restrictive if needed). + w_pyver = 'py2.py3' + # 3. Version and architecture + w_ver, sep, w_arch = rest.rpartition('.') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + if egginfo: + w_name = egginfo.group('name') + w_ver = egginfo.group('ver') + + return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver} + + +def wininst2wheel(path, dest_dir): + with zipfile.ZipFile(path) as bdw: + # Search for egg-info in the archive + egginfo_name = None + for filename in bdw.namelist(): + if '.egg-info' in filename: + egginfo_name = filename + break + + info = parse_wininst_info(os.path.basename(path), egginfo_name) + + root_is_purelib = True + for zipinfo in bdw.infolist(): + if zipinfo.filename.startswith('PLATLIB'): + root_is_purelib = False + break + if root_is_purelib: + paths = {'purelib': ''} + else: + paths = {'platlib': ''} + + dist_info = "%(name)s-%(ver)s" % info + datadir = "%s.data/" % dist_info + + # rewrite paths to trick ZipFile into extracting an egg + # XXX grab wininst .ini - between .exe, padding, and first zip file. + members = [] + egginfo_name = '' + for zipinfo in bdw.infolist(): + key, basename = zipinfo.filename.split('/', 1) + key = key.lower() + basepath = paths.get(key, None) + if basepath is None: + basepath = datadir + key.lower() + '/' + oldname = zipinfo.filename + newname = basepath + basename + zipinfo.filename = newname + del bdw.NameToInfo[oldname] + bdw.NameToInfo[newname] = zipinfo + # Collect member names, but omit '' (from an entry like "PLATLIB/" + if newname: + members.append(newname) + # Remember egg-info name for the egg2dist call below + if not egginfo_name: + if newname.endswith('.egg-info'): + egginfo_name = newname + elif '.egg-info/' in newname: + egginfo_name, sep, _ = newname.rpartition('/') + dir = tempfile.mkdtemp(suffix="_b2w") + bdw.extractall(dir, members) + + # egg2wheel + abi = 'none' + pyver = info['pyver'] + arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_') + # Wininst installers always have arch even if they are not + # architecture-specific (because the format itself is). + # So, assume the content is architecture-neutral if root is purelib. + if root_is_purelib: + arch = 'any' + # If the installer is architecture-specific, it's almost certainly also + # CPython-specific. + if arch != 'any': + pyver = pyver.replace('py', 'cp') + wheel_name = '-'.join((dist_info, pyver, abi, arch)) + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = info['arch'] or 'any' + + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) + bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') + + wheel_path = os.path.join(dest_dir, wheel_name) + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def convert(files, dest_dir, verbose): + # Only support wheel convert if pkg_resources is present + require_pkgresources('wheel convert') + + for pat in files: + for installer in iglob(pat): + if os.path.splitext(installer)[1] == '.egg': + conv = egg2wheel + else: + conv = wininst2wheel + + if verbose: + print("{}... ".format(installer)) + sys.stdout.flush() + + conv(installer, dest_dir) + if verbose: + print("OK") diff --git a/backend/venv/lib/python3.7/site-packages/wheel/cli/pack.py b/backend/venv/lib/python3.7/site-packages/wheel/cli/pack.py new file mode 100644 index 0000000..af6e81c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/cli/pack.py @@ -0,0 +1,58 @@ +from __future__ import print_function + +import os.path +import re +import sys + +from wheel.cli import WheelError +from wheel.wheelfile import WheelFile + +DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") + + +def pack(directory, dest_dir, build_number): + """Repack a previously unpacked wheel directory into a new wheel file. + + The .dist-info/WHEEL file must contain one or more tags so that the target + wheel file name can be determined. + + :param directory: The unpacked wheel directory + :param dest_dir: Destination directory (defaults to the current directory) + """ + # Find the .dist-info directory + dist_info_dirs = [fn for fn in os.listdir(directory) + if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)] + if len(dist_info_dirs) > 1: + raise WheelError('Multiple .dist-info directories found in {}'.format(directory)) + elif not dist_info_dirs: + raise WheelError('No .dist-info directories found in {}'.format(directory)) + + # Determine the target wheel filename + dist_info_dir = dist_info_dirs[0] + name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') + + # Add the build number if specific + if build_number: + name_version += '-' + build_number + + # Read the tags from .dist-info/WHEEL + with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: + tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] + if not tags: + raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename' + .format(dist_info_dir)) + + # Reassemble the tags for the wheel file + impls = sorted({tag.split('-')[0] for tag in tags}) + abivers = sorted({tag.split('-')[1] for tag in tags}) + platforms = sorted({tag.split('-')[2] for tag in tags}) + tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)]) + + # Repack the wheel + wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline)) + with WheelFile(wheel_path, 'w') as wf: + print("Repacking wheel as {}...".format(wheel_path), end='') + sys.stdout.flush() + wf.write_files(directory) + + print('OK') diff --git a/backend/venv/lib/python3.7/site-packages/wheel/cli/unpack.py b/backend/venv/lib/python3.7/site-packages/wheel/cli/unpack.py new file mode 100644 index 0000000..2e9857a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/cli/unpack.py @@ -0,0 +1,25 @@ +from __future__ import print_function + +import os.path +import sys + +from ..wheelfile import WheelFile + + +def unpack(path, dest='.'): + """Unpack a wheel. + + Wheel content will be unpacked to {dest}/{name}-{ver}, where {name} + is the package name and {ver} its version. + + :param path: The path to the wheel. + :param dest: Destination directory (default to current directory). + """ + with WheelFile(path) as wf: + namever = wf.parsed_filename.group('namever') + destination = os.path.join(dest, namever) + print("Unpacking to: {}...".format(destination), end='') + sys.stdout.flush() + wf.extractall(destination) + + print('OK') diff --git a/backend/venv/lib/python3.7/site-packages/wheel/metadata.py b/backend/venv/lib/python3.7/site-packages/wheel/metadata.py new file mode 100644 index 0000000..ab0c07e --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/metadata.py @@ -0,0 +1,141 @@ +""" +Tools for converting old- to new-style metadata. +""" + +import os.path +import re +import textwrap + +import pkg_resources + +from .pkginfo import read_pkg_info + +# Wheel itself is probably the only program that uses non-extras markers +# in METADATA/PKG-INFO. Support its syntax with the extra at the end only. +EXTRA_RE = re.compile( + r"""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") + + +def requires_to_requires_dist(requirement): + """Return the version specifier for a requirement in PEP 345/566 fashion.""" + if getattr(requirement, 'url', None): + return " @ " + requirement.url + + requires_dist = [] + for op, ver in requirement.specs: + requires_dist.append(op + ver) + if not requires_dist: + return '' + return " (%s)" % ','.join(sorted(requires_dist)) + + +def convert_requirements(requirements): + """Yield Requires-Dist: strings for parsed requirements strings.""" + for req in requirements: + parsed_requirement = pkg_resources.Requirement.parse(req) + spec = requires_to_requires_dist(parsed_requirement) + extras = ",".join(sorted(parsed_requirement.extras)) + if extras: + extras = "[%s]" % extras + yield (parsed_requirement.project_name + extras + spec) + + +def generate_requirements(extras_require): + """ + Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') + and ('Provides-Extra', 'extra') tuples. + + extras_require is a dictionary of {extra: [requirements]} as passed to setup(), + using the empty extra {'': [requirements]} to hold install_requires. + """ + for extra, depends in extras_require.items(): + condition = '' + extra = extra or '' + if ':' in extra: # setuptools extra:condition syntax + extra, condition = extra.split(':', 1) + + extra = pkg_resources.safe_extra(extra) + if extra: + yield 'Provides-Extra', extra + if condition: + condition = "(" + condition + ") and " + condition += "extra == '%s'" % extra + + if condition: + condition = ' ; ' + condition + + for new_req in convert_requirements(depends): + yield 'Requires-Dist', new_req + condition + + +def pkginfo_to_metadata(egg_info_path, pkginfo_path): + """ + Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format + """ + pkg_info = read_pkg_info(pkginfo_path) + pkg_info.replace_header('Metadata-Version', '2.1') + # Those will be regenerated from `requires.txt`. + del pkg_info['Provides-Extra'] + del pkg_info['Requires-Dist'] + requires_path = os.path.join(egg_info_path, 'requires.txt') + if os.path.exists(requires_path): + with open(requires_path) as requires_file: + requires = requires_file.read() + + parsed_requirements = sorted(pkg_resources.split_sections(requires), + key=lambda x: x[0] or '') + for extra, reqs in parsed_requirements: + for key, value in generate_requirements({extra: reqs}): + if (key, value) not in pkg_info.items(): + pkg_info[key] = value + + description = pkg_info['Description'] + if description: + pkg_info.set_payload(dedent_description(pkg_info)) + del pkg_info['Description'] + + return pkg_info + + +def pkginfo_unicode(pkg_info, field): + """Hack to coax Unicode out of an email Message() - Python 3.3+""" + text = pkg_info[field] + field = field.lower() + if not isinstance(text, str): + if not hasattr(pkg_info, 'raw_items'): # Python 3.2 + return str(text) + for item in pkg_info.raw_items(): + if item[0].lower() == field: + text = item[1].encode('ascii', 'surrogateescape') \ + .decode('utf-8') + break + + return text + + +def dedent_description(pkg_info): + """ + Dedent and convert pkg_info['Description'] to Unicode. + """ + description = pkg_info['Description'] + + # Python 3 Unicode handling, sorta. + surrogates = False + if not isinstance(description, str): + surrogates = True + description = pkginfo_unicode(pkg_info, 'Description') + + description_lines = description.splitlines() + description_dedent = '\n'.join( + # if the first line of long_description is blank, + # the first line here will be indented. + (description_lines[0].lstrip(), + textwrap.dedent('\n'.join(description_lines[1:])), + '\n')) + + if surrogates: + description_dedent = description_dedent \ + .encode("utf8") \ + .decode("ascii", "surrogateescape") + + return description_dedent diff --git a/backend/venv/lib/python3.7/site-packages/wheel/pep425tags.py b/backend/venv/lib/python3.7/site-packages/wheel/pep425tags.py new file mode 100644 index 0000000..13b5073 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/pep425tags.py @@ -0,0 +1,185 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" + +import distutils.util +import platform +import sys +import sysconfig +import warnings + +try: + from importlib.machinery import get_all_suffixes +except ImportError: + from imp import get_suffixes as get_all_suffixes + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # pip Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + impl = platform.python_implementation() + if impl == 'PyPy': + return 'pp' + elif impl == 'Jython': + return 'jy' + elif impl == 'IronPython': + return 'ip' + elif impl == 'CPython': + return 'cp' + + raise LookupError('Unknown Python implementation: ' + impl) + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + warnings.warn("Config variable '{0}' is unset, Python ABI tag may " + "be incorrect".format(var), RuntimeWarning, 2) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and sys.maxsize == 2147483647: + # pip pull request #3497 + result = "linux_i686" + return result + + +def get_supported(versions=None, supplied_platform=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = get_abbr_impl() + + abis = [] + + abi = get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_all_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + platforms = [] + if supplied_platform: + platforms.append(supplied_platform) + platforms.append(get_platform()) + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in platforms: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in ('31', '30'): + break + for abi in abi3s: # empty set if not Python 3 + for arch in platforms: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # No abi / arch, but requires our implementation: + for i, version in enumerate(versions): + supported.append(('%s%s' % (impl, version), 'none', 'any')) + if i == 0: + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # Major Python version + platform; e.g. binaries not using the Python API + for arch in platforms: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported diff --git a/backend/venv/lib/python3.7/site-packages/wheel/pkginfo.py b/backend/venv/lib/python3.7/site-packages/wheel/pkginfo.py new file mode 100644 index 0000000..115be45 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/pkginfo.py @@ -0,0 +1,43 @@ +"""Tools for reading and writing PKG-INFO / METADATA without caring +about the encoding.""" + +from email.parser import Parser + +try: + unicode + _PY3 = False +except NameError: + _PY3 = True + +if not _PY3: + from email.generator import Generator + + def read_pkg_info_bytes(bytestr): + return Parser().parsestr(bytestr) + + def read_pkg_info(path): + with open(path, "r") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, 'w') as metadata: + Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) +else: + from email.generator import BytesGenerator + + def read_pkg_info_bytes(bytestr): + headers = bytestr.decode(encoding="ascii", errors="surrogateescape") + message = Parser().parsestr(headers) + return message + + def read_pkg_info(path): + with open(path, "r", + encoding="ascii", + errors="surrogateescape") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, "wb") as out: + BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/backend/venv/lib/python3.7/site-packages/wheel/util.py b/backend/venv/lib/python3.7/site-packages/wheel/util.py new file mode 100644 index 0000000..0afb54a --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/util.py @@ -0,0 +1,46 @@ +import base64 +import io +import sys + + +if sys.version_info[0] < 3: + text_type = unicode # noqa: F821 + + StringIO = io.BytesIO + + def native(s, encoding='utf-8'): + if isinstance(s, unicode): + return s.encode(encoding) + return s +else: + text_type = str + + StringIO = io.StringIO + + def native(s, encoding='utf-8'): + if isinstance(s, bytes): + return s.decode(encoding) + return s + + +def urlsafe_b64encode(data): + """urlsafe_b64encode without padding""" + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def urlsafe_b64decode(data): + """urlsafe_b64decode without padding""" + pad = b'=' * (4 - (len(data) & 3)) + return base64.urlsafe_b64decode(data + pad) + + +def as_unicode(s): + if isinstance(s, bytes): + return s.decode('utf-8') + return s + + +def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s diff --git a/backend/venv/lib/python3.7/site-packages/wheel/wheelfile.py b/backend/venv/lib/python3.7/site-packages/wheel/wheelfile.py new file mode 100644 index 0000000..ddf8509 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/wheel/wheelfile.py @@ -0,0 +1,169 @@ +from __future__ import print_function + +import csv +import hashlib +import os.path +import re +import stat +import time +from collections import OrderedDict +from distutils import log as logger +from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile + +from wheel.cli import WheelError +from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO + +# Non-greedy matching of an optional build number may be too clever (more +# invalid wheel filenames will match). Separate regex for .dist-info? +WHEEL_INFO_RE = re.compile( + r"""^(?P(?P.+?)-(?P.+?))(-(?P\d[^-]*))? + -(?P.+?)-(?P.+?)-(?P.+?)\.whl$""", + re.VERBOSE) + + +def get_zipinfo_datetime(timestamp=None): + # Some applications need reproducible .whl files, but they can't do this without forcing + # the timestamp of the individual ZipInfo objects. See issue #143. + timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time())) + return time.gmtime(timestamp)[0:6] + + +class WheelFile(ZipFile): + """A ZipFile derivative class that also reads SHA-256 hashes from + .dist-info/RECORD and checks any read files against those. + """ + + _default_algorithm = hashlib.sha256 + + def __init__(self, file, mode='r'): + basename = os.path.basename(file) + self.parsed_filename = WHEEL_INFO_RE.match(basename) + if not basename.endswith('.whl') or self.parsed_filename is None: + raise WheelError("Bad wheel filename {!r}".format(basename)) + + ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True) + + self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever')) + self.record_path = self.dist_info_path + '/RECORD' + self._file_hashes = OrderedDict() + self._file_sizes = {} + if mode == 'r': + # Ignore RECORD and any embedded wheel signatures + self._file_hashes[self.record_path] = None, None + self._file_hashes[self.record_path + '.jws'] = None, None + self._file_hashes[self.record_path + '.p7s'] = None, None + + # Fill in the expected hashes by reading them from RECORD + try: + record = self.open(self.record_path) + except KeyError: + raise WheelError('Missing {} file'.format(self.record_path)) + + with record: + for line in record: + line = line.decode('utf-8') + path, hash_sum, size = line.rsplit(u',', 2) + if hash_sum: + algorithm, hash_sum = hash_sum.split(u'=') + try: + hashlib.new(algorithm) + except ValueError: + raise WheelError('Unsupported hash algorithm: {}'.format(algorithm)) + + if algorithm.lower() in {'md5', 'sha1'}: + raise WheelError( + 'Weak hash algorithm ({}) is not permitted by PEP 427' + .format(algorithm)) + + self._file_hashes[path] = ( + algorithm, urlsafe_b64decode(hash_sum.encode('ascii'))) + + def open(self, name_or_info, mode="r", pwd=None): + def _update_crc(newdata, eof=None): + if eof is None: + eof = ef._eof + update_crc_orig(newdata) + else: # Python 2 + update_crc_orig(newdata, eof) + + running_hash.update(newdata) + if eof and running_hash.digest() != expected_hash: + raise WheelError("Hash mismatch for file '{}'".format(native(ef_name))) + + ef = ZipFile.open(self, name_or_info, mode, pwd) + ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo) + else name_or_info) + if mode == 'r' and not ef_name.endswith('/'): + if ef_name not in self._file_hashes: + raise WheelError("No hash found for file '{}'".format(native(ef_name))) + + algorithm, expected_hash = self._file_hashes[ef_name] + if expected_hash is not None: + # Monkey patch the _update_crc method to also check for the hash from RECORD + running_hash = hashlib.new(algorithm) + update_crc_orig, ef._update_crc = ef._update_crc, _update_crc + + return ef + + def write_files(self, base_dir): + logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir) + deferred = [] + for root, dirnames, filenames in os.walk(base_dir): + # Sort the directory names so that `os.walk` will walk them in a + # defined order on the next iteration. + dirnames.sort() + for name in sorted(filenames): + path = os.path.normpath(os.path.join(root, name)) + if os.path.isfile(path): + arcname = os.path.relpath(path, base_dir) + if arcname == self.record_path: + pass + elif root.endswith('.dist-info'): + deferred.append((path, arcname)) + else: + self.write(path, arcname) + + deferred.sort() + for path, arcname in deferred: + self.write(path, arcname) + + def write(self, filename, arcname=None, compress_type=None): + with open(filename, 'rb') as f: + st = os.fstat(f.fileno()) + data = f.read() + + zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) + zinfo.external_attr = (stat.S_IMODE(st.st_mode) | stat.S_IFMT(st.st_mode)) << 16 + zinfo.compress_type = ZIP_DEFLATED + self.writestr(zinfo, data, compress_type) + + def writestr(self, zinfo_or_arcname, bytes, compress_type=None): + ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type) + fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo) + else zinfo_or_arcname) + logger.info("adding '%s'", fname) + if fname != self.record_path: + hash_ = self._default_algorithm(bytes) + self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest())) + self._file_sizes[fname] = len(bytes) + + def close(self): + # Write RECORD + if self.fp is not None and self.mode == 'w' and self._file_hashes: + data = StringIO() + writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n') + writer.writerows(( + ( + fname, + algorithm + "=" + hash_, + self._file_sizes[fname] + ) + for fname, (algorithm, hash_) in self._file_hashes.items() + )) + writer.writerow((format(self.record_path), "", "")) + zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) + zinfo.compress_type = ZIP_DEFLATED + zinfo.external_attr = 0o664 << 16 + self.writestr(zinfo, as_bytes(data.getvalue())) + + ZipFile.close(self) diff --git a/backend/venv/lib/python3.7/site.py b/backend/venv/lib/python3.7/site.py new file mode 100644 index 0000000..6868be6 --- /dev/null +++ b/backend/venv/lib/python3.7/site.py @@ -0,0 +1,821 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +It also supports the Debian convention of +lib/python/dist-packages. On other platforms (mainly Mac and +Windows), it uses just sys.prefix (and sys.exec_prefix, if different, +but this is unlikely). The resulting directories, if they exist, are +appended to sys.path, and also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/dist-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.X/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.X/site-packages/bar + /usr/local/lib/python2.X/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import os +import sys + +try: + import __builtin__ as builtins +except ImportError: + import builtins +try: + set +except NameError: + from sets import Set as set + +# Prefixes for site-packages; add additional prefixes like /usr/local here +PREFIXES = [sys.prefix, sys.exec_prefix] +# Enable per user site-packages directory +# set it to False to disable the feature or True to force the feature +ENABLE_USER_SITE = None +# for distutils.commands.install +USER_SITE = None +USER_BASE = None + +_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32 +_is_pypy = hasattr(sys, "pypy_version_info") + + +def makepath(*paths): + dir = os.path.join(*paths) + dir = os.path.abspath(dir) + return dir, os.path.normcase(dir) + + +def abs__file__(): + """Set all module' __file__ attribute to an absolute path""" + for m in sys.modules.values(): + f = getattr(m, "__file__", None) + if f is None: + continue + m.__file__ = os.path.abspath(f) + + +def removeduppaths(): + """ Remove duplicate entries from sys.path along with making them + absolute""" + # This ensures that the initial path provided by the interpreter contains + # only absolute pathnames, even if we're running from the build directory. + L = [] + known_paths = set() + for dir in sys.path: + # Filter out duplicate paths (on case-insensitive file systems also + # if they only differ in case); turn relative paths into absolute + # paths. + dir, dircase = makepath(dir) + if not dircase in known_paths: + L.append(dir) + known_paths.add(dircase) + sys.path[:] = L + return known_paths + + +# XXX This should not be part of site.py, since it is needed even when +# using the -S option for Python. See http://www.python.org/sf/586680 +def addbuilddir(): + """Append ./build/lib. in case we're running in the build dir + (especially for Guido :-)""" + from distutils.util import get_platform + + s = "build/lib.{}-{:.3}".format(get_platform(), sys.version) + if hasattr(sys, "gettotalrefcount"): + s += "-pydebug" + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + + +def _init_pathinfo(): + """Return a set containing all existing directory entries from sys.path""" + d = set() + for dir in sys.path: + try: + if os.path.isdir(dir): + dir, dircase = makepath(dir) + d.add(dircase) + except TypeError: + continue + return d + + +def addpackage(sitedir, name, known_paths): + """Add a new path to known_paths by combining sitedir and 'name' or execute + sitedir if it starts with 'import'""" + if known_paths is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname, "r") + except IOError: + return + try: + for line in f: + if line.startswith("#"): + continue + if line.startswith("import"): + exec(line) + continue + line = line.rstrip() + dir, dircase = makepath(sitedir, line) + if not dircase in known_paths and os.path.exists(dir): + sys.path.append(dir) + known_paths.add(dircase) + finally: + f.close() + if reset: + known_paths = None + return known_paths + + +def addsitedir(sitedir, known_paths=None): + """Add 'sitedir' argument to sys.path if missing and handle .pth files in + 'sitedir'""" + if known_paths is None: + known_paths = _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in known_paths: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name.endswith(os.extsep + "pth"): + addpackage(sitedir, name, known_paths) + if reset: + known_paths = None + return known_paths + + +def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): + """Add site-packages (and possibly site-python) to sys.path""" + prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] + if exec_prefix != sys_prefix: + prefixes.append(os.path.join(exec_prefix, "local")) + + for prefix in prefixes: + if prefix: + if sys.platform in ("os2emx", "riscos"): + sitedirs = [os.path.join(prefix, "Lib", "site-packages")] + elif _is_pypy: + sitedirs = [os.path.join(prefix, "site-packages")] + elif sys.platform == "darwin" and prefix == sys_prefix: + + if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python + + sitedirs = [ + os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(prefix, "Extras", "lib", "python"), + ] + + else: # any other Python distros on OSX work this way + sitedirs = [os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages")] + + elif os.sep == "/": + sitedirs = [ + os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python" + sys.version[:3], "lib-dynload"), + ] + lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") + if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [ + os.path.realpath(p) for p in sitedirs + ]: + if _is_64bit: + sitedirs.insert(0, lib64_dir) + else: + sitedirs.append(lib64_dir) + try: + # sys.getobjects only available in --with-pydebug build + sys.getobjects + sitedirs.insert(0, os.path.join(sitedirs[0], "debug")) + except AttributeError: + pass + # Debian-specific dist-packages directories: + sitedirs.append(os.path.join(prefix, "local/lib", "python" + sys.version[:3], "dist-packages")) + if sys.version[0] == "2": + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], "dist-packages")) + else: + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[0], "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) + else: + sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] + if sys.platform == "darwin": + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if "Python.framework" in prefix: + home = os.environ.get("HOME") + if home: + sitedirs.append(os.path.join(home, "Library", "Python", sys.version[:3], "site-packages")) + for sitedir in sitedirs: + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) + return None + + +def check_enableusersite(): + """Check if user site directory is safe for inclusion + + The function tests for the command line flag (including environment var), + process uid/gid equal to effective uid/gid. + + None: Disabled for security reasons + False: Disabled by user (command line option) + True: Safe and enabled + """ + if hasattr(sys, "flags") and getattr(sys.flags, "no_user_site", False): + return False + + if hasattr(os, "getuid") and hasattr(os, "geteuid"): + # check process uid == effective uid + if os.geteuid() != os.getuid(): + return None + if hasattr(os, "getgid") and hasattr(os, "getegid"): + # check process gid == effective gid + if os.getegid() != os.getgid(): + return None + + return True + + +def addusersitepackages(known_paths): + """Add a per user site-package to sys.path + + Each user has its own python directory with site-packages in the + home directory. + + USER_BASE is the root directory for all Python versions + + USER_SITE is the user specific site-packages directory + + USER_SITE/.. can be used for data. + """ + global USER_BASE, USER_SITE, ENABLE_USER_SITE + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # if sys.platform in ('os2emx', 'riscos'): + # # Don't know what to put here + # USER_BASE = '' + # USER_SITE = '' + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser(base, "Python") + USER_SITE = os.path.join(USER_BASE, "Python" + sys.version[0] + sys.version[2], "site-packages") + else: + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser("~", ".local") + USER_SITE = os.path.join(USER_BASE, "lib", "python" + sys.version[:3], "site-packages") + + if ENABLE_USER_SITE and os.path.isdir(USER_SITE): + addsitedir(USER_SITE, known_paths) + if ENABLE_USER_SITE: + for dist_libdir in ("lib", "local/lib"): + user_site = os.path.join(USER_BASE, dist_libdir, "python" + sys.version[:3], "dist-packages") + if os.path.isdir(user_site): + addsitedir(user_site, known_paths) + return known_paths + + +def setBEGINLIBPATH(): + """The OS/2 EMX port has optional extension modules that do double duty + as DLLs (and must use the .DLL file extension) for other extensions. + The library search path needs to be amended so these will be found + during module import. Use BEGINLIBPATH so that these are at the start + of the library search path. + + """ + dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") + libpath = os.environ["BEGINLIBPATH"].split(";") + if libpath[-1]: + libpath.append(dllpath) + else: + libpath[-1] = dllpath + os.environ["BEGINLIBPATH"] = ";".join(libpath) + + +def setquit(): + """Define new built-ins 'quit' and 'exit'. + These are simply strings that display a hint on how to exit. + + """ + if os.sep == ":": + eof = "Cmd-Q" + elif os.sep == "\\": + eof = "Ctrl-Z plus Return" + else: + eof = "Ctrl-D (i.e. EOF)" + + class Quitter(object): + def __init__(self, name): + self.name = name + + def __repr__(self): + return "Use {}() or {} to exit".format(self.name, eof) + + def __call__(self, code=None): + # Shells like IDLE catch the SystemExit, but listen when their + # stdin wrapper is closed. + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + + builtins.quit = Quitter("quit") + builtins.exit = Quitter("exit") + + +class _Printer(object): + """interactive prompt objects for printing the license text, a list of + contributors and the copyright notice.""" + + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for filename in self.__files: + filename = os.path.join(dir, filename) + try: + fp = open(filename, "r") + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split("\n") + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,) * 2) + + def __call__(self): + self.__setup() + prompt = "Hit Return for more, or q (and Return) to quit: " + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print(self.__lines[i]) + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + try: + key = raw_input(prompt) + except NameError: + key = input(prompt) + if key not in ("", "q"): + key = None + if key == "q": + break + + +def setcopyright(): + """Set 'copyright' and 'credits' in __builtin__""" + builtins.copyright = _Printer("copyright", sys.copyright) + if _is_pypy: + builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/") + else: + builtins.credits = _Printer( + "credits", + """\ + Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands + for supporting Python development. See www.python.org for more information.""", + ) + here = os.path.dirname(os.__file__) + builtins.license = _Printer( + "license", + "See https://www.python.org/psf/license/", + ["LICENSE.txt", "LICENSE"], + [sys.prefix, os.path.join(here, os.pardir), here, os.curdir], + ) + + +class _Helper(object): + """Define the built-in 'help'. + This is a wrapper around pydoc.help (with a twist). + + """ + + def __repr__(self): + return "Type help() for interactive help, " "or help(object) for help about object." + + def __call__(self, *args, **kwds): + import pydoc + + return pydoc.help(*args, **kwds) + + +def sethelper(): + builtins.help = _Helper() + + +def aliasmbcs(): + """On Windows, some default encodings are not provided by Python, + while they are always available as "mbcs" in each locale. Make + them usable by aliasing to "mbcs" in such a case.""" + if sys.platform == "win32": + import locale, codecs + + enc = locale.getdefaultlocale()[1] + if enc.startswith("cp"): # "cp***" ? + try: + codecs.lookup(enc) + except LookupError: + import encodings + + encodings._cache[enc] = encodings._unknown + encodings.aliases.aliases[enc] = "mbcs" + + +def setencoding(): + """Set the string encoding used by the Unicode implementation. The + default is 'ascii', but if you're willing to experiment, you can + change this.""" + encoding = "ascii" # Default value set by _PyUnicode_Init() + if 0: + # Enable to support locale aware default string encodings. + import locale + + loc = locale.getdefaultlocale() + if loc[1]: + encoding = loc[1] + if 0: + # Enable to switch off string to Unicode coercion and implicit + # Unicode to string conversion. + encoding = "undefined" + if encoding != "ascii": + # On Non-Unicode builds this will raise an AttributeError... + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + + +def execsitecustomize(): + """Run custom site specific code, if available.""" + try: + import sitecustomize + except ImportError: + pass + + +def virtual_install_main_packages(): + f = open(os.path.join(os.path.dirname(__file__), "orig-prefix.txt")) + sys.real_prefix = f.read().strip() + f.close() + pos = 2 + hardcoded_relative_dirs = [] + if sys.path[0] == "": + pos += 1 + if _is_pypy: + if sys.version_info > (3, 2): + cpyver = "%d" % sys.version_info[0] + elif sys.pypy_version_info >= (1, 5): + cpyver = "%d.%d" % sys.version_info[:2] + else: + cpyver = "%d.%d.%d" % sys.version_info[:3] + paths = [os.path.join(sys.real_prefix, "lib_pypy"), os.path.join(sys.real_prefix, "lib-python", cpyver)] + if sys.pypy_version_info < (1, 9): + paths.insert(1, os.path.join(sys.real_prefix, "lib-python", "modified-%s" % cpyver)) + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + # + # This is hardcoded in the Python executable, but relative to sys.prefix: + for path in paths[:]: + plat_path = os.path.join(path, "plat-%s" % sys.platform) + if os.path.exists(plat_path): + paths.append(plat_path) + elif sys.platform == "win32": + paths = [os.path.join(sys.real_prefix, "Lib"), os.path.join(sys.real_prefix, "DLLs")] + else: + paths = [os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3])] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, "lib64", "python" + sys.version[:3]) + if os.path.exists(lib64_path): + if _is_64bit: + paths.insert(0, lib64_path) + else: + paths.append(lib64_path) + # This is hardcoded in the Python executable, but relative to + # sys.prefix. Debian change: we need to add the multiarch triplet + # here, which is where the real stuff lives. As per PEP 421, in + # Python 3.3+, this lives in sys.implementation, while in Python 2.7 + # it lives in sys. + try: + arch = getattr(sys, "implementation", sys)._multiarch + except AttributeError: + # This is a non-multiarch aware Python. Fallback to the old way. + arch = sys.platform + plat_path = os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3], "plat-%s" % arch) + if os.path.exists(plat_path): + paths.append(plat_path) + # This is hardcoded in the Python executable, but + # relative to sys.prefix, so we have to fix up: + for path in list(paths): + tk_dir = os.path.join(path, "lib-tk") + if os.path.exists(tk_dir): + paths.append(tk_dir) + + # These are hardcoded in the Apple's Python executable, + # but relative to sys.prefix, so we have to fix them up: + if sys.platform == "darwin": + hardcoded_paths = [ + os.path.join(relative_dir, module) + for relative_dir in hardcoded_relative_dirs + for module in ("plat-darwin", "plat-mac", "plat-mac/lib-scriptpackages") + ] + + for path in hardcoded_paths: + if os.path.exists(path): + paths.append(path) + + sys.path.extend(paths) + + +def force_global_eggs_after_local_site_packages(): + """ + Force easy_installed eggs in the global environment to get placed + in sys.path after all packages inside the virtualenv. This + maintains the "least surprise" result that packages in the + virtualenv always mask global packages, never the other way + around. + + """ + egginsert = getattr(sys, "__egginsert", 0) + for i, path in enumerate(sys.path): + if i > egginsert and path.startswith(sys.prefix): + egginsert = i + sys.__egginsert = egginsert + 1 + + +def virtual_addsitepackages(known_paths): + force_global_eggs_after_local_site_packages() + return addsitepackages(known_paths, sys_prefix=sys.real_prefix) + + +def execusercustomize(): + """Run custom user specific code, if available.""" + try: + import usercustomize + except ImportError: + pass + + +def enablerlcompleter(): + """Enable default readline configuration on interactive prompts, by + registering a sys.__interactivehook__. + If the readline module can be imported, the hook will set the Tab key + as completion key and register ~/.python_history as history file. + This can be overridden in the sitecustomize or usercustomize module, + or in a PYTHONSTARTUP file. + """ + + def register_readline(): + import atexit + + try: + import readline + import rlcompleter + except ImportError: + return + + # Reading the initialization (config) file may not be enough to set a + # completion key, so we set one first and then read the file. + readline_doc = getattr(readline, "__doc__", "") + if readline_doc is not None and "libedit" in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab: complete") + + try: + readline.read_init_file() + except OSError: + # An OSError here could have many causes, but the most likely one + # is that there's no .inputrc file (or .editrc file in the case of + # Mac OS X + libedit) in the expected location. In that case, we + # want to ignore the exception. + pass + + if readline.get_current_history_length() == 0: + # If no history was loaded, default to .python_history. + # The guard is necessary to avoid doubling history size at + # each interpreter exit when readline was already configured + # through a PYTHONSTARTUP hook, see: + # http://bugs.python.org/issue5845#msg198636 + history = os.path.join(os.path.expanduser("~"), ".python_history") + try: + readline.read_history_file(history) + except OSError: + pass + + def write_history(): + try: + readline.write_history_file(history) + except (FileNotFoundError, PermissionError): + # home directory does not exist or is not writable + # https://bugs.python.org/issue19891 + pass + + atexit.register(write_history) + + sys.__interactivehook__ = register_readline + + +if _is_pypy: + + def import_builtin_stuff(): + """PyPy specific: some built-in modules should be pre-imported because + some programs expect them to be in sys.modules on startup. This is ported + from PyPy's site.py. + """ + import encodings + + if "exceptions" in sys.builtin_module_names: + import exceptions + + if "zipimport" in sys.builtin_module_names: + import zipimport + + +def main(): + global ENABLE_USER_SITE + virtual_install_main_packages() + if _is_pypy: + import_builtin_stuff() + abs__file__() + paths_in_sys = removeduppaths() + if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules": + addbuilddir() + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt")) + if not GLOBAL_SITE_PACKAGES: + ENABLE_USER_SITE = False + if ENABLE_USER_SITE is None: + ENABLE_USER_SITE = check_enableusersite() + paths_in_sys = addsitepackages(paths_in_sys) + paths_in_sys = addusersitepackages(paths_in_sys) + if GLOBAL_SITE_PACKAGES: + paths_in_sys = virtual_addsitepackages(paths_in_sys) + if sys.platform == "os2emx": + setBEGINLIBPATH() + setquit() + setcopyright() + sethelper() + if sys.version_info[0] == 3: + enablerlcompleter() + aliasmbcs() + setencoding() + execsitecustomize() + if ENABLE_USER_SITE: + execusercustomize() + # Remove sys.setdefaultencoding() so that users cannot change the + # encoding after initialization. The test for presence is needed when + # this module is run as a script, because this code is executed twice. + if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + + +main() + + +def _script(): + help = """\ + %s [--user-base] [--user-site] + + Without arguments print some useful information + With arguments print the value of USER_BASE and/or USER_SITE separated + by '%s'. + + Exit codes with --user-base or --user-site: + 0 - user site directory is enabled + 1 - user site directory is disabled by user + 2 - uses site directory is disabled by super user + or for security reasons + >2 - unknown error + """ + args = sys.argv[1:] + if not args: + print("sys.path = [") + for dir in sys.path: + print(" {!r},".format(dir)) + print("]") + + def exists(path): + if os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + + print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE))) + print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_SITE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + sys.exit(0) + + buffer = [] + if "--user-base" in args: + buffer.append(USER_BASE) + if "--user-site" in args: + buffer.append(USER_SITE) + + if buffer: + print(os.pathsep.join(buffer)) + if ENABLE_USER_SITE: + sys.exit(0) + elif ENABLE_USER_SITE is False: + sys.exit(1) + elif ENABLE_USER_SITE is None: + sys.exit(2) + else: + sys.exit(3) + else: + import textwrap + + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) + sys.exit(10) + + +if __name__ == "__main__": + _script() diff --git a/backend/venv/lib/python3.7/sre_compile.py b/backend/venv/lib/python3.7/sre_compile.py new file mode 120000 index 0000000..25b2b1a --- /dev/null +++ b/backend/venv/lib/python3.7/sre_compile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_compile.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/sre_constants.py b/backend/venv/lib/python3.7/sre_constants.py new file mode 120000 index 0000000..adacba3 --- /dev/null +++ b/backend/venv/lib/python3.7/sre_constants.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_constants.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/sre_parse.py b/backend/venv/lib/python3.7/sre_parse.py new file mode 120000 index 0000000..a2167c0 --- /dev/null +++ b/backend/venv/lib/python3.7/sre_parse.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_parse.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/stat.py b/backend/venv/lib/python3.7/stat.py new file mode 120000 index 0000000..2cb392c --- /dev/null +++ b/backend/venv/lib/python3.7/stat.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/stat.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/struct.py b/backend/venv/lib/python3.7/struct.py new file mode 120000 index 0000000..8c93f91 --- /dev/null +++ b/backend/venv/lib/python3.7/struct.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/struct.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/tarfile.py b/backend/venv/lib/python3.7/tarfile.py new file mode 120000 index 0000000..374c697 --- /dev/null +++ b/backend/venv/lib/python3.7/tarfile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tarfile.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/tempfile.py b/backend/venv/lib/python3.7/tempfile.py new file mode 120000 index 0000000..565f61f --- /dev/null +++ b/backend/venv/lib/python3.7/tempfile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tempfile.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/token.py b/backend/venv/lib/python3.7/token.py new file mode 120000 index 0000000..87ee559 --- /dev/null +++ b/backend/venv/lib/python3.7/token.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/token.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/tokenize.py b/backend/venv/lib/python3.7/tokenize.py new file mode 120000 index 0000000..c57893e --- /dev/null +++ b/backend/venv/lib/python3.7/tokenize.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tokenize.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/types.py b/backend/venv/lib/python3.7/types.py new file mode 120000 index 0000000..c400877 --- /dev/null +++ b/backend/venv/lib/python3.7/types.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/types.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/warnings.py b/backend/venv/lib/python3.7/warnings.py new file mode 120000 index 0000000..d4104e4 --- /dev/null +++ b/backend/venv/lib/python3.7/warnings.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/warnings.py \ No newline at end of file diff --git a/backend/venv/lib/python3.7/weakref.py b/backend/venv/lib/python3.7/weakref.py new file mode 120000 index 0000000..4e646aa --- /dev/null +++ b/backend/venv/lib/python3.7/weakref.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/weakref.py \ No newline at end of file diff --git a/backend/venv/venv/.Python b/backend/venv/venv/.Python new file mode 120000 index 0000000..a7e44c6 --- /dev/null +++ b/backend/venv/venv/.Python @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/Python \ No newline at end of file diff --git a/backend/venv/venv/bin/activate b/backend/venv/venv/bin/activate new file mode 100644 index 0000000..c0cdd38 --- /dev/null +++ b/backend/venv/venv/bin/activate @@ -0,0 +1,78 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="${PS1-}" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/backend/venv/venv/bin/activate.csh b/backend/venv/venv/bin/activate.csh new file mode 100644 index 0000000..acd6874 --- /dev/null +++ b/backend/venv/venv/bin/activate.csh @@ -0,0 +1,55 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +set newline='\ +' + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH:q" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT:q" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv" + +set _OLD_VIRTUAL_PATH="$PATH:q" +setenv PATH "$VIRTUAL_ENV:q/bin:$PATH:q" + + + +if ("" != "") then + set env_name = "" +else + set env_name = '('"$VIRTUAL_ENV:t:q"') ' +endif + +if ( $?VIRTUAL_ENV_DISABLE_PROMPT ) then + if ( $VIRTUAL_ENV_DISABLE_PROMPT == "" ) then + set do_prompt = "1" + else + set do_prompt = "0" + endif +else + set do_prompt = "1" +endif + +if ( $do_prompt == "1" ) then + # Could be in a non-interactive environment, + # in which case, $prompt is undefined and we wouldn't + # care about the prompt anyway. + if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt:q" + if ( "$prompt:q" =~ *"$newline:q"* ) then + : + else + set prompt = "$env_name:q$prompt:q" + endif + endif +endif + +unset env_name +unset do_prompt + +alias pydoc python -m pydoc + +rehash diff --git a/backend/venv/venv/bin/activate.fish b/backend/venv/venv/bin/activate.fish new file mode 100644 index 0000000..70df764 --- /dev/null +++ b/backend/venv/venv/bin/activate.fish @@ -0,0 +1,101 @@ +# This file must be used using `source bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function _bashify_path -d "Converts a fish path to something bash can recognize" + set fishy_path $argv + set bashy_path $fishy_path[1] + for path_part in $fishy_path[2..-1] + set bashy_path "$bashy_path:$path_part" + end + echo $bashy_path +end + +function _fishify_path -d "Converts a bash path to something fish can recognize" + echo $argv | tr ':' '\n' +end + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + # https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling + if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx PATH (_fishify_path $_OLD_VIRTUAL_PATH) + else + set -gx PATH $_OLD_VIRTUAL_PATH + end + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + functions -e _bashify_path + functions -e _fishify_path + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv" + +# https://github.com/fish-shell/fish-shell/issues/436 altered PATH handling +if test (echo $FISH_VERSION | tr "." "\n")[1] -lt 3 + set -gx _OLD_VIRTUAL_PATH (_bashify_path $PATH) +else + set -gx _OLD_VIRTUAL_PATH $PATH +end +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/backend/venv/venv/bin/activate.ps1 b/backend/venv/venv/bin/activate.ps1 new file mode 100644 index 0000000..bb51e77 --- /dev/null +++ b/backend/venv/venv/bin/activate.ps1 @@ -0,0 +1,72 @@ +# This file must be dot sourced from PoSh; you cannot run it directly. Do this: . ./activate.ps1 + +$script:THIS_PATH = $myinvocation.mycommand.path +$script:BASE_DIR = split-path (resolve-path "$THIS_PATH/..") -Parent + +function global:deactivate([switch] $NonDestructive) +{ + if (test-path variable:_OLD_VIRTUAL_PATH) + { + $env:PATH = $variable:_OLD_VIRTUAL_PATH + remove-variable "_OLD_VIRTUAL_PATH" -scope global + } + + if (test-path function:_old_virtual_prompt) + { + $function:prompt = $function:_old_virtual_prompt + remove-item function:\_old_virtual_prompt + } + + if ($env:VIRTUAL_ENV) + { + $old_env = split-path $env:VIRTUAL_ENV -leaf + remove-item env:VIRTUAL_ENV -erroraction silentlycontinue + } + + if (!$NonDestructive) + { + # Self destruct! + remove-item function:deactivate + remove-item function:pydoc + } +} + +function global:pydoc +{ + python -m pydoc $args +} + +# unset irrelevant variables +deactivate -nondestructive + +$VIRTUAL_ENV = $BASE_DIR +$env:VIRTUAL_ENV = $VIRTUAL_ENV + +$global:_OLD_VIRTUAL_PATH = $env:PATH +$env:PATH = "$env:VIRTUAL_ENV/bin:" + $env:PATH +if (!$env:VIRTUAL_ENV_DISABLE_PROMPT) +{ + function global:_old_virtual_prompt + { + "" + } + $function:_old_virtual_prompt = $function:prompt + if ("" -ne "") + { + function global:prompt + { + # Add the custom prefix to the existing prompt + write-host "" -nonewline + & $function:_old_virtual_prompt + } + } + else + { + function global:prompt + { + # Add a prefix to the current prompt, but don't discard it. + write-host "($( split-path $env:VIRTUAL_ENV -leaf )) " -nonewline + & $function:_old_virtual_prompt + } + } +} diff --git a/backend/venv/venv/bin/activate.xsh b/backend/venv/venv/bin/activate.xsh new file mode 100644 index 0000000..037d667 --- /dev/null +++ b/backend/venv/venv/bin/activate.xsh @@ -0,0 +1,46 @@ +"""Xonsh activate script for virtualenv""" +from xonsh.tools import get_sep as _get_sep + +def _deactivate(args): + if "pydoc" in aliases: + del aliases["pydoc"] + + if ${...}.get("_OLD_VIRTUAL_PATH", ""): + $PATH = $_OLD_VIRTUAL_PATH + del $_OLD_VIRTUAL_PATH + + if ${...}.get("_OLD_VIRTUAL_PYTHONHOME", ""): + $PYTHONHOME = $_OLD_VIRTUAL_PYTHONHOME + del $_OLD_VIRTUAL_PYTHONHOME + + if "VIRTUAL_ENV" in ${...}: + del $VIRTUAL_ENV + + if "VIRTUAL_ENV_PROMPT" in ${...}: + del $VIRTUAL_ENV_PROMPT + + if "nondestructive" not in args: + # Self destruct! + del aliases["deactivate"] + + +# unset irrelevant variables +_deactivate(["nondestructive"]) +aliases["deactivate"] = _deactivate + +$VIRTUAL_ENV = r"/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv" + +$_OLD_VIRTUAL_PATH = $PATH +$PATH = $PATH[:] +$PATH.add($VIRTUAL_ENV + _get_sep() + "bin", front=True, replace=True) + +if ${...}.get("PYTHONHOME", ""): + # unset PYTHONHOME if set + $_OLD_VIRTUAL_PYTHONHOME = $PYTHONHOME + del $PYTHONHOME + +$VIRTUAL_ENV_PROMPT = "" +if not $VIRTUAL_ENV_PROMPT: + del $VIRTUAL_ENV_PROMPT + +aliases["pydoc"] = ["python", "-m", "pydoc"] diff --git a/backend/venv/venv/bin/activate_this.py b/backend/venv/venv/bin/activate_this.py new file mode 100644 index 0000000..59b5d72 --- /dev/null +++ b/backend/venv/venv/bin/activate_this.py @@ -0,0 +1,46 @@ +"""Activate virtualenv for current interpreter: + +Use exec(open(this_file).read(), {'__file__': this_file}). + +This can be used when you must use an existing Python interpreter, not the virtualenv bin/python. +""" +import os +import site +import sys + +try: + __file__ +except NameError: + raise AssertionError("You must use exec(open(this_file).read(), {'__file__': this_file}))") + +# prepend bin to PATH (this file is inside the bin directory) +bin_dir = os.path.dirname(os.path.abspath(__file__)) +os.environ["PATH"] = os.pathsep.join([bin_dir] + os.environ.get("PATH", "").split(os.pathsep)) + +base = os.path.dirname(bin_dir) + +# virtual env is right above bin directory +os.environ["VIRTUAL_ENV"] = base + +# add the virtual environments site-package to the host python import mechanism +IS_PYPY = hasattr(sys, "pypy_version_info") +IS_JYTHON = sys.platform.startswith("java") +if IS_JYTHON: + site_packages = os.path.join(base, "Lib", "site-packages") +elif IS_PYPY: + site_packages = os.path.join(base, "site-packages") +else: + IS_WIN = sys.platform == "win32" + if IS_WIN: + site_packages = os.path.join(base, "Lib", "site-packages") + else: + site_packages = os.path.join(base, "lib", "python{}".format(sys.version[:3]), "site-packages") + +prev = set(sys.path) +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base + +# Move the added items to the front of the path, in place +new = list(sys.path) +sys.path[:] = [i for i in new if i not in prev] + [i for i in new if i in prev] diff --git a/backend/venv/venv/bin/easy_install b/backend/venv/venv/bin/easy_install new file mode 100755 index 0000000..83bb479 --- /dev/null +++ b/backend/venv/venv/bin/easy_install @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/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/backend/venv/venv/bin/easy_install-3.7 b/backend/venv/venv/bin/easy_install-3.7 new file mode 100755 index 0000000..83bb479 --- /dev/null +++ b/backend/venv/venv/bin/easy_install-3.7 @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/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/backend/venv/venv/bin/pip b/backend/venv/venv/bin/pip new file mode 100755 index 0000000..61aa80a --- /dev/null +++ b/backend/venv/venv/bin/pip @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/backend/venv/venv/bin/pip3 b/backend/venv/venv/bin/pip3 new file mode 100755 index 0000000..61aa80a --- /dev/null +++ b/backend/venv/venv/bin/pip3 @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/backend/venv/venv/bin/pip3.7 b/backend/venv/venv/bin/pip3.7 new file mode 100755 index 0000000..61aa80a --- /dev/null +++ b/backend/venv/venv/bin/pip3.7 @@ -0,0 +1,10 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/backend/venv/venv/bin/python b/backend/venv/venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/backend/venv/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/backend/venv/venv/bin/python-config b/backend/venv/venv/bin/python-config new file mode 100755 index 0000000..a9317d7 --- /dev/null +++ b/backend/venv/venv/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/backend/venv/venv/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/backend/venv/venv/bin/python3 b/backend/venv/venv/bin/python3 new file mode 100755 index 0000000000000000000000000000000000000000..8e1f2b49fe2438795c05cacff8e2a132f794f570 GIT binary patch literal 8632 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 T7EzQJe)+AtMXX)T|1a>rRN!)B literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/_bootlocale.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20e7035813d45c43932d9884c5bdf28a7aca917e GIT binary patch literal 1309 zcmZ`(L2ukd6rQoYyI#lH7E~d6LGB4GwQH$GP>HG{G~vLZNF)`oAi1-Cv)S2rXI5{< zsWu81;D;nf{taheIrYwo6L0LKgbHSN-n=)SdGCAQd-fN*y9uN5XZYxc@rbcMym38Z zQa-0?&qx59G2jr?e8#&qm<5ur!ixyPOOE$p2L>?wmCpwHt8F5K)sVAqnf^Fpa&(g5 ziZlO{vE(rNCBPpch4|`x0=qEo_3xQZzhf|gq_-hBWcjVL-}kb$(rPX0%rP5xNS-?<87P#MtGC$#&6>O^ga;dnv&||4@-q*li}A9@_wpK` z($+}<_mbDdD0|+9uarKjxHo9{HK6&7rhT7;V=KN2Fa>_d95H>#Ah^qjk?{H1;Kk9G z4<5hvck)3S+O2H|i&`ApcHFqdc-x!X` z*I%Z1VI|r^=xQlMv2UtoEw!`7H_}Rh)v{2BPE;pKAD2GaLJ`BASGH2t(F=f+$Goo=@69YRL6T1X_~r6!-`ddE{RB*A#hBaYsly-O#B z1~dx9M%D6E*8k$pbJ1}Zk>WYagKM6;+;Wb-r8~VBzV|!d?~!6X_l&=B>CKR4=kfzm zZk7WAV0HKtKj#=OjUYG)@F8?NH_^635J-KP$L(a# zQth2G`T)`3TL~b2AJ}Y1*JUmAvC<3Ej-GwJe{gtk)W(}yxP`&>RbuTBrKMi`uiWmD z8#^K4bMw_r`D7IFoFD!3A5-g=V5+k0LHN*kn?##*FSLE7+_Ga5Z~5KHo^z;M1& literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/_collections_abc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3be2fdffba1408861544a322d859538038a68bea GIT binary patch literal 29002 zcmd6QeQaD;cHevR#o=f;q9}@@B!4`~vPH@iWqsI|Wm%>~O19P(&U++B zBxk7mh7vg$?Pg6k>nwKLW)q}Ix-H~(yG?+$Xiy+%iv-wa7id}}DDp>8bcz%$0t9Om z{X$wa2wJ4S-?{JIc{3b-$m-?bi~Pf3P(JBCo=g^$ccnb=+v+h<|}CN^kdLne06#15I*VG}!IVvjQhh|arxfT&L( zI)~@y-7KE7-dR9+-a8Knp9*rm;O3B$3tIC$^1kTq#hbmsn-}org1ZlI_Ib~HXS^3S zlKB_$?j^S$@A`vW7x3nyJAgL>-ixT?CGREFaWSalWp_VP_IocOqznfsm)t?5 z49Yi`yh}(q7Nor54k2a8dmi7sg3>R$2l0H+dj+K=@|V5K$ooW)_f>ZoX~RL9QMx1SCif((x#Xu zv1=xFz{IXI1~@0($MEH2-XzL=&3g^sy)Jne%LI9*+#|?yMDpD5ZXo3gl7}(L0Yxbb*n_jKh%oT&W zm%Z9T)tzqkUb$Z^*NU@CUbAZ-*UGdi|r5iO*NlN6gR#nZMq`u}=kj&@w z>qUP-GN#QZI>yxAR>sWR-aSwGW!9FQDc3!hl~!s+)QMsyi%UyVOlHy`pc$X>YR$~e zRe_Q5o}0y$6`-S;3tooLdxFS2W$%77{f4*hORN_#E$e9Jo#N7}r{n1v@9wHsDS6Gk zrtsiJ=IVOQo2e;OQr{cJXK}XlC&cKdHiGgGh&*LueS$?a+7 z;He|{v)bt|`oPBNVx_cDES{dKmR6U&O3gq0w�ARa!V*o~ac}ivR;ub-mMNKX^Pn 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 Vy`M=9yb^pF@9#w{-hU-y|36K{=n?<` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/_weakrefset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5fd98e46c95c17680acc1ff34297d61a63705b2 GIT binary patch literal 7515 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 Iu{OT@A74Mj8UO$Q literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/base64.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b52b48b472491e0a5885f8fae1b1cb39c138690b GIT binary patch literal 17112 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 kOue%=-*eG~LS#mCfq^4QR3tWdHyG literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/bisect.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/bisect.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..359260074b6d54c3cc406d4e0e9e0148f345e012 GIT binary patch literal 2751 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 byKvmYHN??B>ZQZV{Fn2rwUjUCCUgG})79V> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/copy.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1aa7519f8de1348c5ace00982acc8c8f8ca297d GIT binary patch literal 7154 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/copyreg.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/copyreg.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..009a29537c3346ad9adb9775c9a8a737199d335d GIT binary patch literal 4297 zcmZu!O>f-B877AxOHnIXmSy=PP0JQ`<4tYJXo9vVoYqO~G?#7-+o>ECHA``3C2A>h zJu_=*1quPIpvR!+v?#0~D9}p}L61H3&{KZ`PXT%g&|^=%xX(M>UCC-zn&Hgwov-)f zc^|$rHy2v?{l|IZSJ^9;^)Kp7egPV{QPf{hackY;HfP-7F84OQbvv`x8Nb9^-2T{J zcX+_r$JV+#3WR4{YgV!3TEg##@{VoM--lMQ{K(=nJcLwBIKmSx;T<}*#bm(f6$Pctqev8P3$vW+ay^eF0;G8$xQKNl-u_;4#z5&p{}A4NkYdc&M% zCY+CDA~hTgN~z7X@j_)0>Cr%_h>KoU2p(lc`0n+nC>yD)P&z46yf1sSro1tcOY=l2 zp;p4$Z%$CprX{51Fx923=df)&-J@QRVyAp6PK=ySbCJm7fjCXlEzwOK7>a)Mr1CC` zx{gX)m3?Td1#NRYpV^hIS!La_D#oq;jJ&3uiXGapg$3QQ?*0`iIL?ychP`278Y;=qH7y4tDK=M7+t{j&qD&yz0sXmwozgh{ z=t(y)x?Dm7y0lK}a-y?WPu${bl*Ocv$+Cs2W7mGUu`N<K~ zfHinzRo)>+Dqnu7=PI}Id(bwu$TN(C`rWTc5%o+Q_wr;@#qs`yG$~%w6MVZ0m@+=8 zNJizQCYf#$8L*19`j_PvK6-n(mD$Al2MO_A&f2)9peiRCdb z+ZgIG7`1R5T8bv{EQOyL*XXorSBbn=dq@tzTncP?o_2E+xvA=4a*NufS*KkvgbM;7 z36p<-N$UHkEV$jgy=42$g(LbbL=O&WGn-m%+qd0udx23qWb$>)nnpO8ha&uED2ieb zzJk&NSpSiILcoj&x8+&9=`eW?5BVBZgq2N25K@OGuwcqKUPFHp)ZasU8q~B66%z`J zXq?=tVxQQw+5Sg>Umk6YCLUrmm6mz*=5=H`rA5LivmNheGG?BayN%Bv@sWFk5q^C! z+ASr&Ve%_9+#oqkIChRGEhQpb=c5%fXL4ER__DR%-zEE;zVzJm5MnQm*Kwof-mbiX z_Eg1$zyt&4-e00Y_kIo-0E|J+oFNxptZ@5H>%e44?i@08t@y*YlMvY25+g%DhkmB4SfnRQHd z;23%fY=F2-l;CxyRYcgWu1Bhjc7<7{!5EbxD~%%AoP(wvLkLBu3D}h=S`!V+*iG_& z#LL~ntU>ZW7XTU_A@!H}&=8YfNDg{O8zUK{NEQW(InwdkxT*j(YEEJf+AD{cffc2| ze%H(`aRKtWl0wtMnH(!B>1pDhQypc> zEHfs7D;?9T;kslEV~jZN%FA#|#P=0E>e)En6-i%;9&nDK*zvv>UsYFCr`#QB{$vOlSORXpl>i~?%v}8oGehz_bQ2WVXfH!glgB{<*TJ4$R$TJvP z_e?IRT^gzbGiM<9=?DyuZ}A({6?^F&WI>)O?Aa~k zZ3J3t|CRe<6X9iia`LGG{!Gkta6R_HqXWs(oaiSXQs&xK}jIg*sO z>O~N+r%1_yBdgJ_as)2s!~ch1?>{CHmv*fktbWSw(!uM`P!u_#1;Z}GJ?BD#Lm?#k_aoQqL^d7$dv{0H@3#Fx%{j0}jAlfpSeaZygjwf&9&_;RkZEF1# zRlRUR!6|)@bzJ!ly(JAw@?m+0s+aS%Bt`rcMNu9m1vaW9zTiW3DUD8kL=j9d5ZxsL zeuU2xL+?Nhn7oV8+B4sVCw4LWnXe0qrN5($IRWvBB_dtCOo?>GF+S|TkLbJKd={C{ z5lMU1GhIZ#A#CRJz;Gz}EfORSBZ*y@RBHmbQIF9K9m)8Jxu>KPeBIIN;8x>qKOqT4 nP~?I}h0JAP82HS1lylsmAPdFLrik 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 OGuv~|BG;7r$o~QO$813W literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/fnmatch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a7376a7cab613bbe0351abad93d1b8e42927b3c GIT binary patch literal 3390 zcma)8L2uj073Po>MJbNsCRt~*Ef&n8Nu?l`vIvT97eUgb$)X9mZjg9)0okrWb4C^| znv`coi6zjvIK8!K&Wj#w^wfJ#3-k~4)I$#oUJDfK>!K&0`n{o~xIqr3G{fP%Z{ECl z^Sw87|Lobih37xct<`VOS=PVkWBRyg`~pR7qvBS_;*8q~>oD`SJGOZ{9ml-gj>{eH z@(TC1+)jm8x%axnJ-p9w`;A1>$5l!X}BYTolr-;INb_f#JU%#o=B2l5Na)Cs#^7WH#LC9XODjUaQWWn4{rod z?yamme7f8$M+y~$QItteDs&d;o(PgG3X>qp(&r-8ahA5GTB1;icWDZf7vV?+I_yIo zfr2zB4vx!Ax<_#(I5H5Q&?I}%lI0zOD zvUKXE$uQW{c%%cKVclt_r`80qZZ+%2;DxnZc-=U`ZWPtYRupF@4RTaboBBXRHsSHm z+d=syiuwqZwzk=!om)q2f7)hfGwtM7&JKtaEc_ctu_BZXUi1VUBZKLV&-Qt0bG;tm zc{1Th5K0kzk;Z!y?kGJ<#HS_ZIsx$*3So)jxsW4GY%?nEmeQFxOhRPG0o_=_b+jW(X(o5VBpwTH#>HL3vy!z$R5ems?0|2(!x*HXy*9u{ z-C&dr!G-iE*n}|E7#FJ>!4TnaYRBIZKjrwQTiBT@Tm(U{@W~1?M^c(;+J#HOUN{i` z#gb>xcf#9WK&;wf3Ri~h2U#@SLAV72i*~FgpY2U_i3^&dsqoc5D&VU{iG`+*5E=QPHD;;1Rmb zLnhA%d>bFy$}J6|%7zAwIa-Fi?11gtn&rrp=y6h?2#r2RyN8wBIbz!$sBJHg>yMuO zX6chpe){vJkDJw^9)o09OB!M3&5;(WaFmv^f|&|iilRD63Pr{6sOd_|;+-m-w*g?M zifyAt;hQhTngnLZs)n0N=pZYpn_%Mu%KgtE40Rc<#Qs*(leDd}N|jF)Evu*v zG8OL`9(v(m0H!o6MTH2cj3)~Zej6rQzDGl9R1qWJI8jmxyNRL}QCYSN*7&Rr|M_eI z^#Yq`Gv^Ug2ydKs5e=}#Fe3+74se?GYs7-_AOElHb_0nZN`@v+Q~V(FQCO7BrpG1;nw^BX2olc2S^) z<@szDDCD{sZ@x$Pa7LkWz-((Dp}`Rpui4%|bA(9Wdd=i_lZByCT6ImUyucxxT zU^4QXnbeWrOr^Vj0uM=ZMg9XbpP`vwv)zA_y?Nz#Hf;9zT<-O&^84I7WVqnWAKCj} z`g=r5l~AQEuyPJ-J9o)Sy~!H=z5BU!X!C{K&nrjHzMuP`1bO4;6DzMCnlmu>X%31V zNK4Q7{0FeYhZT#kZHhCt5RNY#y8Jx9@CvdA@Hoy>Pgf2-ev!YIdzi&1ObwfwS8jb~tcwoyvmUVTP;Kj?m%K?105JkU~IGdM>PE z^J3S>cI)~HyIZi<30pm3S5Daa*j`&5+e=F)Yz@t|V~WZXwsh>^J>x8O5@!{ak5J{- z`UhYlJH#cJvm+aCn>$DLmpCSNZSG=?75QTTNvEW2ipCP6r$8PaBw-|Ql-RAC1$#Re zpVV$|iIgsMcQnmLQ@d>ZquG_Ib=zE3)t%N1IIcEUuf5FIn`3uvZSCU|_S@yAEpK3? zyh2lZSJmoOwLY#j?y66(s^(g!=@$;}(y{?@;dbMc%gd&@oyDo7vk%A1aI^4)io$_t z*2)~n;)11;@>{{8f^ByyN)Nl;ju-WYXZ=Yw)xuUwU!Lw*%qs;8@W2SNq zHFE>cvP2OiOcFq7V~biMha2WXZL+_~-R9O|4%AbNFlo)4k^b$Sj1LoWhq@HyY!`-@ PpN-S;!eZTD@az8t9cppy literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/functools.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e04d1c8c09ddc29e484e070ba6930ab3a9a6f2b3 GIT binary patch literal 23867 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/genericpath.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/genericpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89d369797a432a727ddb3fd9f5d7bd0d0a75b333 GIT binary patch literal 3808 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/hmac.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6e6c2589b5366a4736508d23e79b171814c9286 GIT binary patch literal 6166 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 z�YOB_F4-4#ES`mRRd3$c%E-FqJ3b{HfhiH;OQ!mGoMTckM}hUvaf_N`m4<`!gjr zC)EylzmP7t7$jv=8KLc_Dr#;!{d(A5;zTW@uA)$E-cG#36Lyku{R~OlxH9{bGxm{} zF^jSPhDHptzh6{qF}&dzakg4Rnc2^w$C$vLjnRJ$*2YoKF;mi>a#H{=%G0&Kp(^ru`|t}P519h3sQ5z} zE&elYfMkp=YSMml0oGGa`^)q+jtdlNIYnPE7s8t*sAXa=6mJkkzPdp3et;}F(@guC zJ-10JAxg^ROsC&S6?ykbz9ZqyAozHZ*6}sSJymteUZQLrSuH;&?mUV8H*(#y<1!ye z@Hi8VYJWhA$k8*(1w;Z>iXspXtXNf!6v%h0nCIZOtf04QrY0B$=ov*JW>T1jVCvh{ zEYhRkzlKVYFOyVHfB4m$+@g^(zH8vaAV+rUHm_}~a0DvJIC*A)G#v3o9E#DG6?Kv3 zXAx3$BojcBg8kJph8QcFTCDO;G95r|YMXhB`Xll@Z9KbTT1ZvXM#zLv$vSVIw{5!` Hm#Y5;3%3KC literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/io.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/io.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a360d60139943b627239d940ad908ab8560f584 GIT binary patch literal 3469 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 Ly8)|Ttkb^%EpZXD literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/linecache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..98c4fd154ad870fe9796b62e99b3874c414e6459 GIT binary patch literal 3842 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/locale.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/locale.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fb0fa4c782ffa8797ef1945e7b80b4080ab9e55 GIT binary patch literal 34608 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 Onp$0Di-M*<;r|bggqa5b literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/ntpath.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/ntpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c48ee723e42d541084408e3f25c0599c82c8bc69 GIT binary patch literal 12972 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/operator.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c86958b6b4c7ba60fb27a6f77cdf36cc5acfa57b GIT binary patch literal 13953 zcmcgzOK%*Ko(g9kQZ6pMSyIw$UckwgrJueP8v>H3x}1r2}yVV=9!I-zO*$`8H2i@3Rp%P*RmMw+9MP6nA|QHHXV zqdbjJfktVJw$M0jrERpGcF<1RMZ0N&_RwD1NBijj9i&6_1|24wj?hthlaA3O9j7TO zQi)E`Nt&ipRHhj^O=svVoul(~fi5mwbac8zZ#9f%)3J1oF4OVnnv9@f!?K4s7L84T|hlX*XR)HEp(mUKs`?Hk&fD=8)Tr~O7D}2 zdK=xO0_yGb0ZpLZK_Ajy)H}saXBT}$lephazn~K83Hq2$px#5D&=l&u^eIiF-beFP zM!lbI(G2PX^ckH-eULtM~VnJL(xC+JX8s3EGAF4Ap2i>a(;!J5isbMcR-0 zJk{v{>I<|)2T@<72Xq+qC2G(S)Nj!;9YuZl$rxs{*?9Yo_LbJ0ur%?`gTfDntmqp5 z`$lVyf32ZKtMT?SBu&>u#+ema=ZeTVb0Y7&D@L5FqTpN;qt10&zTqdom=97^O-p4d@c?-Ux+uH+v2cu zN7&An;)rus9Cf}D$DFUlr1OoKavU-3+!LpqZ$;U;FJ_$Y#A(MBXPocFS;rISoQgQ_ zRK*2{#6?GlOHNI^XZs?sTQ$4ZZdQYOtLfX-mXyL@X*H?dT(EDQ};R@}4C zUw!r@SZp=RwtW*&V%1w-X^3gN*QD$b6<4S2CnX!m;$ge~$ZLpZP>4GP5kT^RYOkJr zf?n(aiIaj_k z(_bemPvmg`9$*p`-NtLk*A@9&6Xah3{fgj{AuluWZ}&KeczK5(-$Zd3S2_@5801PS zkP!edP&yEE801JQkdpwIN)3`32AN9*G710&O2>(%KoTM~mu5<~p#PZ!2Fou0am|+! z+bnLn+SriLVzJm>Jn4Eg>3y-4YQ9h5y9>B_3~bo>nCe{S2|`6Y=Vs@`7b0lOrhNx% z+^*NKJXjs#VcNb4?J4XQG@pE2_eJ^6%}DAtCV;_N8hZq6z9{p<(*)EMQhf*jS5kwF zD3G0lr2`Ni$rM0u0OVQ%C^?*KR7`-`dN#a9D}K={l}mbPxv&&aQ)-zG%@}w2K>}ja z0oyYq5T1Q94IA9&$7wOHuERK<2E#=Ex6)$lk1!JIY-T162*(b$6CkggkFNGo`!NEU z=udpvb(J-A-J+V7k^b{5=4Jv=U%dj3p%Y7WYXmmh1N)=R*Xdq-eJ|1Trn5e`ZnS3E zc)eEnPXgfkv>+1^NJ5)Urokwoe@ct7YaPakG#H2zwZ*g;+ty)RO@qOvrIEl$O4iU+ zk46ansXn#&R8OPVl|;{*PWAP5)OXWRUq=5y0%H^E3q#bO+?;y0RI7=eH>G}O)OTW8 zpGY;qrvcDS3-azdkhxTL_Y463I4#KDb@Om4%{-h#|IgE699V~uN(Y`t|1Z*FTw90n zT^c?(6Z01vV6c+sODVo0ZrJXT{><=gG6J1#;F2++Jv9QeYdq6`iC?<9GFoP5vZorA z(VA9)oo92vRzXPmu+6cUUk*oIHx7baw{v7_(x0+hl_gOP?5fwCg4Grrydks_O}5 z7-G#Vu)bX_Mou5k!nej#BRLbdHJ*h)$I`$eh<)rMiP@+j>JBjUh|PIQBH1Z-j`bEo zS-mQ*mfp5km9q-j>b;vs%sL`4pPcX!Vd1XVXvbonm^OJ6G=}=p@TBd*&wt1K@i1w| z4oq3zsIq+VAJ=_Z{3ze4g>O_GBF2unx*THIen(g*G{~ z`95mXh1{Xd7#0lLJhkE$+{-VMExJ~ae~_0yaC^{WDSG}M`pxKC!}N45G9PI2pU8sF z8;Nxu$Aua1ELKy&#$P<`UegwSz^NKUQ&A>quqHXpp_U?aU0Hpla(9SSkOZr>8%kSp z?yTP7%vPLKf{L*pFN&sJY1bPn|5cN%W$08J{YkIV;N%vQ@KJ;pD^kC`66FGszA2Wb zRZHLz$`gk6WCf`r zPvT*jGhSttu1teDz0;EsCBVq`^X?R2r64ez)VW1fYg_dq+Ng<5HeNhNnV9? z%4=L)M-iI947Uz-7LH$o9jaH_L9`yj@%dKpQ7?%oNPdVYa<2SfR4=@1{UtPo<%(#*JE7cSJuO-jk<>!$@u8E+!2y??GXrYe0n9ZhI4N=iA*-BpPNaV(LG7^GoHHfcWgMJxgREtw=)u&={ zWh}c^l%;sud|Q_Jee(N-jlQ3@rwA)>O+O3Ceu_~?)98>JmXbX#ZqQ>{sq!iGtMD71 zAFSzoG10k_`4}Mjj$!)W#aK}9S(h32!;H&}_WckZc)r;1`b`vF!=LS|%!vRKshlpo z2LHr`U+~f*<4671`mgYdn%umyQkt7-mb=`_*aK7Pnn5X0c$=!*|KZs&=;srY`<4<)qozU*a zQ|)0E?uxS1^T?EN0-O<$)BGGCAU}*r#qSxe{b*^h!xmb+Yw+*fF}qC~M1EZF92tm< ziuLP(>y~F5EexVRSLQGJv@wl++BnV+BBo)ipXXobH(()DKF6Hzf5PmrZDc3k=TEwd zm9G8*jqf6N_s~$Ir1$)o&?uh{vr+yW83tx(z`@TWvkRih8zOW6#T`b2)j9uK76uIU zJKzBd+SsdzQR0EbBI2x*!c|_b1E8OKV47YUk(?C@O-!BAYVr<0X8aZGPslHEFTYdo zm%SCW=;3TzzG&32-+?)DGFuvp{CT58psvI3mYl43=wi2!4YBgMxWX1Iy# z>L4^)1uQvk*`BG533WBo?9gpMgHB;AX zF%RLo#vLwlQAZKxT$fr^j>}xvZ?pmoi4^>{#zljRWiAH%_L)}F_dC4wne=?l(k&yu zBX8z2JVO0HrsyiJ|BZ38@qOoCl&0=EZfPwWJ8@}@8n=tILhANCSQVPMlx5+_;f3zoFJJ{=9TJK$ zwjO%(D8GAw(B6U&xmw@CKza7sC|zg`)F&?~o*-oncx`o&#)x9HSYbx03d+l33J0oE zX_#FJkvlRNi2px5{{kv!pSF>nm-oPpinn^&b|AR-@oImMbW7`;e=X@7>UX7xzEc9uRc9Avx(7sYWYOBoFxq$wg9S4}Mks@QU2d{fy&=wKYO|BX2}ndIRG7 zBE)mcBBV6T@1doY8aOoIptExg+8;_mM`}-LscWEKE^$%e;sF;th#ML~K@i&5m! z`yj$7nQ-#i3qa+`1soG`A3WxpzG3UBX0^F?7emFq^E0HDkayTiNIW6$8s}Qc+^0eP z;xyJit!uiRg*BIq0B5uOIV7VpQAQT0>a;&KREtbkN4sq7-2cQ&xN|wltlboXa9Tp0 zu<>zjs3{QOFQ@|%QQ{z;17<-**zyK3Y^=AUNC2Y(&*+(fk}vZ& zv8QQC-VKzBMv9n846|Ytd4G!ZbAJXRo2J~?wR*f46FkPZ!}PJg`EF0WvDEC)_d{Ob zM-R)(kQQHK=UCV=$eO<&B}bGE-(te}bsa8?wpjHn@ zZY!P)aN4buRqG(KPkoUKN7Qk-R;%Gl-ZJa4$oIo6va$GpS!8cZ18chwZguvon~48I zqrs}Y*c;V+RvC>^7>)dz<;Fv(WSmV4Cjzij z^q@Z75bAg;sI36tyw`dtUPyc?uBLIr>-2RSV|}j8&hh>xh0R>EjgYptZg))1q3cw; zV)9+I97<6?-P#bUn+j?_pt|Xy-WxzAWbj0~5j+5_KS_`E$%a^S=?)lj7WB{3W4$%NO32`; zR71$eKL0#D)S(Tb(yihnfchal)cl4}-=*T}D4_l-2?dL(pFo7h0S@N^c_X`2SC5== zQfa?1&l_X`HgwcUVL6L7>in%bA1nF%syxZXC>L9}IK{;UE)H?QzL8{gBw5Q#){l~X zMY)%YeOyd(!N;NG2`;9%U`rs&T<|#>d76teT%6-AbRntSEHSS(Z*&S8t|}JIN`}RMDYzy z$g8wx@BBKle^(eDjc_U*?~q@Nj;BZW(Q)$VW28;vn>MnzDv_#AyhlIcAUSS89*&VK zP@E+1-8{w(Coa_)_vl9)CdUoVnZyUmqhE2F96X?Dbh-pTB1IeTvvO}}AD`PtZ)}G7 zm-v7>UUQ~9;#J)-vkn@>$M(@+3myin^T+Y={rKaEMgABE{)<~8WM|Bc6OLK%X+xKfEv4PUmhe?Rb`J~e9?tGNEELLF2yhO&hr;3X z?85$j|9jt?8Cg!!77n`{#-97`dvibj_ul{4{r~^>>46zRH{E zb2T#ere1RYql1PUTgfDyV)npmwN1 zwNnkLtJE%awHj8hn!mc3Q@hnQPbZ3bb*;J%*FLq!%Pwa1U#dODf_inaAMIXWADB(7 z?m_M~^?{`w#T`z<%WV#-8!kCc;&h@hoKAQ<7Yq71C&7PjOEi*?8u*5aSFH}A-i@fY ztGKJD^lx8QdZ0LfcCYsOynzjeZJ!xvd|bJN=UGQTrCdPtS_{!|4AJm55bZV)q1Kx& z>*ZC&t7NW*i^I0JVcXlVg>^WFwbRa%-R(5;-cGf5!+FZ_uEKopRZnwENsXJ`$ zPWA0JcbB@`=I&AV+T4BW%{F(xI%snbsL42Y$mXVOZ~KZjT?XmC;?421!|Fj><46qs z(HQ!-sE6#YZ&Al=?zozk+`i2bFU57o$WN$~_Sd(@qdXPoX4I_wnpY3YOx}z+eZ=PW zs?&JN`P)|2@>usCt|2t!QD+t25Hx1;FxH41H&wACF;qd%PZ^rmT%xll=RZj61b+-6=RW6RJFDRwFr=8+{RaNuAf(f;tYPcRCZYodBtJ=KG ziTZbHQPolMR-wJR%+t4dsfDC>)1vciS|9P=Aa|qYPJK~TR8loQmQ+pEdOB5nqdKoN zTE0!{w^)BQ@7*pmxd-&}ro{qUIcM;^mMGqC>DX5RYTcoh)dgJdR4eKtuHUX!)f%pM zsV7t$*SpoadJ@-r1nxjxP#4vjYO5#bv+POzoO*|PC!oJq{k-}PwF|lXKrv6%-@J5x z@qQ=qU_x!Er=L!!r@i|(QpJOS?1ADWc*_kIvW(6f$ke;kyV1`ipxX^D^Bym^n0q#( zZ;(;F$BybyajK{8AzSwusXJxszSq_*O5OJgobOZLiPjH$he3vQyaPBu`@^2m(+Kw521zQ zQuBMHmk+D&MV)DHdL!{zvUs9+^2{_a`1^oyS*&ATeS|rmxsRG>$|=58olPf-r;0Pu z&iAVyP(Nrf<74WF(Auo}xcUgL533(mo47urE~)2mJ*|F3eFE1rg~0&Vm>V+ zus!LP`cd^slzE%_G4&~2IU`rAPpVJNCvCas1dflYPpjwg`x*7)>NB`LCgq-2pE2ds zFQ}hX!x-!1SkIqQKaKVL>5XLZ?dspEt5Le7KC6BP*RvSc=VXNc#XDOptIv7m(j031 ztol4^eBN`;Re%FZC1(<2FO;X#iNuK+S2ve~TEp|*YE!$@vo6w;O}}>0RbI<$s9Iy* zZ8qGMg>vBftA5}uxhvj?_V93`P?%k)`L1`d)zpE1SHX4nyXAV_tu8kzL9N+9o4UE= zwxl_<+X%*8Z(@GJU2fECjm2@-56XNLR3@Zu)1PRSg9Vpu)`A63o2v3msxudrY?PP0 zu973t%Lu_AX#^utsmiieHO+Em^rkr)?X|S$dku_w-bF7i%4poWDCkv!re1YN%k`D= zs_%|WjEqGswaPEw63Seup{|yEuSI~^^(eqCyGuD+A>4TlA9L<@RoiA1<$8B5+=7<*G=o@k%zHd`-gZ?(jR2!?tF=0iadhM{ZO7cOSN&L{ z1Bddef);ijaa&%l6N<8~EXZgCpS_D-WjQF%p~(mem ztI}JC&;%A>AE>s9c~$P*s*qybpgT&+8@HraAb?GwZ#_0H(AT~41<%xpFmS2dsI`^> z67ec%x|Ti*wkf|=ubGjbYt|ZL6NMM4R8NOlgJfaW5MP)zq!XsF_+idsP?)pm5a#S! zhH0XGm}UV!lw}I@GgDI!m1d@9ZEo`6Q#Lm>eJIRVLCBS+@|aVe^yAB@CRigp+g%&Y+|BB2Nr~+zXuo+H!6|lHuG3`eyuy zyPc&4P)I4JxiHxX){;94Yp-sQG+e*sRch5*1?-$)fd4Ev)LPCG%~)Qi(2nNZ>I@U? zHxrsr=wT+D6Wz~b1WARr{P4;;vb+Sd?F7J1eFN~+;WbEZrm*17bqUdcxSYV-beJz$ z#Fh5KbjkOEFjZCxtCWH$43pKZ>x4r1U7-`7T_&6%M^E5d96WOHk*U(*gOig}GcyNg zLE)8(=ljJS=K182<0lT`ai+3>v3H)HI6ZBiHdh+O0aJEn_8|U+X^Q@+-G^t79-m^n z8K@#lUa?<_9y>by5KB^3u(gjrbm-_QmRnlHlG~1sKXmx$;S+e8U0STxs?E6Uv;k^q zu>qh=nX zD*y1beV#Q6PMFb4gwsr)jB*;ow6GkWJc7}1(pbj8hi90|&JAWTnxsR7ofW`1{QyPOM_oI$Q;$wfJ~9=8!+Dhp5wM46Pdz+6d2n_r%m*5J8H9bbKo+2=x><#&I|}c~ z6Vr#oJh^D4*{GsFtl5RCPhM+sQA=FZM-I=}+hdbQ4j()C;7pjSEL7{|dEbr)&oQ_# zTdyn-A?zwo9^oL(5RO?G3I+k#Y_V{BrgZw~^q~`{XI><;d65+H;y)mJxI&8Jholtq zz@NcQkl1wEAc)73>#6m0I}KsYC)n`WCn?=-r*#`olYHv8SBJnCQ*D@g-j6M=F}?(8 z@XkjJ?=+jXAhVtcvh8$`+eqqGkP9*@xshDYwA1a(Vp6wNY9_Hd806a^NN#-5&OY$q zKD6@_rk!?De+s=82%Z1@Q;|^z^~TcW@5HE<%8MQr)gKil@XR>biFfa<%{%V6<8j=H zG$=I}?>!7Q={*j8#KmW3x#j8oLKSzr6`(Oxy0QzAUhUFqMJb`?(|}g8gicrr+8dRP z(@nkTyYCgR)g_xF=>r z1hC0yW~kZ8V$fNG!!hMBq5!1ML( zY$j(15N2vVR(&ihN=BIGqU(oPBE5johv}ePs~6K1l-VNR^fXHS3cmh6B#FYHlZHgw z1<5w#3?{R_JVh^xtp-|&7de(r$ zl_vI&KK4PfS%#h*qrYq{1P)6leoPB3Fk`6cW$ZJdlLxhWwB;ovD+|qNS7M<61NNa{ zLTSf_vEh2ud)#J)_zDCTMDty>EF0W_n{sIF+khq2K>OXdP-WTLgEAf;$W3nLmZ4?=x+PUm@bWUO9Y?5 zvK`EsE21ot0v7YPBE7WGgZLnId>mrroKw;s(`Yz^(>xO*NVG1)9rU2cQX((qA@$0B&2xuo+eO@*(c}qgN zh+k(bq#S;(!k62M3cmi=z-$eFU&qF7J&kV$-z=yB`qGB8o&zR)T&{EBH=CD#i^OKTVO*V^gLY`gDVj+>&!Ks(d9 zYdii~lsMZ?!HqSnQtSPV328Tvb_dWdjP@Kqe!VMhdBC`2x5Pbi!)t5zI=^cdmeMe=@PYV}0;qqn$pKc>K2Yo$W!C+6nz} zh_LvdXzyqb!F=oZ?+ymqLv081klIL3q2(i-Tj%_{0o|<^_qMaBzh`~u3Z=e$8WOzI zyYR7e`KwS{4#gJEKzp8R*gq_cmVORHrg&x8&pPBms~l*i^FS)bQ$NIz_Gh73Ngof+G{KhK{?dHLtE{n0@2^V7XQIjMC-egYL*n zM9h+R_~T+0l&mRbO9&&ghFvj}8B-pZUk}t^Y^WgBO$~0Lz@P+H;R);{;#mIjTr^%X zaZEwf+vpX>Li4rT0kNkK!*jaZ2P4}bb+Bsfot;ihTho|e)Z`44Wl43r7K9zM2972A zww)hgZ_sju2ghbv-?TQ{#9Bjz2U~`w|6O}ErQw+(5T*NkH}2; z#(*!}jTmSNY?Yg>Zs4RTdQ8gQlhh4dIhLemI2Ja{zky9!=!MUH3E1YEK>%OMax0qL z)35}0gUI)h*gbWTgK3OB)nHxsSd1ciIdKR_=|E;E z_<>bA6vVY6TMjfwj~?5DUDMj1M#r##z-zK3yTcFy5-55Z08}{cT!aC15k0H{{z7vZ znj)}(T*~+l?**p$ zzXZNuwqxCp2rigr3=C3QY#?A_W>Uc(=c0yK8ol)LYVuCvHrJ+n0h*_{dax5fW70%i z0PAk7*s|ILEb7W_&Yc4`S~l8Q1c2sG2oc7{lWMbGZ?3>KyENAX(ZYn&fFTEi+rnBb z{Kkb#U?5ujbJh7kfmresGk zS%z`9*|^K)cANTj3+x4ptvx!Ju(hXHl8GZ*1(8z7G)Az3aG%W!J<9Y&-r5ydtSo_B z*$}zYuo+**&PH^0(2-pwnYIQ9#gLk5RaWJ42Qcvo>W$AWx1B4ZLZx1#t&4LHzyuoO zr?x|!x>#NU&D~{a$9e{v#@HluV|@XU(~y#LoKx-B)+}yd=v1ym^RZfwXdrgoM@Ni* z=)f_!ipWjtBV+Wtn@WkL z@Lqqy*bGLc*qH0S&Z2~HdKY!OIkcJe>BF;QJHl+$Cpzi-vFVZh6`YH3{DnJafLKSt zZpEh=W@~;4{lK5mqA%3g-e9ULS-ZY5^`R6oI!tqt!ZZq;p^s0V4K(-|*SM^yAq0D3s2^^zFju-RT zDT;@4i=jnVP;58$dHz{s5_i$^hkvl?TXAhnXzK2>n`B&D~|nSfJirx|%PcYc@!sHLhBD?N?&Iecl$ zA%Ok|kZ>m&z)r4*16Udra{l$kJGq`{r~HWkHXM~~r&a3xDcIdJC=J`YO5-lO_5ez} zJ;-h5+nICNg~66z*z9j-P$#?LT!JkgyQ3_fx%lqbNZQ?07Q3kocT?D}Wr9JLb?61n zz!sS;r{S18^wN7IBIqo2mN}1F0Ha^Zl>inr+Rla7jFL{e4CfGT@lNNqtvekyhiM|R zZoAu&hgD^8n}yHX(r3pdOA7VR3cETR2^QW{6e}Q94I-0_n3xASjaZ-7axflq46-@4 zSXF05UK!0_d42^dI73gghsXqDRot?t>Of+-AEBECmn^FboL? zAWPVHx2PA~-E@tS&Opvlmnz?xAy?)WWZtErL?R2?E1rvT0`VX!Z1fY`lR*L=Bc3MW zQMsb$TPSUejupkw;wb%O)+Vf#kpqi_XWYh&=%~@`TKpmcbPWvh1F;0g{0l!1a1^>_ z4RI=BZjRIuHc#G&S+Z;q`)Lo-*KdlLwu+frZUKK#X(^K5D_CU?bJ0Ug4}XY(Gy9@? z6Ji?{XiwLgk%f+(^-4)T>6Mgx!WJ%*gK+ymG;(pFsQ43R@GmJ4+0-i)ik-3|7|{Wp zoZ^KOBE)*#Yx*CNpx!qqL0OBRu&-3A zHI#R;R62|p58B;z6A5Bqc$psCsZZh>rXZoh99#@kW%U^rV+4x6lRxH9lujKwF@5Z9 zVbTwZxtY?@8F61@^2EC(ZnV5l28M|avn5$j{Z`h^RO&!nSWXq2^O#hb#E?MX!pl-Z zR7eIiSXEnuV3?7{K1nf1KSbiS!%jX$N5dejq(gL#Im1c)1b(T|dCbocz61D*c>2AL zp)?BvX%62!1kSbXjJ{qW4j=b@7e6e9xbIpov0gJi%eCQzuBK^zy!bWgIj?`OoonQS9DeKDNWz2|0?w1| z3=EF@#2A`{8it|J;#5xq`=h42HRDZX3CM4J?GfkW( z9t%1Fr-@Y-wa2b9IwM29^iC$!$8?Da-CUxMg{ie#OE4XwNIt^AxYwBC##S(2`z%QG z))$yiZ__JGE+QEl(rdUBsX9{Z7jre=IE1&Ld5tyZnJh?os)w*g>P0>h_*VHmBjUT5 zf|$mk6QfFOp$6%k812(Bm&h2Ea0rSV-NW=7(1Vb729iP_P!D+>5=HQO{0c=7cXZAT zz}v7($`0fCwYblNj_78VK4Pab)x8wH58~?&BB2^)LL!V?ZLP&9mAY&d#@$=6k@u~* zo05=C+3!J(io!RIVj}zWXwwgk3n~L^LNIu=W^p?hiM42(*wRfp;9zNCK$nEZKvzvu zREB9*-ZEFFOno;-V8ZP(`a1xBJTi`o;af5?7a7FGA@*uLX-0^X0nWRU*CpUuOgT_q zp;o5W-X~-Ax(Cax)P-+;#8gT|(4du?Ziou@1@1h<$s^A2!z(9n65s8a#0#c3i#w#& ze}2@Fi6JO3+^!mXr7_OJXhn-FcRl8$fn_>*2}ZtvIlD5V>33lcZs%0VDeIlT)m4$mZd-2_(DL%QLLtA~&zY@@8 z@~gYhUcS>FG{8Evr$W$QrThI0(4YFCKjqtfba#us)c0f`^(84cfHHq(%M7zjJA<+0 z^?yY^v$Z^QqB?XUmgv)8Z)c#*6`n#wH$$+d^(ZHHhsXr|B=TX-G6|!_Fe*$lj=-oL zRExsYQn_U;Qdb>@EQJmHFe5QU3krAP_TZst=W8@02@>k>VznD+rr1Zcm6+;c4nzgh zZBXpqQIL_Cjk`&F>p|3 zpzI_W?M-_a?O;@T3Q%E^P-%woZ%Cf+k@C_;Eagai)aL|keiIq0$n^w*;vwQO<-=+Xz>7!g7?xYg39pjda|JJUG#y%01jPU#@4&3-&_#oOq-!>5?)yiE=2cG ziUotB3hS}Wh!EmoM)Z>$5iMQ`8Iibul0Bn}i^h^LT8av4`J+gvit?=4x^wZ`wgaQm zkX;Ha3XM#7P5C->kxx1t9u^YnDo1Agp4kg9tBdL3=3? zg9xpzL;J+D2t)$}PCvm%DL`Nw{2T$=(kafFp+u?lCH9Fg=4WlF3qj?_p6+re!VHn8rY!xx0ja03s0(;PAQsz2ojVpyGUaQyda+zY*;SI%+(sE#!j-}W=XtRU( zJu^YZ^Yy-a7z=W-rSJRYXd2Sa+P78evw_tDvNT~!`w`Xc!GLXnPkaT=8;BoY7?H9B6}foVS1gxZ8Ipt2s_id6|)Lp6E>daH@b(Kch;_s zVd#{Z9vh$lpkjqnkA)KL<~Ui1{6ML6ez`1~aH*s}0oe49G5HjePc!*(CjW-XPc!)} z6P}Ff0!gNY3!r}h$wvs#E@Yq>_vQ2XEYfT~mCxi;@_WqKP!4o$r-f|UlDCJ?SlQ%sh~>pOP$Ouuyu!JAmsi^SZ*dQs zY#d+t5VeRa?7)8pNdQeA=eCZ)Y?pdE0UbW^UU;O}4edfLc{;zItU({Y_!b_sBn3Y{ z3@S|H#8(E&1bovQz=QK|0QVjZ(wmt}iT671!N!p<2zomI-h|}wq9C;6JVPTPP9VUC z&6>E!QO;bD-^gKT1+xk3nFh}73?X#|QsXO!ha6OHyyWN7yMgl90T2h1(`&=9J3s-) zIaEaF;-CVw*PHyYjQDEwI2zI4iv(whpl|BWA&VK@PVDtn7QD(LoGbc|IFE)P3()@7 zURyF}xGd}H5Pw{wX9Pr*tML^ngYg2|&BP@u4PcH%{E>%~yRwX8kdw3A21NxisVn^{ zVPH$3)GPKMt7<*{a|WgVQDn#<7;Uiq3~pwg0oT4H2HPvlWVqAEn)(2$kfcF_{O6y-U)p*h0hvYK! zk{NRG%S+Ra;Xb=%%X&rr^H%mk{?j3nE3lt|lHn%OUO(aOa3KBbXyFyFdtvpLId{FX4lk#WMV-5*YgK;}<$w&o!Q#wU@Rbkf zMI;}}Cj8rw5bq(ec!lK(l8f>R(gkmc$gd~t9k=L^UetA}q>s$>WoRNS_GW3&T0T)c zz`AlOyU_KEs80lpq8(J0x>1bUL1SWaPZO{3F|lsi{CNCQsM9jEhQ3-3tX3z z2_%6Ij}a>mCpKa>CXRPx3zr_T0lx?%Rfvm^DcGPZ4N;6QMT82Q;^#!eJ&ovx<_bEO zcevoA@N7>L~lll0kNkx+1kj`Tm|oh=@{8rDWdDB0)m)WmLG1i&tNXQM2nFn zFn)r)a;mVpFQ5b*SoAqt52naVnr2@|T%eYdfX9V4oV7irs?T?jR66oHdT+`<(pnx8 zG4smTGL9nuM_Wy-5dxc{wZt066Z-$mS_%iG%md&154@OV)c+CrE}2YQ-ho%PhE^)4 z^e?fAUq%vM2aeF0RKYLLpb5H@fCjM@l8^NCFA_E%A^ahCgOB8tYdy&-=;nNB=J_u_nrJ)%hLqzQ8rq2Tym$oRCGzG5=<-=OW#E$8aP&vdKY9L1 zSkRe&9ziX*_Jd`?lFlbz40iB}`$3fupL39p^wRvr? z6q1v+F3thVdlRgY8MbLT+xp@=Fg0s?;XZ+UM|=p?c%H#2*I`j@z&gkEb3zIx8iZ;Y&Cko-v11^Lmzz5=i|{CL2hKX`a_8rqDq#y}}f)m$@vg zqOW9d#;YD9ZqbUDupuRR*fGBuCZ)w;D8E`^R4MS7%N&Wk%(X%&?@rf8s z4TU&?y^*uQXx?P`RS+_!(@_STnKOh4?WY^r-G3j#2m=ohiiN_I4LKp*7#R}jYWBPf zt1#-Y%u^My!{TUF-p%3Od#@WIe54(c$73d@fHZI_^(vPt#@`U*B@}Xz7ZOGtg~F-IFbG1Em};5 za;yv|rQi$h_-_9NP~m&HqOXVw^LAOi_jRr7A97uVg(8FJ!apCx)tVrT_}bu$pq#Rt z-yv?)dnoXhf0bR(ohguBmb8qDTK`zQ0y+H^)QeXjl3ua`H{chl4h+4B6$#u+Bqv_M zfHg^VWLdqJ%w$pi34|GpqyK`aD2gByarDZ_$Z*HH_oG}x;fQ&J5dKm3D!v>YosM{8 zy;qdI93lNHTYOn15`;)m^|FL$SF!c^m=g2)kGt3K8>hs_JFEIlkmA3t?aQuhOso`I zuZ&oY%&WJ&U+kgQucCp_(b8b7gmTvq?;PkVj?K$^I?gTY+JZ3>E>|1{RS1W$&yp&= znDp-h$7a0aVf-c=a{OhEL_M?4ztEAWXYtxcxZ$wnf4ZGIhxi_q!!?gO`S-(phb?~^ zFJa7_!^s?+BY|OaOR2t|QUg&b@pTra*KV#g5a@y(US$cEdHB=Z(VJi{jGS*a0(cA> z{GZ4StgP*fYH%;=-lUC9;PvuWVw|jt5A;We@|PQP%ko-i#l}3ma9Wz0g+D(dv2?J) z1PTW_!yF3oI2uUtf3UL*Uk}>Qe}+7QI#1%#asCl%$$_BqNYzC zJvkNjmsWJSRgz;^;f`6H4?KF}G@ig;r~i~KzR1?I#T3Rb8SUu#Yr% zzFRgan&#r)A(rezhOs9+mTZn8Gnd8IpWFUjI8|bD6_$%WRH5$2*S`nJHy=<2kv^#Z z5>3Qd35YszBQz<{-H(_tIQvToh@xJGjWfK@W;qbt#ld0HpF>$L1{X>H6>hc;_!D^c zXB;qD9pkqUWYd}6PT&^UntV7!ekbwu??l3|Et={P*@PTyL1awWkg?IElL*%68j~PSk8zoUlL2uO#AEGDOY;yUoWU(!@dzSLJTdm?YwVEo z0SEA_x;u$W#2rO57wgsZi*nwg^>fS_EHhGL!|FA6FyMmbmQv|&ySm-7UZy~-OR`rK z?sh0LD2nHuVyuB#Rt`yW_U%L)U+R|bO{5%)mP&uu1;I7F1GmkUO7YM+zXW6wUoqX1 zshYQd8^ldBl1f&8`x%#zk*{}kxnIv}R-djenUu(B@v%jATDEU2duwVyhNxK6~> zJ0C}2)CU+3lnsec}wcKIvG&g66-Uag(PdDC~|KFls6$`^6J z@?&S9GDe2d{5{7gt{BVZ;?=?ro!HE0aAQQEv4`tjq!0Th1P2l1jyZrJ@tU`q1D5*H z$j;3JXmGV1eky^33puUP=0MorrC=n6vwcjOHeW38^@eE_T;y(kJ)a3v6<_X$fw+YJHDFhHgo z)NwbC#1{6A_bMnEJImN6x}B9>P;cL$fW&Yv^OBNMY3)F_-eB9} z1a>uLUkPNQde-iUD?G6d`4Kh56Z&}ltcg(Q9T@?A0?~jtdH`%Q3V}GJBxL1(^Vy9| zG!yY8e2zJ4XAp681r^O<4APIy5-GN_?VJTB2g3EauTJD~;v&tcafu{{r9UmluhS6k zX-EGbln{Ssg=M1;$>V-}CG@c)5%dwezy0Gjf+|?%pjm0wCt`XfOX7EuK#`(@ z1n7nACAs$PUBq%(Q31)pHHOLu8zjq zg#z0PC9WShjBpCVJgwOly5Vv|sYzApc!xC~ z6K=6njWB`6U!JuP+FY3y0^Hably^ zh=MNZc=wB0iN^FbFV`tid~N}p^J@wb0yHXAXh~2n!N2x-gtzU zSrj{GP2zXom1@e@uV?B0xHL*$+qvm|35%xu);pL`Av7z|5dM@3yjbRsOO=2^`ukZ_V$6P+ zIR={PO(ws>Mbft*Z zLvv%Szry5?nEWx5uQK80Mzk1B1)#&;L}?0B2OpReJlzhd!~8vF+3zEs`}oU@}>bgLh)KA#O8u=a)%@l`(UeCJeSwK%kdnrTg1qBm!MM>HBmAt<*>_2{~bi0zn(XYF=`<2h=;+20{!j{ey-2CqRo}pyn9f=)<B8>8Yw+Yo&R;h5 Fe*wzLH!lDH literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/posixpath.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3dcb5252b1e4a885f417be61595b08b64ad4d8d GIT binary patch literal 10456 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 BWv~DM literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/re.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/re.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f96126dee7b72836844eb0ee24eabc7ae06e210 GIT binary patch literal 13857 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 GEc_QLcLL@B literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/reprlib.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/reprlib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ec50574974ff750a02d30af954274f9ec584621 GIT binary patch literal 5403 zcmbtYTXP&o74DwRA!bEz0Y%CfV?<09Aizpuv&Kw~w`Z-9MzeBH zuVam8DJYq;!vj@Zs^E!|ANfo3%9DNoFM8rTJ$sQ90ReVvPWSZn^mnd3H|OV@48MPv zSMUAtEMtGCm&wmW-yR6%cn;Uc8IbpA{pk3U$9gBgl)?@#{FiBOC z`7+*?OM$;cWt_*Eic~Vl0`x2Y<3z3dX|k25+#h8A)*x4Yo)mH3sjS-=Us*J(YRkAc zlzH+v4(WX#2VtuLubd=LlU|Hk<6*4AL}2v;v(xGHI1Rziz(WAglb;58&ib4Hc;=0G z$-%N&+**ly0~x7-^wq%MiZ)|E(p>xfVb&vN@ur3{^ZQAfK9161?DsL4294SBdr_Jm z+0?>bXK2&AAd2m>PuO$gIeX6g=45-tUvOdW8YK@6UAJ`I)OB0eEnRnX-PUzCVY?<~ zIGTBHb-F2?urb;6rrxwI);H*^FZiY-7hbS6_JZ$W)0dpHqV>X{Q6u9HR0Hi; zn%eKO(f~GmHLxlp5z@hWl^F?9xgyDXkraVhS$UlHD|0j6sT@dlm?|_jrWjQ%l2s^& zS(aoEtNCFb%W#6|-`Igz{tzwsa+LMfqiA_$&>L<+e);lkXh|e{>&wZSih7%v9QFnx zUQY7y>+%CM$C+4u9A}Sfk|qz9w|CU~AiLW6#xiY;md^H0<$f%q?d@2e!U?njFy7`K zw|J8qyk)d_acwF^tz4aJ=>XEquXjYP7PS9_?OEq|*{T_aTLUpn<1nn;FcgCxDqa|7 z(H1qe!tl{BO2==f!Z6CRL2Utf7zS=-=CP_=Xm6yHl(1bUUn6pk$ax|cKmtRO@=DUE zfXjB>L}#koUq!7ta{|LHbc~Pf7^hn;UjN&?c;~-3wtS`DkoJ{t5YY`aBa$|k6ZOkU z@tN5=*Q0Xsquv{M@?V0)44#L<>yR0;t|?4mp@c6I4oX{mUU;Gbuj9by%%Q~ z4pY0K7xEI{#go4eB6!Kdn!;0{ZV1>&2sS}2-C}F%XzB_J?Vhkf8@k>Uu(7~d-6yNr zw}}ua`)?6h0tx0SZ!3C|#*gDv*VJ%3jVqVhpyawKk}`t!qDdq@RXM1TrnFG@<)DZ& zdZSfD{Ad_g4eD2t3{5XHK!th-@Wc`tGly-p&}yRf1zMV9i3-C@=*&ss7!o?o z&>Pas9%&B!2*&AVAK^t|t6jdqNARbm3DutFuPYoC5N0 z#di`+VL}+?zXGW-8M!5FYm>``(v=Is7f6seg-}o; z+N@9*Xq0YgZ(8z$vax3hgF=CD_N=l2G`-Rl=B6QK>CjVJ=Lu`KG)u3v`sO)OdT&({ zLj}d){Uc^Zk|i1Hm`Gqg1TXj7BZMV{CdlXa#v^O(kd6jMWput$S#cU~q3&hz#~MdT zIL);9pm~jKrZ?EyzJ3cmT7?`|T-Jzbj~*r}meGSWo_X)toWi)`7tUf%|G=)yG|uWB zh}p`a*pUfI${93gGL%GplhUR=u>`u{CV ztC!an*gneN4fN*Z?inQC;*R0L8W*_7n$Uw5^LTOQgi}pTgw(*pqwSF(9^0dKv?O?8 zzH}fYQt_n&9vtv1U}*&d0DQMNyDz1Iik1&2>tf!{B8S1_x{E(_@ekigX z=jSD*j3&6bcfjvYSb6)iu+q@1kl=rEh?Dk=6Ri^j2>nPUr;J>|OUd&#yawN3q_uGG zx;BD?-$QF@l-k*E7@9$AwV2c1c^kdlgb^p>s#jgZyqsjnbcWL8#UXU{h?CK!{ctExAfp{S0r=tiFqG^=`qRVMh#X50 z{?h|KLc(@B+#ck4@*v#_^MO>cs82vK;Xi7Gr^SHveumLgzAb3)IA%=x|9`IMrcrMx zC=R_mEsPNaAb$)FYR)fz7S3^_fV-Zq84~~c3I*JWf8>R=tsNbA@;UyEZWpeO&r7wQ zjIB-Q0H4j;^z1%yHx7-5^g;JcIik=?35T|}zoIhM1B5>W14Et_6z<>)5Ey)6>bi9S zE}T5W$bQI1&Xb$UP`Cl?QVhpsWQE=DAeh()3V1^RuwfkT>rB5jN@veT*5j3pzHyFG zsCcw;hantbE<(s}b-$xSh>IYL+NdeKvf1Z4R5Zq+!gx9=?5BtqBl#Y~*k^3Oznmq;;p$G2S;^%ab2Gwr5IOK$A;#58)o2h*Mf)}OjQ&31Y zeq+221d*^nS{i)=2>wawY;yzo=LIA#3kZ@U>u_5M`Jv68u4K_VB_GSs#wEM5fUp(qP)GP@k{K%PW9bZSKKDkB?PFo{q0y!~82`S8{ zkkf4wL_lBr*#GbbIT z6tITmC?FVfM5(4B{|}h6)1EVk*D=rBu#gGE$jNNiaMf4N7&;fw z{Z4sw-Pu5{2k5M^(j96$0Xkc&Q@zTkp>tM?v)2}Lf07&fk@6ScesW!BipK$M%mA$# z-+R)Fx9R&!)d<608s)e$*B4_ta}D@ARQn$QmtVugPw?cFi7|W(Xq#==@)Yq`Z^J8e zwELfMj!#bVn;0CtQgfki>-vsPNky#%Iy+sV*Y6Yg0g)dPp+rUgl*nx&6zOG`$UP#& z%^{W0eux;;cU6k+`I{h~;mv!d*K86sJqLdmc}Fg^Q=PbkSvwv=0kZow*pA}R z2EWz@Wd6GKZhiB?#~!nC#yP;xF|V>Hi^7@d7ITO>%@@VnKjW#RzGc7}wz+o7m_W%^ z(9$0==%Wa}jX`i^DOH0~WHlJ1xzq`^8>)4QtVn-h(jO7@iSxXwKD6r0Ms cR)2cAPB#rLN6Tm;X~s7WqxnWV_ZklWCok)c`Tzg` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b30308cd02988f8e7534ee82334c0c4195d7e4d0 GIT binary patch literal 30598 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 ag@d#WakJsyDHQ4dgJ&l{Sh%O~@c##sX>~yW literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/site.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/site.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b92ec91c994d403659e76271088da14bce1a5904 GIT binary patch literal 21834 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/sre_compile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f02f4677054ca1b03c7561046ef6993defdbd585 GIT binary patch literal 15256 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≻p`kXp>*&zIZTq%!+nr4b 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 D36ywT literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/sre_parse.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0df769187763916601293a37e6df8b4e82d1b92c GIT binary patch literal 21410 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/struct.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/struct.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c03b37f4b531e8990d87f607ad0190185ea281e6 GIT binary patch literal 387 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 S+1XZi$M*T%Br~~K&HoRyN&Ue9 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/tempfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ed31544618ba67a4ce477b25796fd9dc4c0e4f5 GIT binary patch literal 22198 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 thw{g9hUX={vX9CnOXn< literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/token.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/token.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07c9237a2f30b665d6095886a6560583b203dbf8 GIT binary patch literal 3652 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 Smy(^yQ^{``=h6B~+WcRHi!*Tm literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/types.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b378adeabbfefb695ffba5278747f8a5c3ce307b GIT binary patch literal 9027 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/warnings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ff66c5c71c4e6369dd74cfa22b46c0d00e4319f GIT binary patch literal 13819 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 PE#rhXL50cOHk|(gxb!HO literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc b/backend/venv/venv/lib/python3.7/__pycache__/weakref.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eda0adb0c64baf2f21b283aafa0ec5476d85a469 GIT binary patch literal 19163 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 IVYH9_FDPrdZ2$lO literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/_bootlocale.py b/backend/venv/venv/lib/python3.7/_bootlocale.py new file mode 120000 index 0000000..8733e8b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/_bootlocale.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_bootlocale.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/_collections_abc.py b/backend/venv/venv/lib/python3.7/_collections_abc.py new file mode 120000 index 0000000..cb34966 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/_collections_abc.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_collections_abc.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/_dummy_thread.py b/backend/venv/venv/lib/python3.7/_dummy_thread.py new file mode 120000 index 0000000..63a26d6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/_dummy_thread.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_dummy_thread.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/_weakrefset.py b/backend/venv/venv/lib/python3.7/_weakrefset.py new file mode 120000 index 0000000..d4483c9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/_weakrefset.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_weakrefset.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/abc.py b/backend/venv/venv/lib/python3.7/abc.py new file mode 120000 index 0000000..20c9262 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/abc.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/base64.py b/backend/venv/venv/lib/python3.7/base64.py new file mode 120000 index 0000000..7e0108a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/base64.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/base64.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/bisect.py b/backend/venv/venv/lib/python3.7/bisect.py new file mode 120000 index 0000000..8aaf050 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/bisect.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/bisect.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/codecs.py b/backend/venv/venv/lib/python3.7/codecs.py new file mode 120000 index 0000000..5457039 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/codecs.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/codecs.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/collections b/backend/venv/venv/lib/python3.7/collections new file mode 120000 index 0000000..4d45338 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/collections @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/collections \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/config-3.7m-darwin b/backend/venv/venv/lib/python3.7/config-3.7m-darwin new file mode 120000 index 0000000..fc21375 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/config-3.7m-darwin @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/copy.py b/backend/venv/venv/lib/python3.7/copy.py new file mode 120000 index 0000000..e2ba31c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/copy.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/copy.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/copyreg.py b/backend/venv/venv/lib/python3.7/copyreg.py new file mode 120000 index 0000000..4472527 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/copyreg.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/copyreg.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/distutils/__init__.py b/backend/venv/venv/lib/python3.7/distutils/__init__.py new file mode 100644 index 0000000..b9b0f24 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/distutils/__init__.py @@ -0,0 +1,134 @@ +import os +import sys +import warnings + +# opcode is not a virtualenv module, so we can use it to find the stdlib +# Important! To work on pypy, this must be a module that resides in the +# lib-python/modified-x.y.z directory +import opcode + +dirname = os.path.dirname + +distutils_path = os.path.join(os.path.dirname(opcode.__file__), "distutils") +if os.path.normpath(distutils_path) == os.path.dirname(os.path.normpath(__file__)): + warnings.warn("The virtualenv distutils package at %s appears to be in the same location as the system distutils?") +else: + __path__.insert(0, distutils_path) # noqa: F821 + if sys.version_info < (3, 4): + import imp + + real_distutils = imp.load_module("_virtualenv_distutils", None, distutils_path, ("", "", imp.PKG_DIRECTORY)) + else: + import importlib.machinery + + distutils_path = os.path.join(distutils_path, "__init__.py") + loader = importlib.machinery.SourceFileLoader("_virtualenv_distutils", distutils_path) + if sys.version_info < (3, 5): + import types + + real_distutils = types.ModuleType(loader.name) + else: + import importlib.util + + spec = importlib.util.spec_from_loader(loader.name, loader) + real_distutils = importlib.util.module_from_spec(spec) + loader.exec_module(real_distutils) + + # Copy the relevant attributes + try: + __revision__ = real_distutils.__revision__ + except AttributeError: + pass + __version__ = real_distutils.__version__ + +from distutils import dist, sysconfig # isort:skip + +try: + basestring +except NameError: + basestring = str + +# patch build_ext (distutils doesn't know how to get the libs directory +# path on windows - it hardcodes the paths around the patched sys.prefix) + +if sys.platform == "win32": + from distutils.command.build_ext import build_ext as old_build_ext + + class build_ext(old_build_ext): + def finalize_options(self): + if self.library_dirs is None: + self.library_dirs = [] + elif isinstance(self.library_dirs, basestring): + self.library_dirs = self.library_dirs.split(os.pathsep) + + self.library_dirs.insert(0, os.path.join(sys.real_prefix, "Libs")) + old_build_ext.finalize_options(self) + + from distutils.command import build_ext as build_ext_module + + build_ext_module.build_ext = build_ext + +# distutils.dist patches: + +old_find_config_files = dist.Distribution.find_config_files + + +def find_config_files(self): + found = old_find_config_files(self) + if os.name == "posix": + user_filename = ".pydistutils.cfg" + else: + user_filename = "pydistutils.cfg" + user_filename = os.path.join(sys.prefix, user_filename) + if os.path.isfile(user_filename): + for item in list(found): + if item.endswith("pydistutils.cfg"): + found.remove(item) + found.append(user_filename) + return found + + +dist.Distribution.find_config_files = find_config_files + +# distutils.sysconfig patches: + +old_get_python_inc = sysconfig.get_python_inc + + +def sysconfig_get_python_inc(plat_specific=0, prefix=None): + if prefix is None: + prefix = sys.real_prefix + return old_get_python_inc(plat_specific, prefix) + + +sysconfig_get_python_inc.__doc__ = old_get_python_inc.__doc__ +sysconfig.get_python_inc = sysconfig_get_python_inc + +old_get_python_lib = sysconfig.get_python_lib + + +def sysconfig_get_python_lib(plat_specific=0, standard_lib=0, prefix=None): + if standard_lib and prefix is None: + prefix = sys.real_prefix + return old_get_python_lib(plat_specific, standard_lib, prefix) + + +sysconfig_get_python_lib.__doc__ = old_get_python_lib.__doc__ +sysconfig.get_python_lib = sysconfig_get_python_lib + +old_get_config_vars = sysconfig.get_config_vars + + +def sysconfig_get_config_vars(*args): + real_vars = old_get_config_vars(*args) + if sys.platform == "win32": + lib_dir = os.path.join(sys.real_prefix, "libs") + if isinstance(real_vars, dict) and "LIBDIR" not in real_vars: + real_vars["LIBDIR"] = lib_dir # asked for all + elif isinstance(real_vars, list) and "LIBDIR" in args: + real_vars = real_vars + [lib_dir] # asked for list + return real_vars + + +sysconfig_get_config_vars.__doc__ = old_get_config_vars.__doc__ +sysconfig.get_config_vars = sysconfig_get_config_vars diff --git a/backend/venv/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/distutils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8abd8f5aa6eaa639f3a771d32ed77f9af86a3731 GIT binary patch literal 3201 zcma)8+j85+8O8!22vQV9N!G#2iFKtkj2zOnQ=i9e9jBg5UA1GoO|vs82E;BUKqSB{ zAX(DTSMqhIk3h}zrZatlK1MJ1wm0=FW58v|P{Cw5I^RIB@ z+to$O`VVd1JU$k`!kag3%MzAgeTz?K#+ljM+%~hr9cd+QQsO0=$DSEW(n-o^OxR~O z_YI{Y{WCV@kz7TBf5!H0)tC0TDx5RMtn}YVq%J=H%t%(s)Ib$R1xc_I%j;uaREkYjSP8E?1Mw zXACwr4Rr%HmXr6!?-O0FLhl2!|4@EFQgU_tkz6ESkE?PqY4YaRR=Vn1@+bS%zcF=_ zS@iqHO6@;e;9ucaV71c!>0py@4z~Cf^nCd-v!JyBt)CgK;Y3S*!atsBvZN)d`!+28 z6Z&)gPY2ulDzhG2q9*2FSz=yZJ$3lD;e7^P8`0X9?O->gT6%DcYit*3ojpP^d^8l~h3a*2Dliw0+Vo5B6dt2TD_cpkOZ9(eb_yCc{$tF```>Sjk*M4T4~McmI%y3hAy^DtJ$LD-k+VROc54#Q|a z+?CC+Xl~`ra5$8q%9};j?8;`GHVf$G;XpR~Sris=mNr9hiFlkBa`4vBFI)C&2gkm4 zG4Pe(?P0;}Fm0X81wov~MG&-y$1PhKjS@6kwsuKQS712G(q6o)OE2Q|#`PA{mF_{@ z7lAw~B8bi&^unYoE@2@p>I8HFsvL1~go8-9ih3$yQx%%ac)!4#{|Up$O3+68zFOMF zIuvl!_{FHXaLd?JHvNGZz^LN}NF-ajn04!^$7 zI)8-KyaN~Z!m#rwiw*`dE%MG&nIrwtUMGH5pf2E55M@GkkeJD~)5R=P(K$pFO$K~h zXLwxfW$BIft||r+cKf2&J1tlHL6D;Qf-=v_W&mZc$3S5%N9Vm$7DQ?`X5|N9>e6vc6q^>5QClg}_ri9It)zs5P+e%Usprwst8D z3O9zOmS|WeqBpG!FV0C+yM5{{ADPQv#Hb`s$w77~wMPw~3N*?Zsg-)!K`QwC0m{Ri zLAJFUqth=0S1HDXx5_-*Weudcjy1jN6L2C*1wAxV^PBKfQI62PXvBJ9 zC6okv1j?z6P_dnsV?Ihzo9iVC#jY%ZNzDOGB4Ee-upbsdK9o`1izC&9nBU8gf_gV$7Ogxk~2{fT>~pZpi0N&$!Xz-&m6 zXuQ^CIAPk4I*-7Lnk@);eb&)|0d7CV*G?du43Q-5f{aLeXWd=+CdBi$hm- z07ny92bZSmfXLsQ1)?2gg8_P~J-bs3eS4iXS1~9?18@3I-2CJ58&}md_w&(hezu>!` OQ}uv!_S@N?^Vts{zghkO literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/distutils/distutils.cfg b/backend/venv/venv/lib/python3.7/distutils/distutils.cfg new file mode 100644 index 0000000..1af230e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/distutils/distutils.cfg @@ -0,0 +1,6 @@ +# This is a config file local to this virtualenv installation +# You may include options that will be used by all distutils commands, +# and by easy_install. For instance: +# +# [easy_install] +# find_links = http://mylocalsite diff --git a/backend/venv/venv/lib/python3.7/encodings b/backend/venv/venv/lib/python3.7/encodings new file mode 120000 index 0000000..8ab7b15 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/encodings @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/encodings \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/enum.py b/backend/venv/venv/lib/python3.7/enum.py new file mode 120000 index 0000000..ec26698 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/enum.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/enum.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/fnmatch.py b/backend/venv/venv/lib/python3.7/fnmatch.py new file mode 120000 index 0000000..7d0781e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/fnmatch.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/fnmatch.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/functools.py b/backend/venv/venv/lib/python3.7/functools.py new file mode 120000 index 0000000..2b4de2e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/functools.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/functools.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/genericpath.py b/backend/venv/venv/lib/python3.7/genericpath.py new file mode 120000 index 0000000..2ac8a86 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/genericpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/genericpath.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/hashlib.py b/backend/venv/venv/lib/python3.7/hashlib.py new file mode 120000 index 0000000..0cec56f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/hashlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hashlib.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/heapq.py b/backend/venv/venv/lib/python3.7/heapq.py new file mode 120000 index 0000000..667ad79 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/heapq.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/heapq.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/hmac.py b/backend/venv/venv/lib/python3.7/hmac.py new file mode 120000 index 0000000..1f49c56 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/hmac.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/hmac.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/imp.py b/backend/venv/venv/lib/python3.7/imp.py new file mode 120000 index 0000000..b468739 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/imp.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/imp.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/importlib b/backend/venv/venv/lib/python3.7/importlib new file mode 120000 index 0000000..0c6a88f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/importlib @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/io.py b/backend/venv/venv/lib/python3.7/io.py new file mode 120000 index 0000000..43f630b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/io.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/io.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/keyword.py b/backend/venv/venv/lib/python3.7/keyword.py new file mode 120000 index 0000000..5adf06b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/keyword.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/keyword.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/lib-dynload b/backend/venv/venv/lib/python3.7/lib-dynload new file mode 120000 index 0000000..2f180d9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/lib-dynload @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/linecache.py b/backend/venv/venv/lib/python3.7/linecache.py new file mode 120000 index 0000000..538b638 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/linecache.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/linecache.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/locale.py b/backend/venv/venv/lib/python3.7/locale.py new file mode 120000 index 0000000..2fed2c1 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/locale.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/locale.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/no-global-site-packages.txt b/backend/venv/venv/lib/python3.7/no-global-site-packages.txt new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/ntpath.py b/backend/venv/venv/lib/python3.7/ntpath.py new file mode 120000 index 0000000..4e91922 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/ntpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ntpath.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/operator.py b/backend/venv/venv/lib/python3.7/operator.py new file mode 120000 index 0000000..bd7fe66 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/operator.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/operator.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/orig-prefix.txt b/backend/venv/venv/lib/python3.7/orig-prefix.txt new file mode 100644 index 0000000..84e29de --- /dev/null +++ b/backend/venv/venv/lib/python3.7/orig-prefix.txt @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7 \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/os.py b/backend/venv/venv/lib/python3.7/os.py new file mode 120000 index 0000000..f6a3ca4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/os.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/posixpath.py b/backend/venv/venv/lib/python3.7/posixpath.py new file mode 120000 index 0000000..58c6b83 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/posixpath.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/posixpath.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/random.py b/backend/venv/venv/lib/python3.7/random.py new file mode 120000 index 0000000..c21ab76 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/random.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/random.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/re.py b/backend/venv/venv/lib/python3.7/re.py new file mode 120000 index 0000000..7d2707d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/re.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/re.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/readline.so b/backend/venv/venv/lib/python3.7/readline.so new file mode 120000 index 0000000..726f8d1 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/readline.so @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/readline.cpython-37m-darwin.so \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/reprlib.py b/backend/venv/venv/lib/python3.7/reprlib.py new file mode 120000 index 0000000..f98535a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/reprlib.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/reprlib.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/rlcompleter.py b/backend/venv/venv/lib/python3.7/rlcompleter.py new file mode 120000 index 0000000..c4edf48 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/rlcompleter.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/rlcompleter.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/shutil.py b/backend/venv/venv/lib/python3.7/shutil.py new file mode 120000 index 0000000..11c4205 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/shutil.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/shutil.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddffeb8c6fbe95df25ed37f56fc777b502912c19 GIT binary patch literal 333 zcmYk0&q~BF5XO_XY7zGZ6tsBjVH^J~?!qD>c<|yuJr!h#P3pELX-L}Y?!k*s<2(2y zy?XK$Jelf>elXw6!0`L#Y%o|yPH%Mc_SyCKe)*N>hErE|*BL`8;+WwF&ulY~`NETa z>SM(H7laWDu2HlmEGio_FC?R;&^H O1iNtCe-L;f-oRhF+F*+S literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/easy_install.py b/backend/venv/venv/lib/python3.7/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/INSTALLER b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..737fec5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2019 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/METADATA b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/METADATA new file mode 100644 index 0000000..d7aa9a4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/METADATA @@ -0,0 +1,75 @@ +Metadata-Version: 2.1 +Name: pip +Version: 19.1.1 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: pypa-dev@groups.google.com +License: MIT +Keywords: distutils easy_install egg setuptools wheel virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + +pip - The Python Package Installer +================================== + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + +Please take a look at our documentation for how to install and use pip: + +* `Installation`_ +* `Usage`_ +* `Release notes`_ + +If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: + +* `Issue tracking`_ +* `Discourse channel`_ +* `User IRC`_ + +If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms: + +* `GitHub page`_ +* `Dev mailing list`_ +* `Dev IRC`_ + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _package installer: https://packaging.python.org/en/latest/current/ +.. _Python Package Index: https://pypi.org +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Usage: https://pip.pypa.io/en/stable/ +.. _Release notes: https://pip.pypa.io/en/stable/news.html +.. _GitHub page: https://github.com/pypa/pip +.. _Issue tracking: https://github.com/pypa/pip/issues +.. _Discourse channel: https://discuss.python.org/c/packaging +.. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev +.. _User IRC: https://webchat.freenode.net/?channels=%23pypa +.. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/RECORD b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/RECORD new file mode 100644 index 0000000..e354379 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/RECORD @@ -0,0 +1,618 @@ +../../../bin/pip,sha256=DdhA_IU8I-hu-cNNTg2ublZwWnZxKgsmQZSGX8HCCUM,286 +../../../bin/pip3,sha256=DdhA_IU8I-hu-cNNTg2ublZwWnZxKgsmQZSGX8HCCUM,286 +../../../bin/pip3.7,sha256=DdhA_IU8I-hu-cNNTg2ublZwWnZxKgsmQZSGX8HCCUM,286 +pip-19.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip-19.1.1.dist-info/LICENSE.txt,sha256=W6Ifuwlk-TatfRU2LR7W1JMcyMj5_y1NkRkOEJvnRDE,1090 +pip-19.1.1.dist-info/METADATA,sha256=bLFqR8At4rsCvM1hJTM98bOrT26dNZLeTLo_0PYIZCs,2892 +pip-19.1.1.dist-info/RECORD,, +pip-19.1.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +pip-19.1.1.dist-info/entry_points.txt,sha256=S_zfxY25QtQDVY1BiLAmOKSkkI5llzCKPLiYOSEupsY,98 +pip-19.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/__init__.py,sha256=A9ZYTNji94NmcmoIbn-XLsEni4ac8BoiAt7guiAW27g,23 +pip/__main__.py,sha256=L3IHqBeasELUHvwy5CT_izVEMhM12tve289qut49DvU,623 +pip/__pycache__/__init__.cpython-37.pyc,, +pip/__pycache__/__main__.cpython-37.pyc,, +pip/_internal/__init__.py,sha256=Di4rpoQhA2Kx0Dm0THczf61CDOXcPokR2FIpyKkRm1Y,2870 +pip/_internal/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/__pycache__/build_env.cpython-37.pyc,, +pip/_internal/__pycache__/cache.cpython-37.pyc,, +pip/_internal/__pycache__/configuration.cpython-37.pyc,, +pip/_internal/__pycache__/download.cpython-37.pyc,, +pip/_internal/__pycache__/exceptions.cpython-37.pyc,, +pip/_internal/__pycache__/index.cpython-37.pyc,, +pip/_internal/__pycache__/locations.cpython-37.pyc,, +pip/_internal/__pycache__/pep425tags.cpython-37.pyc,, +pip/_internal/__pycache__/pyproject.cpython-37.pyc,, +pip/_internal/__pycache__/resolve.cpython-37.pyc,, +pip/_internal/__pycache__/wheel.cpython-37.pyc,, +pip/_internal/build_env.py,sha256=ZUpR-00pxQc-Mw750jyBVA-oWb4WHtpK63pfiTHd8qU,7392 +pip/_internal/cache.py,sha256=PQesJm1JrjgAya3VyV6qkbnfACG23c1wQ7PaSw_0F-Y,7656 +pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 +pip/_internal/cli/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc,, +pip/_internal/cli/__pycache__/base_command.cpython-37.pyc,, +pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc,, +pip/_internal/cli/__pycache__/main_parser.cpython-37.pyc,, +pip/_internal/cli/__pycache__/parser.cpython-37.pyc,, +pip/_internal/cli/__pycache__/status_codes.cpython-37.pyc,, +pip/_internal/cli/autocompletion.py,sha256=ptvsMdGjq42pzoY4skABVF43u2xAtLJlXAulPi-A10Y,6083 +pip/_internal/cli/base_command.py,sha256=2SbVZ2o3KmVdeJlK4l1lP6y_ZMFZ8VkDp9ns1ByZ-xM,12629 +pip/_internal/cli/cmdoptions.py,sha256=IA1XAgTJ1oWXp1oF3CkE8mpUx8vqIysyd7hlEZk7wWE,23813 +pip/_internal/cli/main_parser.py,sha256=YH_w_hApq2pyS_G5tZlbIe7g_HUIcKE820jhnv0piVA,3002 +pip/_internal/cli/parser.py,sha256=VZKUKJPbU6I2cHPLDOikin-aCx7OvLcZ3fzYp3xytd8,9378 +pip/_internal/cli/status_codes.py,sha256=F6uDG6Gj7RNKQJUDnd87QKqI16Us-t-B0wPF_4QMpWc,156 +pip/_internal/commands/__init__.py,sha256=7fscm9bUGJInZwWY7VjH2pPC7HUWQWyjYMEIB33L9CY,2223 +pip/_internal/commands/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/commands/__pycache__/check.cpython-37.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-37.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-37.pyc,, +pip/_internal/commands/__pycache__/download.cpython-37.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-37.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-37.pyc,, +pip/_internal/commands/__pycache__/help.cpython-37.pyc,, +pip/_internal/commands/__pycache__/install.cpython-37.pyc,, +pip/_internal/commands/__pycache__/list.cpython-37.pyc,, +pip/_internal/commands/__pycache__/search.cpython-37.pyc,, +pip/_internal/commands/__pycache__/show.cpython-37.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-37.pyc,, +pip/_internal/commands/check.py,sha256=liigNVif0iz2mBfhvsajrLZT5zM5KIvgmKvhAW91EzA,1430 +pip/_internal/commands/completion.py,sha256=hqvCvoxsIHjysiD7olHKTqK2lzE1_lS6LWn69kN5qyI,2929 +pip/_internal/commands/configuration.py,sha256=Il76e-ERfEHtW2GbV1aTR6o-xurh-LVv2NCea7erP4s,8020 +pip/_internal/commands/download.py,sha256=XPe3Kuj9iZfXwOiJq70mYVYNZD5lJCLnGT_C61cOsKw,6623 +pip/_internal/commands/freeze.py,sha256=VvS3G0wrm_9BH3B7Ex5msLL_1UQTtCq5G8dDI63Iemo,3259 +pip/_internal/commands/hash.py,sha256=K1JycsD-rpjqrRcL_ijacY9UKmI82pQcLYq4kCM4Pv0,1681 +pip/_internal/commands/help.py,sha256=MwBhPJpW1Dt3GfJV3V8V6kgAy_pXT0jGrZJB1wCTW-E,1090 +pip/_internal/commands/install.py,sha256=vSb8TfUHwz3HJ5cA-JnPP3X84ONQ0wkCztw0pHFbmsc,22841 +pip/_internal/commands/list.py,sha256=EtKEUotPbLCzzcWrZqEiEXi4ic00dgUOKUeNU0y7Pfg,10166 +pip/_internal/commands/search.py,sha256=sLZ9icKMEEGekHvzRRZMiTd1zCFIZeDptyyU1mQCYzk,4728 +pip/_internal/commands/show.py,sha256=bE-ucu8fAjTTENpRRKhwD3QSWR8Rss7YgKAbMJoxock,6273 +pip/_internal/commands/uninstall.py,sha256=h0gfPF5jylDESx_IHgF6bZME7QAEOHzQHdn65GP-jrE,2963 +pip/_internal/commands/wheel.py,sha256=7MNPZqK9WWxZC3TgzvMBH-RPRlOFLpwq927lkzUiUjI,7167 +pip/_internal/configuration.py,sha256=xit1f8ZdnHz-AHzWAKTUa_gZzlIIM-5AgK30glB71ik,13115 +pip/_internal/download.py,sha256=0_8jUtL4SLZe4qo8Fe66qkbO69gUG-IPbp932WOHyFs,35147 +pip/_internal/exceptions.py,sha256=ryXWmEJpSHr3yXXk1efWHSzQwAjBdBJiKR5kCQvjgPA,9117 +pip/_internal/index.py,sha256=BO6jpJRvb_6HaS4meE8Lj_lyAX7IRP6pRof-zG-_hYw,42268 +pip/_internal/locations.py,sha256=-N3f1I24gcPTdW52onPnySDoQUIn_TtPYV99WwsjxRE,6932 +pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 +pip/_internal/models/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/models/__pycache__/candidate.cpython-37.pyc,, +pip/_internal/models/__pycache__/format_control.cpython-37.pyc,, +pip/_internal/models/__pycache__/index.cpython-37.pyc,, +pip/_internal/models/__pycache__/link.cpython-37.pyc,, +pip/_internal/models/candidate.py,sha256=_IzS-yw0h2UHfZALsZ2mxkeGNSNuNGspjSn2JfZ-ZHM,1045 +pip/_internal/models/format_control.py,sha256=ap8Swa26ocSXBxIuCvaDBRZjxdKUFuwC-bfqXQHWtKw,2250 +pip/_internal/models/index.py,sha256=K59A8-hVhBM20Xkahr4dTwP7OjkJyEqXH11UwHFVgqM,1060 +pip/_internal/models/link.py,sha256=Hqu72UgH266njr2z2kTnIG-sQiPtjENDbPqXFzT-84s,4783 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/operations/__pycache__/check.cpython-37.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-37.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-37.pyc,, +pip/_internal/operations/check.py,sha256=CZHaksHKUMo58wGHGhhKlPrpcRMHObouzzyd9pMRFt8,5109 +pip/_internal/operations/freeze.py,sha256=_Ffl2HpoWLLHaiB1XyTjKIA3QWC8H-E1ib6xJgX_mRE,9279 +pip/_internal/operations/prepare.py,sha256=jQ6FaxA2u_MYnDQxcu6YCfmJ9sfhqrKN9vdd4-5N6lU,16931 +pip/_internal/pep425tags.py,sha256=jyBorYxepVJeHNo69TE-3UxJXsGO2XvGxveSWQDi_Wo,13128 +pip/_internal/pyproject.py,sha256=OlCw7pSqST68hUF_eV-YVaqJ4I7z_ROJwvgra-2C_5I,6464 +pip/_internal/req/__init__.py,sha256=Y2SjAuMFsSt3dkiK8kkiQAfv8sHrjl0PAT63FKFT0tM,2364 +pip/_internal/req/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/req/__pycache__/constructors.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_tracker.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc,, +pip/_internal/req/constructors.py,sha256=4KlO_-G89XYZW1VnzHwV34oCvR6ilmxFqSSGLgv4PEw,11399 +pip/_internal/req/req_file.py,sha256=mZoQvhHZJwgljrXDH8CLXaNoUK4sM8_bRfK9Po2fM80,13714 +pip/_internal/req/req_install.py,sha256=SGJLNpyZwzOL_EqfviIvAoZgxAoivxmFBN1cOU7DX9s,40061 +pip/_internal/req/req_set.py,sha256=PaDc5EswLQhxBMFbuKbJ0frZbMNKocmA8OGqIWT-9EY,7860 +pip/_internal/req/req_tracker.py,sha256=wBpDzSDSYwpUfW4K43NrEOCCp1r6stuubfLc65Y95EM,3129 +pip/_internal/req/req_uninstall.py,sha256=rVOk8BRM_L9rsUUr9lmkV6Lm9N1Os7TEIDir6tT1Q7U,23105 +pip/_internal/resolve.py,sha256=rZDMkyhUIbaytY9KsYQVez8nl21xLXgaDt8xuHvyGMI,15128 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc,, +pip/_internal/utils/__pycache__/compat.cpython-37.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-37.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-37.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-37.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-37.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-37.pyc,, +pip/_internal/utils/__pycache__/models.cpython-37.pyc,, +pip/_internal/utils/__pycache__/outdated.cpython-37.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-37.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc,, +pip/_internal/utils/__pycache__/typing.cpython-37.pyc,, +pip/_internal/utils/__pycache__/ui.cpython-37.pyc,, +pip/_internal/utils/appdirs.py,sha256=r9i0BZLK9KcvrzI5tqlw8ehRTtSehWGERFLy7YppG3g,9398 +pip/_internal/utils/compat.py,sha256=Q0cmYGBaKB4tV5E0CG11339YLxuCaqdUCSJd9vinMc8,8551 +pip/_internal/utils/deprecation.py,sha256=HYUvfCZUxwLIFlYHeZM3VmuFhXTdlw0rk4-cC14bKw4,3080 +pip/_internal/utils/encoding.py,sha256=tudXCoAPe9fZvNK4cmWQs2frREZ-QuGCwF_SlTyz6cI,1218 +pip/_internal/utils/filesystem.py,sha256=ojaIDvOFOtkpKme5se6X2N8ARmQxu8cxvaaI-NFqVtk,990 +pip/_internal/utils/glibc.py,sha256=9_1wY9Lmca4xzOQDF1A6ITW_N80j_BXwN7Sx7vBqP4k,3282 +pip/_internal/utils/hashes.py,sha256=_6l8M_nqmLZjs-o2lP2rB7ZleAT05WOuqgwBa8uFYR8,3527 +pip/_internal/utils/logging.py,sha256=qSYK7Wf_oiCr1VR4qvAq_TtpY3SIKSlVDgnAeQqSjHc,11671 +pip/_internal/utils/misc.py,sha256=QsYl2j5rU5Mh_CEsSf1W8GB6HvPOfioj30Emqz7mg7s,32434 +pip/_internal/utils/models.py,sha256=DQYZSRhjvSdDTAaJLLCpDtxAn1S_-v_8nlNjv4T2jwY,1042 +pip/_internal/utils/outdated.py,sha256=sEe1l902jiOl3tArf6omqVd44s4BT9DOk3a3CXtJNNI,5868 +pip/_internal/utils/packaging.py,sha256=frr5M-ORe30rRKbH6pwqp_jkX1T8rx-UGDlj8vG5HII,2743 +pip/_internal/utils/setuptools_build.py,sha256=0blfscmNJW_iZ5DcswJeDB_PbtTEjfK9RL1R1WEDW2E,278 +pip/_internal/utils/temp_dir.py,sha256=0Xq5ZlOd2OOeHwKM6hGy66gnMGAbyhio7DtjLHd7DFg,5339 +pip/_internal/utils/typing.py,sha256=bF73ImJzIaxLLEVwfEaSJzFGqV9LaxkQBvDULIyr1jI,1125 +pip/_internal/utils/ui.py,sha256=yRqmi2V4OeTYP9SnXhuXKlyRx8xJ79AjLRgvLCZ4E1E,13812 +pip/_internal/vcs/__init__.py,sha256=kgwOhkt6ddbKosZytktLydMUb_e-JpXMstJF9YpSOwM,19205 +pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc,, +pip/_internal/vcs/bazaar.py,sha256=3lA6CKyrYpoJuxjTa8oTozszNcqdYILqEhKLJ41RMug,3231 +pip/_internal/vcs/git.py,sha256=x0PQDgzWho544gfqtE9CXoUkN34zE4YkpgrbTcWEte4,12960 +pip/_internal/vcs/mercurial.py,sha256=AbH4IWdLCsjUxFnIHRvijV-7SNhfjDZJJFzQ1e_b48Q,3355 +pip/_internal/vcs/subversion.py,sha256=cMH4MEobSj68gaSiBD53KXVJnEbhtuUJjL8U1Kk_v70,8167 +pip/_internal/wheel.py,sha256=-MijhN1BIuaQkb3909smA63wkbvdRrdtr1CUDxnQTqA,41189 +pip/_vendor/__init__.py,sha256=iip2nWwH_riYqnDnM0q4BJFrWE-XWjYfxCejJKct0WM,4654 +pip/_vendor/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-37.pyc,, +pip/_vendor/__pycache__/distro.cpython-37.pyc,, +pip/_vendor/__pycache__/ipaddress.cpython-37.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +pip/_vendor/__pycache__/retrying.cpython-37.pyc,, +pip/_vendor/__pycache__/six.cpython-37.pyc,, +pip/_vendor/appdirs.py,sha256=BENKsvcA08IpccD9345-rMrg3aXWFA1q6BFEglnHg6I,24547 +pip/_vendor/cachecontrol/__init__.py,sha256=6cRPchVqkAkeUtYTSW8qCetjSqJo-GxP-n4VMVDbvmc,302 +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc,, +pip/_vendor/cachecontrol/_cmd.py,sha256=URGE0KrA87QekCG3SGPatlSPT571dZTDjNa-ZXX3pDc,1295 +pip/_vendor/cachecontrol/adapter.py,sha256=eBGAtVNRZgtl_Kj5JV54miqL9YND-D0JZPahwY8kFtY,4863 +pip/_vendor/cachecontrol/cache.py,sha256=1fc4wJP8HYt1ycnJXeEw5pCpeBL2Cqxx6g9Fb0AYDWQ,805 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=-gHNKYvaeD0kOk5M74eOrsSgIKUtC6i6GfbmugGweEo,86 +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=8vrSzzGcdfEfICago1uSFbkumNJMGLbCdEkXsmUIExw,4177 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=HxelMpNCo-dYr2fiJDwM3hhhRmxUYtB5tXm1GpAAT4Y,856 +pip/_vendor/cachecontrol/compat.py,sha256=kHNvMRdt6s_Xwqq_9qJmr9ou3wYMOMUMxPPcwNxT8Mc,695 +pip/_vendor/cachecontrol/controller.py,sha256=U7g-YwizQ2O5NRgK_MZreF1ntM4E49C3PuF3od-Vwz4,13698 +pip/_vendor/cachecontrol/filewrapper.py,sha256=vACKO8Llzu_ZWyjV1Fxn1MA4TGU60N5N3GSrAFdAY2Q,2533 +pip/_vendor/cachecontrol/heuristics.py,sha256=BFGHJ3yQcxvZizfo90LLZ04T_Z5XSCXvFotrp7Us0sc,4070 +pip/_vendor/cachecontrol/serialize.py,sha256=GebE34fgToyWwAsRPguh8hEPN6CqoG-5hRMXRsjVABQ,6954 +pip/_vendor/cachecontrol/wrapper.py,sha256=sfr9YHWx-5TwNz1H5rT6QOo8ggII6v3vbEDjQFwR6wc,671 +pip/_vendor/certifi/__init__.py,sha256=-M1moep9D6jZnOAT0qnM1dpoEHMPage7Osv5xLRLyFg,52 +pip/_vendor/certifi/__main__.py,sha256=NaCn6WtWME-zzVWQ2j4zFyl8cY4knDa9CwtHNIeFPhM,53 +pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-37.pyc,, +pip/_vendor/certifi/cacert.pem,sha256=OXuDPlrPiaJwm5ZEAamspo0ktiNJtyu-OGhOWGqgeic,284518 +pip/_vendor/certifi/core.py,sha256=EuFc2BsToG5O1-qsx4BSjQ1r1-7WRtH87b1WflZOWhI,218 +pip/_vendor/chardet/__init__.py,sha256=YsP5wQlsHJ2auF1RZJfypiSrCA7_bQiRm3ES_NI76-Y,1559 +pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-37.pyc,, +pip/_vendor/chardet/big5freq.py,sha256=D_zK5GyzoVsRes0HkLJziltFQX0bKCLOrFe9_xDvO_8,31254 +pip/_vendor/chardet/big5prober.py,sha256=kBxHbdetBpPe7xrlb-e990iot64g_eGSLd32lB7_h3M,1757 +pip/_vendor/chardet/chardistribution.py,sha256=3woWS62KrGooKyqz4zQSnjFbJpa6V7g02daAibTwcl8,9411 +pip/_vendor/chardet/charsetgroupprober.py,sha256=6bDu8YIiRuScX4ca9Igb0U69TA2PGXXDej6Cc4_9kO4,3787 +pip/_vendor/chardet/charsetprober.py,sha256=KSmwJErjypyj0bRZmC5F5eM7c8YQgLYIjZXintZNstg,5110 +pip/_vendor/chardet/cli/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc,, +pip/_vendor/chardet/cli/chardetect.py,sha256=DI8dlV3FBD0c0XA_y3sQ78z754DUv1J8n34RtDjOXNw,2774 +pip/_vendor/chardet/codingstatemachine.py,sha256=VYp_6cyyki5sHgXDSZnXW4q1oelHc3cu9AyQTX7uug8,3590 +pip/_vendor/chardet/compat.py,sha256=PKTzHkSbtbHDqS9PyujMbX74q1a8mMpeQTDVsQhZMRw,1134 +pip/_vendor/chardet/cp949prober.py,sha256=TZ434QX8zzBsnUvL_8wm4AQVTZ2ZkqEEQL_lNw9f9ow,1855 +pip/_vendor/chardet/enums.py,sha256=Aimwdb9as1dJKZaFNUH2OhWIVBVd6ZkJJ_WK5sNY8cU,1661 +pip/_vendor/chardet/escprober.py,sha256=kkyqVg1Yw3DIOAMJ2bdlyQgUFQhuHAW8dUGskToNWSc,3950 +pip/_vendor/chardet/escsm.py,sha256=RuXlgNvTIDarndvllNCk5WZBIpdCxQ0kcd9EAuxUh84,10510 +pip/_vendor/chardet/eucjpprober.py,sha256=iD8Jdp0ISRjgjiVN7f0e8xGeQJ5GM2oeZ1dA8nbSeUw,3749 +pip/_vendor/chardet/euckrfreq.py,sha256=-7GdmvgWez4-eO4SuXpa7tBiDi5vRXQ8WvdFAzVaSfo,13546 +pip/_vendor/chardet/euckrprober.py,sha256=MqFMTQXxW4HbzIpZ9lKDHB3GN8SP4yiHenTmf8g_PxY,1748 +pip/_vendor/chardet/euctwfreq.py,sha256=No1WyduFOgB5VITUA7PLyC5oJRNzRyMbBxaKI1l16MA,31621 +pip/_vendor/chardet/euctwprober.py,sha256=13p6EP4yRaxqnP4iHtxHOJ6R2zxHq1_m8hTRjzVZ95c,1747 +pip/_vendor/chardet/gb2312freq.py,sha256=JX8lsweKLmnCwmk8UHEQsLgkr_rP_kEbvivC4qPOrlc,20715 +pip/_vendor/chardet/gb2312prober.py,sha256=gGvIWi9WhDjE-xQXHvNIyrnLvEbMAYgyUSZ65HUfylw,1754 +pip/_vendor/chardet/hebrewprober.py,sha256=c3SZ-K7hvyzGY6JRAZxJgwJ_sUS9k0WYkvMY00YBYFo,13838 +pip/_vendor/chardet/jisfreq.py,sha256=vpmJv2Bu0J8gnMVRPHMFefTRvo_ha1mryLig8CBwgOg,25777 +pip/_vendor/chardet/jpcntx.py,sha256=PYlNqRUQT8LM3cT5FmHGP0iiscFlTWED92MALvBungo,19643 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=1HqQS9Pbtnj1xQgxitJMvw8X6kKr5OockNCZWfEQrPE,12839 +pip/_vendor/chardet/langcyrillicmodel.py,sha256=LODajvsetH87yYDDQKA2CULXUH87tI223dhfjh9Zx9c,17948 +pip/_vendor/chardet/langgreekmodel.py,sha256=8YAW7bU8YwSJap0kIJSbPMw1BEqzGjWzqcqf0WgUKAA,12688 +pip/_vendor/chardet/langhebrewmodel.py,sha256=JSnqmE5E62tDLTPTvLpQsg5gOMO4PbdWRvV7Avkc0HA,11345 +pip/_vendor/chardet/langhungarianmodel.py,sha256=RhapYSG5l0ZaO-VV4Fan5sW0WRGQqhwBM61yx3yxyOA,12592 +pip/_vendor/chardet/langthaimodel.py,sha256=8l0173Gu_W6G8mxmQOTEF4ls2YdE7FxWf3QkSxEGXJQ,11290 +pip/_vendor/chardet/langturkishmodel.py,sha256=W22eRNJsqI6uWAfwXSKVWWnCerYqrI8dZQTm_M0lRFk,11102 +pip/_vendor/chardet/latin1prober.py,sha256=S2IoORhFk39FEFOlSFWtgVybRiP6h7BlLldHVclNkU8,5370 +pip/_vendor/chardet/mbcharsetprober.py,sha256=AR95eFH9vuqSfvLQZN-L5ijea25NOBCoXqw8s5O9xLQ,3413 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=h6TRnnYq2OxG1WdD5JOyxcdVpn7dG0q-vB8nWr5mbh4,2012 +pip/_vendor/chardet/mbcssm.py,sha256=SY32wVIF3HzcjY3BaEspy9metbNSKxIIB0RKPn7tjpI,25481 +pip/_vendor/chardet/sbcharsetprober.py,sha256=LDSpCldDCFlYwUkGkwD2oFxLlPWIWXT09akH_2PiY74,5657 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=1IprcCB_k1qfmnxGC6MBbxELlKqD3scW6S8YIwdeyXA,3546 +pip/_vendor/chardet/sjisprober.py,sha256=IIt-lZj0WJqK4rmUZzKZP4GJlE8KUEtFYVuY96ek5MQ,3774 +pip/_vendor/chardet/universaldetector.py,sha256=qL0174lSZE442eB21nnktT9_VcAye07laFWUeUrjttY,12485 +pip/_vendor/chardet/utf8prober.py,sha256=IdD8v3zWOsB8OLiyPi-y_fqwipRFxV9Nc1eKBLSuIEw,2766 +pip/_vendor/chardet/version.py,sha256=sp3B08mrDXB-pf3K9fqJ_zeDHOCLC8RrngQyDFap_7g,242 +pip/_vendor/colorama/__init__.py,sha256=lJdY6COz9uM_pXwuk9oLr0fp8H8q2RrUqN16GKabvq4,239 +pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc,, +pip/_vendor/colorama/ansi.py,sha256=Fi0un-QLqRm-v7o_nKiOqyC8PapBJK7DLV_q9LKtTO0,2524 +pip/_vendor/colorama/ansitowin32.py,sha256=u8QaqdqS_xYSfNkPM1eRJLHz6JMWPodaJaP0mxgHCDc,10462 +pip/_vendor/colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +pip/_vendor/colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +pip/_vendor/colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 +pip/_vendor/distlib/__init__.py,sha256=7uthK6m96pTekk8hjlT-MybcwYmmxwP8gEOxXVg1f2s,581 +pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__init__.py,sha256=bqS_dTOH6uW9iGgd0uzfpPjo6vZ4xpPZ7kyfZJ2vNaw,274 +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc,, +pip/_vendor/distlib/_backport/misc.py,sha256=KWecINdbFNOxSOP1fGF680CJnaC6S4fBRgEtaYTw0ig,971 +pip/_vendor/distlib/_backport/shutil.py,sha256=VW1t3uYqUjWZH7jV-6QiimLhnldoV5uIpH4EuiT1jfw,25647 +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=swZKxq9RY5e9r3PXCrlvQPMsvOdiWZBTHLEbqS8LJLU,2617 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=JdJ9ztRy4Hc-b5-VS74x3nUtdEIVr_OBvMsIb8O2sjc,26964 +pip/_vendor/distlib/_backport/tarfile.py,sha256=Ihp7rXRcjbIKw8COm9wSePV9ARGXbSF9gGXAMn2Q-KU,92628 +pip/_vendor/distlib/compat.py,sha256=xdNZmqFN5HwF30HjRn5M415pcC2kgXRBXn767xS8v-M,41404 +pip/_vendor/distlib/database.py,sha256=-KJH63AJ7hqjLtGCwOTrionhKr2Vsytdwkjyo8UdEco,51029 +pip/_vendor/distlib/index.py,sha256=Dd1kIV06XIdynNpKxHMMRRIKsXuoUsG7QIzntfVtZCI,21073 +pip/_vendor/distlib/locators.py,sha256=S9G2IsZp0RnMMbXGrT-gu7892pNpy1XMlUEuUHX3OI8,51828 +pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 +pip/_vendor/distlib/markers.py,sha256=6Ac3cCfFBERexiESWIOXmg-apIP8l2esafNSX3KMy-8,4387 +pip/_vendor/distlib/metadata.py,sha256=BNCnpRfFVslyZcosr4vnE_YbkRb3TNxXtk7TrDszJdc,40172 +pip/_vendor/distlib/resources.py,sha256=2FGv0ZHF14KXjLIlL0R991lyQQGcewOS4mJ-5n-JVnc,10766 +pip/_vendor/distlib/scripts.py,sha256=NYqRJ2uuEuJwr_NNLzWH0m_s_YsobDFQb6HqxuQ2Sew,16638 +pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672 +pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400 +pip/_vendor/distlib/util.py,sha256=gwKL5geJKmtR4GeIUnoMAWjsPPG3tVP_mFxw_Sx-isc,59681 +pip/_vendor/distlib/version.py,sha256=_n7F6juvQGAcn769E_SHa7fOcf5ERlEVymJ_EjPRwGw,23391 +pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088 +pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328 +pip/_vendor/distlib/wheel.py,sha256=gV53KDG7BgbxsdeKjnATbP47gTEJRNylcIeE1TFin1o,39880 +pip/_vendor/distro.py,sha256=X2So5kjrRKyMbQJ90Xgy93HU5eFtujCzKaYNeoy1k1c,43251 +pip/_vendor/html5lib/__init__.py,sha256=Ztrn7UvF-wIFAgRBBa0ML-Gu5AffH3BPX_INJx4SaBI,1162 +pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc,, +pip/_vendor/html5lib/_ihatexml.py,sha256=3LBtJMlzgwM8vpQiU1TvGmEEmNH72sV0yD8yS53y07A,16705 +pip/_vendor/html5lib/_inputstream.py,sha256=bPUWcAfJScK4xkjQQaG_HsI2BvEVbFvI0AsodDYPQj0,32552 +pip/_vendor/html5lib/_tokenizer.py,sha256=YAaOEBD6qc5ISq9Xt9Nif1OFgcybTTfMdwqBkZhpAq4,76580 +pip/_vendor/html5lib/_trie/__init__.py,sha256=8VR1bcgD2OpeS2XExpu5yBhP_Q1K-lwKbBKICBPf1kU,289 +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/_base.py,sha256=uJHVhzif9S0MJXgy9F98iEev5evi_rgUk5BmEbUSp8c,930 +pip/_vendor/html5lib/_trie/datrie.py,sha256=EQpqSfkZRuTbE-DuhW7xMdVDxdZNZ0CfmnYfHA_3zxM,1178 +pip/_vendor/html5lib/_trie/py.py,sha256=wXmQLrZRf4MyWNyg0m3h81m9InhLR7GJ002mIIZh-8o,1775 +pip/_vendor/html5lib/_utils.py,sha256=ismpASeqa2jqEPQjHUj8vReAf7yIoKnvLN5fuOw6nv0,4015 +pip/_vendor/html5lib/constants.py,sha256=4lmZWLtEPRLnl8NzftOoYTJdo6jpeMtP6dqQC0g_bWQ,83518 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc,, +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=lViZc2JMCclXi_5gduvmdzrRxtO5Xo9ONnbHBVCsykU,919 +pip/_vendor/html5lib/filters/base.py,sha256=z-IU9ZAYjpsVsqmVt7kuWC63jR11hDMr6CVrvuao8W0,286 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=egDXUEHXmAG9504xz0K6ALDgYkvUrC2q15YUVeNlVQg,2945 +pip/_vendor/html5lib/filters/lint.py,sha256=jk6q56xY0ojiYfvpdP-OZSm9eTqcAdRqhCoPItemPYA,3643 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=8lWT75J0aBOHmPgfmqTHSfPpPMp01T84NKu0CRedxcE,10588 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=4ON02KNjuqda1lCw5_JCUZxb0BzWR5M7ON84dtJ7dm0,26248 +pip/_vendor/html5lib/filters/whitespace.py,sha256=8eWqZxd4UC4zlFGW6iyY6f-2uuT8pOCSALc3IZt7_t4,1214 +pip/_vendor/html5lib/html5parser.py,sha256=g5g2ezkusHxhi7b23vK_-d6K6BfIJRbqIQmvQ9z4EgI,118963 +pip/_vendor/html5lib/serializer.py,sha256=yfcfBHse2wDs6ojxn-kieJjLT5s1ipilQJ0gL3-rJis,15758 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=A0rY5gXIe4bJOiSGRO_j_tFhngRBO8QZPzPtPw5dFzo,679 +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=CH27pAsDKmu4ZGkAUrwty7u0KauGLCZRLPMzaO3M5vo,1715 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=BKS8woQTnKiqeffHsxChUqL4q2ZR_wb5fc9MJ3zQC8s,1776 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=AysSJyvPfikCMMsTVvaxwkgDieELD5dfR8FJIAuq7hY,3592 +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/base.py,sha256=wQGp5yy22TNG8tJ6aREe4UUeTR7A99dEz0BXVaedWb4,14579 +pip/_vendor/html5lib/treebuilders/dom.py,sha256=SY3MsijXyzdNPc8aK5IQsupBoM8J67y56DgNtGvsb9g,8835 +pip/_vendor/html5lib/treebuilders/etree.py,sha256=aqIBOGj_dFYqBURIcTegGNBhAIJOw5iFDHb4jrkYH-8,12764 +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=9V0dXxbJYYq-Skgb5-_OL2NkVYpjioEb4CHajo0e9yI,14122 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=yhXxHpjlSqfQyUag3v8-vWjMPriFBU8YRAPNpDgBTn8,5714 +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/base.py,sha256=ouiOsuSzvI0KgzdWP8PlxIaSNs9falhbiinAEc_UIJY,7476 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=EHyFR8D8lYNnyDU9lx_IKigVJRyecUGua0mOi7HBukc,1413 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=sz1o6mmE93NQ53qJFDO7HKyDtuwgK-Ay3qSFZPC6u00,4550 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=sY6wfRshWTllu6n48TPWpKsQRPp-0CQrT0hj_AdzHSU,6309 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=4D2PECZ5n3ZN3qu3jMl9yY7B81jnQApBQSVlfaIuYbA,2309 +pip/_vendor/idna/__init__.py,sha256=9Nt7xpyet3DmOrPUGooDdAwmHZZu1qUAy2EaJ93kGiQ,58 +pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc,, +pip/_vendor/idna/codec.py,sha256=lvYb7yu7PhAqFaAIAdWcwgaWI2UmgseUua-1c0AsG0A,3299 +pip/_vendor/idna/compat.py,sha256=R-h29D-6mrnJzbXxymrWUW7iZUvy-26TQwZ0ij57i4U,232 +pip/_vendor/idna/core.py,sha256=JDCZZ_PLESqIgEbU8mPyoEufWwoOiIqygA17-QZIe3s,11733 +pip/_vendor/idna/idnadata.py,sha256=HXaPFw6_YAJ0qppACPu0YLAULtRs3QovRM_CCZHGdY0,40899 +pip/_vendor/idna/intranges.py,sha256=TY1lpxZIQWEP6tNqjZkFA5hgoMWOj1OBmnUG8ihT87E,1749 +pip/_vendor/idna/package_data.py,sha256=kIzeKKXEouXLR4srqwf9Q3zv-NffKSOz5aSDOJARPB0,21 +pip/_vendor/idna/uts46data.py,sha256=oLyNZ1pBaiBlj9zFzLFRd_P7J8MkRcgDisjExZR_4MY,198292 +pip/_vendor/ipaddress.py,sha256=2OgbkeAD2rLkcXqbcvof3J5R7lRwjNLoBySyTkBtKnc,79852 +pip/_vendor/lockfile/__init__.py,sha256=Tqpz90DwKYfhPsfzVOJl84TL87pdFE5ePNHdXAxs4Tk,9371 +pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc,, +pip/_vendor/lockfile/linklockfile.py,sha256=C7OH3H4GdK68u4FQgp8fkP2kO4fyUTSyj3X6blgfobc,2652 +pip/_vendor/lockfile/mkdirlockfile.py,sha256=e3qgIL-etZMLsS-3ft19iW_8IQ360HNkGOqE3yBKsUw,3096 +pip/_vendor/lockfile/pidlockfile.py,sha256=ukH9uk6NFuxyVmG5QiWw4iKq3fT7MjqUguX95avYPIY,6090 +pip/_vendor/lockfile/sqlitelockfile.py,sha256=o2TMkMRY0iwn-iL1XMRRIFStMUkS4i3ajceeYNntKFg,5506 +pip/_vendor/lockfile/symlinklockfile.py,sha256=ABwXXmvTHvCl5viPblShL3PG-gGsLiT1roAMfDRwhi8,2616 +pip/_vendor/msgpack/__init__.py,sha256=y0bk2YbzK6J2e0J_dyreN6nD7yM2IezT6m_tU2h-Mdg,1677 +pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc,, +pip/_vendor/msgpack/_version.py,sha256=dN7wVIjbyuQIJ35B2o6gymQNDLPlj_7-uTfgCv7KErM,20 +pip/_vendor/msgpack/exceptions.py,sha256=lPkAi_u12NlFajDz4FELSHEdfU8hrR3zeTvKX8aQuz4,1056 +pip/_vendor/msgpack/fallback.py,sha256=h0ll8xnq12mI9PuQ9Qd_Ihtt08Sp8L0JqhG9KY8Vyjk,36411 +pip/_vendor/packaging/__about__.py,sha256=Wg0-hNgTU2_lBZcGBh5pm1R9yroQ3rv-X0rig8KjA6o,744 +pip/_vendor/packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562 +pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +pip/_vendor/packaging/_compat.py,sha256=Ugdm-qcneSchW25JrtMIKgUxfEEBcCAz6WrEeXeqz9o,865 +pip/_vendor/packaging/_structures.py,sha256=pVd90XcXRGwpZRB_qdFuVEibhCHpX_bL5zYr9-N0mc8,1416 +pip/_vendor/packaging/markers.py,sha256=-QjvJkhSJBxBogO9J_EpPQudHaaLV3rgVYsBDqn-ZLc,8234 +pip/_vendor/packaging/requirements.py,sha256=grcnFU8x7KD230JaFLXtWl3VClLuOmsOy4c-m55tOWs,4700 +pip/_vendor/packaging/specifiers.py,sha256=0ZzQpcUnvrQ6LjR-mQRLzMr8G6hdRv-mY0VSf_amFtI,27778 +pip/_vendor/packaging/utils.py,sha256=VaTC0Ei7zO2xl9ARiWmz2YFLFt89PuuhLbAlXMyAGms,1520 +pip/_vendor/packaging/version.py,sha256=Npdwnb8OHedj_2L86yiUqscujb7w_i5gmSK1PhOAFzg,11978 +pip/_vendor/pep517/__init__.py,sha256=nOY747zTld3oTdEetBG6DWxEcZXTeOQk0aHvbR-sa5w,84 +pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/build.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/check.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc,, +pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc,, +pip/_vendor/pep517/_in_process.py,sha256=xMY2kLutkjCti5WqTmKOLRRL3o8Ds_k-fObFyuMv1tk,6061 +pip/_vendor/pep517/build.py,sha256=-n8PT-ugS1TdqoTUY1vatDQjrLtx48K_-Quu2MuQBiA,2699 +pip/_vendor/pep517/check.py,sha256=Lu7nMdYu1JVV58fE3hv-d_avTy5h0yO9LsIzAt82Clk,5885 +pip/_vendor/pep517/colorlog.py,sha256=Tk9AuYm_cLF3BKTBoSTJt9bRryn0aFojIQOwbfVUTxQ,4098 +pip/_vendor/pep517/compat.py,sha256=4SFG4QN-cNj8ebSa0wV0HUtEEQWwmbok2a0uk1gYEOM,631 +pip/_vendor/pep517/envbuild.py,sha256=9-u4KffexPMEm52rTaIjEOxsCAd2DMByxzv5H566QLw,5763 +pip/_vendor/pep517/wrappers.py,sha256=9dZn-q7F5KyQKUJMie2uKwur2FG0CLXz_kLZzkJOhZc,5912 +pip/_vendor/pkg_resources/__init__.py,sha256=ZVHzk7ZiFIIgE2RTJj8F7wwjdMGrAngMWtQo-rGNsm4,107910 +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc,, +pip/_vendor/pkg_resources/py31compat.py,sha256=CRk8fkiPRDLsbi5pZcKsHI__Pbmh_94L8mr9Qy9Ab2U,562 +pip/_vendor/progress/__init__.py,sha256=fcbQQXo5np2CoQyhSH5XprkicwLZNLePR3uIahznSO0,4857 +pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc,, +pip/_vendor/progress/bar.py,sha256=QuDuVNcmXgpxtNtxO0Fq72xKigxABaVmxYGBw4J3Z_E,2854 +pip/_vendor/progress/counter.py,sha256=MznyBrvPWrOlGe4MZAlGUb9q3aODe6_aNYeAE_VNoYA,1372 +pip/_vendor/progress/spinner.py,sha256=k8JbDW94T0-WXuXfxZIFhdoNPYp3jfnpXqBnfRv5fGs,1380 +pip/_vendor/pyparsing.py,sha256=sxGUe_YcWBB5ZoHec0m1iJtgcj4iKv_SGfdA_zVCYII,245385 +pip/_vendor/pytoml/__init__.py,sha256=W_SKx36Hsew-Fty36BOpreLm4uF4V_Tgkm_z9rIoOE8,127 +pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc,, +pip/_vendor/pytoml/core.py,sha256=9CrLLTs1PdWjEwRnYzt_i4dhHcZvGxs_GsMlYAX3iY4,509 +pip/_vendor/pytoml/parser.py,sha256=2tDXkldqPQJhyadXzL2rGhVbjUyBNeXXhaEfncHl2iQ,10326 +pip/_vendor/pytoml/test.py,sha256=2nQs4aX3XQEaaQCx6x_OJTS2Hb0_IiTZRqNOeDmLCzo,1021 +pip/_vendor/pytoml/utils.py,sha256=JCLHx77Hu1R3F-bRgiROIiKyCzLwyebnp5P35cRJxWs,1665 +pip/_vendor/pytoml/writer.py,sha256=WbNNQg3sh_V-s3kt88LkNNbxEq6pPDdhRE-daJzArcI,3198 +pip/_vendor/requests/__init__.py,sha256=ZI8kbaEzLAxsqex3MmMPr-v24d1RfZbNAOY8fUxg2Xw,4074 +pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/requests/__version__.py,sha256=8KG3anaNCi-PEclPPOHJ_cv1udY_L1_njVr84gRZ9HM,436 +pip/_vendor/requests/_internal_utils.py,sha256=Zx3PnEUccyfsB-ie11nZVAW8qClJy0gx1qNME7rgT18,1096 +pip/_vendor/requests/adapters.py,sha256=e-bmKEApNVqFdylxuMJJfiaHdlmS_zhWhIMEzlHvGuc,21548 +pip/_vendor/requests/api.py,sha256=hWZgfD7OriCZFOnpeq0bv2pbXDl8YXfxDwAcU036qDs,6253 +pip/_vendor/requests/auth.py,sha256=QB2-cSUj1jrvWZfPXttsZpyAacQgtKLVk14vQW9TpSE,10206 +pip/_vendor/requests/certs.py,sha256=nXRVq9DtGmv_1AYbwjTu9UrgAcdJv05ZvkNeaoLOZxY,465 +pip/_vendor/requests/compat.py,sha256=FZX4Q_EMKiMnhZpZ3g_gOsT-j2ca9ij2gehDx1cwYeo,1941 +pip/_vendor/requests/cookies.py,sha256=Y-bKX6TvW3FnYlE6Au0SXtVVWcaNdFvuAwQxw-G0iTI,18430 +pip/_vendor/requests/exceptions.py,sha256=-mLam3TAx80V09EaH3H-ZxR61eAVuLRZ8zgBBSLjK44,3197 +pip/_vendor/requests/help.py,sha256=SJPVcoXeo7KfK4AxJN5eFVQCjr0im87tU2n7ubLsksU,3578 +pip/_vendor/requests/hooks.py,sha256=QReGyy0bRcr5rkwCuObNakbYsc7EkiKeBwG4qHekr2Q,757 +pip/_vendor/requests/models.py,sha256=6s-37iAqXVptq8z7U_LoH_pbIPrCQUm_Z8QuIGE29Q0,34275 +pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 +pip/_vendor/requests/sessions.py,sha256=DjbCotDW6xSAaBsjbW-L8l4N0UcwmrxVNgSrZgIjGWM,29332 +pip/_vendor/requests/status_codes.py,sha256=XWlcpBjbCtq9sSqpH9_KKxgnLTf9Z__wCWolq21ySlg,4129 +pip/_vendor/requests/structures.py,sha256=zoP8qly2Jak5e89HwpqjN1z2diztI-_gaqts1raJJBc,2981 +pip/_vendor/requests/utils.py,sha256=LtPJ1db6mJff2TJSJWKi7rBpzjPS3mSOrjC9zRhoD3A,30049 +pip/_vendor/retrying.py,sha256=k3fflf5_Mm0XcIJYhB7Tj34bqCCPhUDkYbx1NvW2FPE,9972 +pip/_vendor/six.py,sha256=h9jch2pS86y4R36pKRS3LOYUCVFNIJMRwjZ4fJDtJ44,32452 +pip/_vendor/urllib3/__init__.py,sha256=EZviRQA_iuL_94EeJHY4JAArRXbRCkAzA0HH9iXZ15s,2722 +pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc,, +pip/_vendor/urllib3/_collections.py,sha256=-CAKsDE-WdubAjlBSZLx7b0e7WKenaNGwWvGLDEF1TM,10746 +pip/_vendor/urllib3/connection.py,sha256=KLFvknLgllcMkgJ-zUsFjCzOt9P03fDoIpTPz_vqXCw,13839 +pip/_vendor/urllib3/connectionpool.py,sha256=rgc_3D0VsD5VDxr4KzzA8Plee0Rmerm5WKb71FcxWu8,35097 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=lhYXvB5_oGKSeurX7za3XhcGyERvNjXRQ3eJp2GmQ3M,717 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=x2kLSh-ASZKsun0FxtraBuLVe3oHuth4YW6yZ5Vof-w,17560 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=Umy5u-3Z957GirdapnicXVOpHaM4xdOZABJuJxfaeJA,12162 +pip/_vendor/urllib3/contrib/appengine.py,sha256=VvDpkc5gf9dTXNxXmyG1mPdON_3DrYG_eW4uOqN98oQ,10938 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=5ZpMF7N9B6NEjVU-r-xjDOV_-hkNvsDoNc84J2yqauI,4459 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=-kI_9y99Iwybv6Wy8IF8PugVl61BeMBEEqGwrDYNCuc,15823 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=BqXSlChN9_hjCWgyN6JdcgvBUdc37QCCX4u3_8zE_9o,30309 +pip/_vendor/urllib3/contrib/socks.py,sha256=Iom0snbHkCuZbZ7Sle2Kueha1W0jYAJ0SyCOtePLaio,6391 +pip/_vendor/urllib3/exceptions.py,sha256=rFeIfBNKC8KJ61ux-MtJyJlEC9G9ggkmCeF751JwVR4,6604 +pip/_vendor/urllib3/fields.py,sha256=D_TE_SK15YatdbhWDMN0OE3X6UCJn1RTkANINCYOobE,5943 +pip/_vendor/urllib3/filepost.py,sha256=40CROlpRKVBpFUkD0R6wJf_PpvbcRQRFUu0OOQlFkKM,2436 +pip/_vendor/urllib3/packages/__init__.py,sha256=nlChrGzkjCkmhCX9HrF_qHPUgosfsPQkVIJxiiLhk9g,109 +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=so2z9BiNM8kh38Ve5tomQP_mp2_ubEqzdlCpLZKzzCI,1456 +pip/_vendor/urllib3/packages/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=WBVbxQBojNAxfZwNavkox3BgJiMA9BJmm-_fwd0jD_o,688 +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=E-9J-kAaUn76WMZ4PpzKUxM4C3yjY7mopOpbPIy3Dso,5700 +pip/_vendor/urllib3/poolmanager.py,sha256=csE6Bh6L0FJ3iNOHk2z8KhMT8Eiq976b6pk8I6vrOC8,16853 +pip/_vendor/urllib3/request.py,sha256=OfelFYzPnxGlU3amEz9uBLjCBOriwgJh4QC_aW9SF3U,5991 +pip/_vendor/urllib3/response.py,sha256=ta1jp4B5PGBWzoAV1s48WLuHCRICQnK7F9m_kyK4Z8g,25609 +pip/_vendor/urllib3/util/__init__.py,sha256=6Ran4oAVIy40Cu_oEPWnNV9bwF5rXx6G1DUZ7oehjPY,1044 +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc,, +pip/_vendor/urllib3/util/connection.py,sha256=-AyqcRTuNUHuo5ndtsU0Og_nMyCGATC-kYqOUdBHwIQ,4639 +pip/_vendor/urllib3/util/queue.py,sha256=myTX3JDHntglKQNBf3b6dasHH-uF-W59vzGSQiFdAfI,497 +pip/_vendor/urllib3/util/request.py,sha256=H5_lrHvtwl2U2BbT1UYN9HpruNc1gsNFlz2njQmhPrQ,3705 +pip/_vendor/urllib3/util/response.py,sha256=028PNXDZhwBtnm2uXvnAHi_l9_AAGrAMH2Igh2AbgWg,2586 +pip/_vendor/urllib3/util/retry.py,sha256=kFQTesNiwPp6ZeQo9VHeUO7b8qA-_l3BnErCAOEPo4Q,15105 +pip/_vendor/urllib3/util/ssl_.py,sha256=4qqBDM82bufhqqEd0b-99sObz95XmEVEXDVi5iAyCeE,13172 +pip/_vendor/urllib3/util/timeout.py,sha256=7lHNrgL5YH2cI1j-yZnzV_J8jBlRVdmFhQaNyM1_2b8,9757 +pip/_vendor/urllib3/util/url.py,sha256=qCY_HHUXvo05wAsEERALgExtlgxLnAHSQ7ce1b-g3SM,6487 +pip/_vendor/urllib3/util/wait.py,sha256=p4BZo_Ukp5JF0Dn6jro7cUfqIjnU6WFtuoA6poaV5Jk,5403 +pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 +pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc,, +pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 +pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 +pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 +pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/WHEEL b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/entry_points.txt b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/entry_points.txt new file mode 100644 index 0000000..f5809cb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.7 = pip._internal:main + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/top_level.txt b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip-19.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/__init__.py new file mode 100644 index 0000000..5d05da3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "19.1.1" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/__main__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/__main__.py new file mode 100644 index 0000000..0c223f8 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == '': + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +from pip._internal import main as _main # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1f1f08f3bd4bfe25040c2a2221584d30364607a GIT binary patch literal 206 zcmZ?b<>g`kf<1{+vEo4bF^B^Lj6jA15EpX*i4=w?h7`tN22G|aHbYB2Lp?)3O~zZ? z@$qG;Ma7xlIYq;;_lhPbtkwwF9}c7>F4F*}6A3 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..895917aa69b18cdb04bd9fa1d9284a65e2f0618f GIT binary patch literal 458 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 U!T<1Qm@w#N3hS0Df2^(iH*b=Bp#T5? literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0e120599640fbc24aa63ce41b4e76c42f3a8883 GIT binary patch literal 7058 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 OvuNfuP{-uYH2xdO$p6Ox literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75db2cfe186e66f00da0096be0dc1e7d66fda24b GIT binary patch literal 20920 zcmch9Yj9lGec!!z@9y4REEXULK1ESi4^mv21oeJUv`i8tMTitg6Cfq6D6bZKE`VL^ zOXpsY#CqYnrd+wH=~q-YO+6{#nKp^*NmDn?q^+mpj?=Vtr>X0vuREQ_ZN69^I-Pbp zNk*ME{r&!DckvLNCSS6cd+vGN^ZcLx`{2y*aMr@_yXF0FUHprd^?OY8e?y3z!V|6~ zEK6C+u3HVeXxofCb*JdaJ5hAyoh&Bhohqi}oi3*3?G-(FXNnnlXNy^R4;6>xoh#<# zJzN~dJ5kR!Mv5bi(c)-hM{$Sr<<`dCmT-{ zpOW}k{prRt#b+eGv;J)3x#DvYAFn^(c%k@$#CO$CG+r#eDDmC(lZ}rTKi+t$_)_B& z#ZNR&6;Cxz7f(0N6wfp!i<6DB#j}lb#dD4G#q*7qi!aMJd+HY&Q^hHX@2$VmxLCX> z@qP76jaQ4WN_>BPx^cO9*|vgJfEF9afL3BdV}4R4fJQwYP)vx?P-8 zj}pHNRC{baBY=>?>pQcolObg&EQ zMWmlm&m#S7upj9v($A^qk$yfHsnw9Pq+VAqs0ZG)i}he=t)Wf?L$&6*Q*24<#a^nd zPAVV$zoR~`9>iO#m()Xehw2mRVZ0-CN68SQfJkpc;8m%)OoyD z)XVAu-W@fiUcvj*>Y}=YcUQfkrqvOQVpSE@WpxO#&tR-q)F(04PX>o;e-2~)ta?+; zr~=CVyqZfaMb6c?Ek@8&FsxL=DsoH3_bTnN^#GVe`Sq{P| zj1yt?cAQ?;^?G&gDb(IMS*|PwldWc?TlLeb+>Qc`?9BOUJ&+|>veC6Eq%*-Y9p1V*E7hkQ0jdE03jCY`)s9dj?qiU;Z=4HowZ|N%5 zOa=7-uSQuf1-dkkRX}s@m6a<~cn@I=EmWzr6thRMa+Rf0yBsZ+TDO|Aa30pRQo4!w zP&{_}>g0u~>*q@6UdPmDrY=vz#}%py+dMx=uv-i`07kt|keUbh-tyn3q=dy*gA zj^d%^W*c4h=QcbWG}>pYI;cb~y@FYdz52$LH?U3TCNGw*UYnktntmC%d(UEq^;TJ3 z(X9m?gdyHHt4ijaxLFAcso1;R=7N^%adLLKT@PZHn;1J&mt%L9JtwaFye!P{-=vk)Rxk0uPxNXNg6(LZR*n5l7v%dW6vZJ zb0()MJc0cmXr?uZCmcf%fqE+ET`RKBT6gR_HqL9J^NFmF-_;;m)=mG`Vh}9`+OI}_ zz13O@{d#pN@Y~h4Uk!b|+-z2x3;uEw3+_)&O~{uOyVsY4H@ge@>_yPE-WpxCyLM#N z?4{IopyGExtkJ1GjlZ~y;+We<2TFt z_G8&GDWoi4(7W*Aq zp1z3qVEfWY@R991iyI@lDv-F2&KEB70TRjjv4?n5q~)RLpmm|DHu z^hvAvwM{iV)c9JItfgvcl|j78xXP-b&pZ39RlAvDdev6BHBSwz{JU0HfM(s^)ZUp* z?Tw&~U;9Xp{-zqEsPQ}7YoHfrEu(g<+h4KuD{4&btY;fTtB!3&xoB98t6c!syh^CF z+P#qII%^~A)*T0b_G&_E?CI6mtI`WjGULeUc(Utu6KdZ{tD9i^-2}$7|D@IH z^*-sfi!trMYL4x*P^YU7Y^1r?y)T@#v2~XJJW3JkT5CJi{Z(t-Q3yfgbI#62at@@J%leQ;G;~R z6zDkBUWpb#3i6=)^`L?8g}~`6^4;VWDb=qsMS`{xC+Dj;j?*6ycf|I@7JT9&Zw5~| zj$i>R_f~Edr=Sbu^;PE`cgElfVD1E_fx(@XHg0b_aUW(+)iAAl>fqRe8REwRe`V;l6-|F{v@1FIiP!74v zbQ&kXJj5*Ym}FVssy5?fqg=T>6Q{zJFbWzm7@c}RE-O)KFUKRTHkhWcK41m1 zAxKI)YPITNJhl<FE17<}@~k{b|J%7heVQ<>flqv3~JlwHd_e3#VsFvzKNt%n&R~k2x(}KX;X!p?(OJ zg$(I4jFI-l3GhM~g>ZjbGbgE*8||==*6*;=Z3Y4X6SQYH zK${~B34>NLYp0x1chnxUN9~+F>ZEMf-tUY$NF&T6&$UzbUWeg0N6MHSXm2Mt#TDe+fMd$Sb=e$~lE6oIns*MO#_WCk!bdbx1e~<*Fnk8&{=N z8tUA!D|}^UojOe7J_;D1t6%XUVDpCzQ}ppAX8k z!5@QVZ7#%_b~y}hwX_nr41@Z-zKid+ubfxH0)x9Q{W@DFinK7}&i(fq&P2cNU|7UT zDLgW)A0QH0Yhco94oHa;fyCC_JN6A{HL>cVB-y2Y#U@kGP0ZVSEToac^d1Y$fL#KC ztfkh{AhU^e2j3+@kf4KE^7LHS-ID$y2o>|c7vy|pkhMg=X83+LrGEpY zFEuYMcS&9|-DLY)%I&7wzpC6j4$(gu%eAZmiL4E+gI(y7n@vp%s{4S;4vae;Ta-C_ z(p@gjfq4d61M3b^E%uNyu>@lJ5quM;dU8q@Ib^s|Pk#vo`aK5RM4e;3VI3?0)ImKK z!6wJq#d1?YR(SgHCkmeaGHWCt27(r{1*QKAb9SK3k^p^wn=u5mPh`wl0caYKuM50TuUpbo2Yra0SEw=4EVSNV#%%>Ug#$E>)^eT zvWZ#N0uN@_hPY9++}iLuq=6{kb=z%hYqEXQY-?=<8w-ABZB#aPhuPTLSZyc3!R|U= z5|F8lukGsE>rer9)3WK+uY$C8hOd!h0h;m;g(v(@_DXL>Px$(4n3eun1clx45KwNk z973*xKq1HLeU|=Z2482uwE(Sa-3-DwS#7qLBeQ>Lph51E0E7t1A{Qof`PKlpQ(9~a zi0GYc>#wq{p<89$EVY^hk2uR3ka8(4yWqD}oL&SZLFkQBO+uA$c@^?;q!WM-97n-#iD|Pl1x(x*4aZS`QU{7$ zCIl(J*^2xMh#i)rw{L}{{wCUuQ}x!u0%%^EO9#|wR+HOPNXYrp1XTUE8EmC1`j?US zM|eUaISV8KsL{XY3^#4dbitl2q+?)Ko<>mpY^l^}sb!q$Qk*N5-dQf!O^N;rTGi_e zxXRMqrXk2+$j#|5BKS2tArY?UWRu>5-ouhxLB`;hMC=rvkn1@hL8*_BAfmT)oQDpq zTt7e4Q+7>PC?N7TjE6dO!RlNaGRZaK$#mr0u~t20cfAsiFW>e`K5~KE(>Sgf=u9VE zD@rY8HT0^hS=;K2Vk=oYi!l8fHd7)0GuhWI=uxk{Zbe=#Q_FTUwIK**?pvn%bOlkcZ41*f zHBhmm=L$RZvuMQ}?mS}zG2w4;0)Y(T^yL|WPW_80h?4;bIn;@>*B5iPM1l))c zdi;!>1PB=5cU12Me*8) zARsEYrU=}S1VCYYXkd*J)Nhnmq&cF=xxg=1DgdJYM*Clw3;zFCb-5HW*V_(J(J(y7RlU81=?j9z7I3%5JMs z=!2;Nm~AS=v^Yj8pOrtiBD1M11FxeNIUFC{k;#;`SS*K_52g-jfm2Wu{uPlVebHn~ zO&q316|;pVTD}&=w%?jZVR=*66aLh^AKVTqIIPfHP*F))$`6-S>!`odTIM49x5^j@ zvmOooV;B7SdU;_2$TS%)qZ|E0tdha%`w@#XgGuYZ!;4QuHJEkg!Ut}r2jPondf_qks@jGka2qI zvS7YGRsAE!}!J#&yVe13d9(GAW3%FwG1mrT;BP z`X`vszeBa@Kgop9`k(QHQpW!Cr=Qcm$DCjg?SbFsO&Z_2Nv4BBW*eG~)1{JXRRGe$ z<_NTKoirPchkFoT2`GeYAYveV0Twv{1hYpu1Ol_?g6ka54d;dh{3^&A{742);St^5 z20EsJ0-|>UXvmFsPQexjR1$2m@Kwk%@y9nCnZzRkHgK6;!kIy61Z-zI&P<-WI$N5) zJbezjo(#z&D;150)+kl!Ny68QBY;;oSf%qrnjsdPZfXRQ3M++_s0=35UdndG!tDPZnI7815#}s;j$EHX7=>DyN3;LXcE>aFVHJHp(GBauMAH zS}^3sqdmzI93xH$gt|CSt7>b0zBFH^U6YJ$4g`@_))I_KOVC*VS2Pk2HOjXEmNFX&_b^>|?iH1n;t!SO%Fm*(hF*QLMDfPx4p7wp!W zCniq9)~8oA_uJ3}9#jD`O1;Z4!IN{+UqAr-z_XzTWI_KICOKyPdkEsZIi01lG1jQ2QK&=UJ~E5 zpybv2Xd(r^f3c+uq8O~pM<>W{zQYL$ihxR{Gq!2yeIJ4JcBH^jm(L;3Bf#7_9vu3kC{c3RkbIo-^e=$qj~{|K;yn9Yv% zTP~oqC+bp+SZ-FSz?#TP6DPoumm5A5j3@m5k3tDpbuhzV+fiZ!g=1msl`%xon+huWlNpk-84S zQ6ZQQAbdbv;<7>=cyvSl;=`^Ja%@el2;{`*LE9+_+{*Od`uAg=cZB=hg> z+M%$pC(cmqAWSoqL?I{#^hG*=C?C-GBTg>p)^ZzW!qzRw7N17TdN%?H8}x`F>46@j z62v>{)lmu|KrEIN937;Qq<9AD_xVA3x%tj=3tER%owlB~sG#FfU9N(FfW(vxwGl)V zyVQ{A-(+w5_%U>cWhIQTzK(PuYpOx{*xz@kDa=0V|H}_jW+t&qh%s6QdtU!dHux_Y z3~-PZv+gx>3&f-_)s)_ z>InC;D>SXk%`Keh3>|;$$eZP3owo`%x&t-^WLKCz!D!DSLEOHS);YSK0SEE45(l~a zVA22<13RdahV@u*BM44=tR-?mnNGp@yWs5V<-o5}tPFe}(9LcyWkQdD%6Vf!#e^;W zKM}-98La*vj3?%!Hn_Y0&B6~Ekfgy$3p}z}R9JJwPOhn;*uIj_pz?p?N_vP`P|mvc zxILILi3h2g%$PuHX1Q*MyCbk?UCZDp(aZyr-$<^)hy&9N%_EL}78pMPEPhhCs}7V5 zE?G0AuKre&It4IongF+wPH!VqXv4Q8PH#npVaYoK1c?D6{$4MBR zpL(+6+_=#>(QGx3NwGQL*RD=MC!n!k_!c5Oy$hjtXiAo?yEfIe~HhbO>f{ z;AdwJ80|lDDD^EYtd0=G+3V%{a_@BKQBG@7k5-HI=*hk!4jcY;eqfixIH1$_*jhs9 z?{jPE3}q#$Rf9QFjFVZ&&JHX#`Hih6aFdkFRuhEiHnrwR2)1P%29H&6*dU8`M0*=^ z9D+F6m(Jq0Z4$&UJ7gB$kQeH7q~un$UMFR0KtbvEJvBwqvRJ+uNLzw@l&KE#(kBAF zZHAHJ48|z)h8+U7VYVBm(H0|p6sGGmbL$;gg*e9oZu^s1SR4siGA`owBk>&aMzI`5 zgP$4)q8Js*l7FcpGWz99KAWvqd<7By~Tu* zKn)rHZbZ!ZR~@i4*h?C<`nnq@-c=&Wgunm?OE?Kqn4rNZWn2Lvc)&>mUWHztS%`-= zRogzU7tq-w9G5Vp7}a1+IiA6oCXl#&gir@b>LB3DqUNxcz?#Bpixf169PNzt4%w-m z89Ql^p4S^~%V8w=lE)ihzT&q)@w9I?$cH0|LDI*MPxzCdTsRy9U(_Q7 z!3XnI9l{k%;t+<2+~RSZu{9M}1N{z<=0kJZ2MF;!1(ZMQcM~oge zN`3(>35?qbXfuGd*Tr_W*a7%VB#~c(?JV8QcVXg@7{oAmN!YdQ zs`s7^D+RPD?|Q2lu|{N67IElMR)Ao0`Np#SO|x@ znP}%78xK7?ps|5K^(@4^@$N9OS<{Plb%*ct@!IHgC*PBmj@89tXOu8m@e;346LY?L z>KiZu4h|(x3UTRE+=d$nRvx*1@C!JYFlCbCbM87oRaufk@i88Mjndtd+!(0EafO6` zw-4|O_%D#RLCx^O6{rcN{dvX zjNubB77%y=hW*85fVWuwk`f0-_!WL7Fi5sJ&d^v7h5}TVK*wWm*$!NloIN?P$9ZrC zbZ~NDv4$Gfc)IgYY`7i|8rZTtJTJ0548jIY{X0889+lrU3GZD4HNSdgm* z7zVs{agUK!ydzHvDxC{ge@J{R-_TpzP}G>^t() zYy*+)2xO~HerslDypqG-B^!up&a5{(a=d z^xY_9+r*?3??CF@{5-udZU&dc9WPCX19TRKh7TiORuRLC1}5P}3u0ig?)FkCzUXVgbZ zb7dXpM4MPLrvoZyo(Tn@fiuXk469#THO^u(`2*!3J(KOzMt4ETNs=fC!Vo z%N&LomB8olmOXrhJA4Thp8f>p>g@ zznc?Y7hk{!B?lK>bUDybrO`NHXcABO+X$d-Nf^eLI=UL9Il7^N5r#$z+MsVmN##VT zE|`$rVDIh#(E_zmQ*}xuR};+|QuKXS5o8&aHZ_T;;L4U^3qVNcQHS2|KNn@$4iGcz zW=vg#DT5S67X_CyL4afUCW~*r6%9iXJ;ZjPGy4JRj6fqK=2Nr+w7SuwV3XnL+0OIi zy2*tT&dqh33I9m7umG+Z3ZWyn3e`5>a|OAAgIKvxo`X;W`-feP?OU-u7u#ih4hwf) zpGVjkI?MY(=IH2`nX~f@K4!*po85pLI27s&DEZ)z@auRpp!+;Rg&iB@S$DADvB#m2 zBaTyMaQc2^YoEcu0E&w}0X?ELy;PtqSfq1A>`E4;r`W}}5p5{#6pXKKnD4&dS=p(EFa4*Cd=8L98PkjA#(qDrA9NcXPSwzxCODQmvobH_JUH+lgfmrEJuQ}U~H305) z0V7H%Zed6;qka_A2U}#YRv%B$K%u{f68(=^Jhp)r`XeyX+hJDW@(NHTvZIkRc z_a1l1`gDwKCRz963|?ZP2S0Li=WGv@av+NlVQ%0WbpU z(h(HesV0yctzA%Rr;HC3)Yc=o%mLfg0BC**JmD`zP;&QyhJ6%Lov&V#i*&fD1z|wc zEB&L@W7gpzv3UtZ z+St;z(FD=V<%KH^Rt-CkU6O%O*aid`*OsGxmDrE?YV**h4P@>x{#rt6DFAH3SPwJ# zFg8i!GBMzXqk{`oU@#RCPdv7j01M=R3A8rgSr5P#T8sgt>Ni+PU=x?HE&V2g8w~CR zcPB80KODeaj$V~U;pr0Vz;=}d%<&J{2+&44nHSir;KRW$f!HZL;+3`8kPG7pqz3q) zyDCE!CSplNXV+{@Gt%pF`E*v7oA7PcQRnIvv!Phyx6Q>=D6S?3<6jQ`>>!hqbS(P@U8t`990JMZ__eLD|^bULo zwRwNE#=P}DGL6$MwW9Dl=qaGRQco}4H@M+ykqT}LFGlRqGoZp9PaN@vOsOcSw&Moc z7@xut8%+!-1(na8`#!pU8toanp->{z1u9aGOmPnvV z-(-vauQ;L!I67hj@47HWduvItP`R=;u#~~|5qMtQci=_|8Rchs_NTq%IpF!6sSVeN z3V>EVC)5BmXp;>}RyH-g%@Go~6i$-Z{aI*Q-ocO!H~d?Obq>;f!iPOVoTF(B0XG6B zxW_^iM)Vv3UH0VX_-TbJ?Y60o1vbO>fb`G7dl7eF=+Q3RD6dQ#u?TC74Q3yP#ToM_9rMD3=DnC6=$2<@doT28)9;un2g_>{%e$&1S zZlU=QY^)BfwkPRa0bZCK2Ft-;;5tR(E=~^!&5b@;l1un*`6f`)Cc0pbwC~efP7t{0 zKCe&CNa}mHY$yEFzPUE;8>|U)Zd0tFw_wD8YiDCFP^7S?x>3N1b?@k46j%W^(f@}4 z@LV)Xc`@<9DH5ASvsAAeY#ErPXyqvMcp%RB4+5~Czzi~Ij=&58tB%UnEH~LRwPF5X zfqONKN%M$Y?IsLh;C&0}ps`zG422yQcQbVrh8!7`jO7~sIY7_oQV=@~^o1~XDg$It zdXR?VhW7@a2VsC3S4|bPKFNUOQ@j;~fzx}CM5V2?I3C`zLECu8?Z}>n$csFOlu)dF zAjcrdV=j<@h@TV{#NT4GZ?i|_Y#};JsDPfDAITu;S!8{*07erd5K;J z3F36razM&coL*)S*Vra4h0z( z4okJ6)eIyD=H)4QK6cjFELFqOe{wNwT z?oLeUA3@p}ehyTlJNy+p#I0aZuT;%iqH-=3?Wm2B)vQ4m*8iUQ{cogvCvXh?H}cVV zH?Q*WrP#eX0#zQ`>W+ZExpzQ~A*p1Hq|(jz{31p=&z|jZ{07xPTrn7+&+Ee_n2g_m z2kp`O5ABCHtgM}p)0Illj*gvc!p#BIq1=^gBhkt%AnW_sI8ny^|0o-XWMA7T4*Fli zhn=1MEchRT#DPlT5+$Y8*ts=V*lqOsV$OY!{n#kcfGmqU+>?oy7!#uOO%}*_q=iIf zp-M{^iKKD=H>RWSp;|m*t_pxo^Z$#W(=+^7>|hkdjs2ebk;14s3nDHR+1G~5lr?_h z!VrmiQS9@=qsj>Sv*R7n{_Nl%0H+1Hj#h4jdM{dxGsKZb8!uX*4dNzr?KRZt@;vdp zS{Ysr03jXcr2#`!^Dt&Y8H5znJTPSPO@Z5kqG(J+a^~&FRcEv`Q23CM91z1M5(8xq zSSNs+QU2i4K4h(0Wc<^G&4lbUzmkWQ3^xspklcI>N6*8-Q%1#$+8JI*TPIU$L6|m@ z7|hsk+d^0KJFYm&)TmYTeiS#WW`L(j4=rjpa=`^k5C>uP=( ztA<-w+TplDREvk?Le7NT$I;(q_TONj89avy`g@GYd?Ung=O+;H(Af36EW`-S#XjQ# zxwpM>)q0{r1uIbk{`HV}MaB>Ov|>{?)MV-6@y)fs0xc0##AUm9|K_3|lNnC*Tp~kF z-IFHaDek*>Mfz$Eu@dc@#ry7A3HN>gQKEF#c~;vp>OrUA;Fl|0(ok+E75Cq>F|)R$ zhs9l+E8yQWO~_41Bg7rJXW0Z$JmgJ1#u2~IfLys4{fk>x+SGeWc2bYC4zG9t85B)}fc6Nd#!662R5!`#=eM)MSciSd!`UJiQBG54 zjx!KdFUf^aBcKTedxc+KWFW52Uu5jp8T^nzj37?W^jzG2%&ey+i~j@!n;P3w`VW}< ze;CjS%P5`bd!nCbAj~Q~4-D^ml6j(yqK#Or7)J9+4W!{`%PgQgsL6~9-4m?0iB%oQ zjj?wUi-r58)Pq{#cM#-Y2fW9hGY&G!zft+4C$vekKDFNczo+40B!BQQ@=YDFC*oGP zL(5{%Zj;F7T+bWwE{|RveQ@;5XnO3G>~Uc0gqQL5BR}IMy)>Srm-Ae2-a80B7k}Bu O@H{!@n-tUDng0jS1~X0o literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24234c49c29a399a04f5ecc4ebfe5c1970772862 GIT binary patch literal 11750 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b82f19f13daa70432c09ccb2be72a99ef065a062 GIT binary patch literal 28780 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49b46f0c5a7c56f9e076feb5f3345aba3638f9a8 GIT binary patch literal 4439 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 DV!in@ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3656e4b1698e12cf642f67a9dd1d14831f2b96c GIT binary patch literal 8169 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 GuKy1+f{)?= literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f178cee7040074e2648aac790f72014f3d233511 GIT binary patch literal 9104 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d0edbe4d6f4eef778f99ad634b63651f0e6f386 GIT binary patch literal 26080 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 n$sI{M`BHLMa)P9-_b>HD None + self.path = path + self.setup = False + self.bin_dir = get_paths( + 'nt' if os.name == 'nt' else 'posix_prefix', + vars={'base': path, 'platbase': path} + )['scripts'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + # type: () -> None + self._temp_dir = TempDirectory(kind="build-env") + self._temp_dir.create() + + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(self._temp_dir.path, name))) + for name in ('normal', 'overlay') + )) + + self._bin_dirs = [] # type: List[str] + self._lib_dirs = [] # type: List[str] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in ( + get_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(self._temp_dir.path, 'site') + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: + fp.write(textwrap.dedent( + ''' + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + ''' + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) + + def __enter__(self): + self._save_env = { + name: os.environ.get(name, None) + for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') + } + + path = self._bin_dirs[:] + old_path = self._save_env['PATH'] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update({ + 'PATH': os.pathsep.join(path), + 'PYTHONNOUSERSITE': '1', + 'PYTHONPATH': os.pathsep.join(pythonpath), + }) + + def __exit__(self, exc_type, exc_val, exc_tb): + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + def check_requirements(self, reqs): + # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + ws = WorkingSet(self._lib_dirs) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.add(req) + except VersionConflict as e: + conflicting.add((str(e.args[0].as_requirement()), + str(e.args[1]))) + return conflicting, missing + + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: Optional[str] + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + args = [ + sys.executable, os.path.dirname(pip_location), 'install', + '--ignore-installed', '--no-user', '--prefix', prefix.path, + '--no-warn-script-location', + ] # type: List[str] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append('-v') + for format_control in ('no_binary', 'only_binary'): + formats = getattr(finder.format_control, format_control) + args.extend(('--' + format_control.replace('_', '-'), + ','.join(sorted(formats or {':none:'})))) + if finder.index_urls: + args.extend(['-i', finder.index_urls[0]]) + for extra_index in finder.index_urls[1:]: + args.extend(['--extra-index-url', extra_index]) + else: + args.append('--no-index') + for link in finder.find_links: + args.extend(['--find-links', link]) + for _, host, _ in finder.secure_origins: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass + + def install_requirements(self, finder, requirements, prefix, message): + raise NotImplementedError() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cache.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cache.py new file mode 100644 index 0000000..9379343 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cache.py @@ -0,0 +1,224 @@ +"""Cache Management +""" + +import errno +import hashlib +import logging +import os + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.download import path_to_url +from pip._internal.models.link import Link +from pip._internal.utils.compat import expanduser +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import InvalidWheelFilename, Wheel + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, List, Any + from pip._internal.index import FormatControl + +logger = logging.getLogger(__name__) + + +class Cache(object): + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: An object of FormatControl class to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__(self, cache_dir, format_control, allowed_formats): + # type: (str, FormatControl, Set[str]) -> None + super(Cache, self).__init__() + self.cache_dir = expanduser(cache_dir) if cache_dir else None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts(self, link): + # type: (Link) -> List[str] + """Get parts of part that must be os.path.joined with cache_dir + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link, package_name): + # type: (Link, Optional[str]) -> List[Any] + can_not_cache = ( + not self.cache_dir or + not package_name or + not link + ) + if can_not_cache: + return [] + + canonical_name = canonicalize_name(package_name) + formats = self.format_control.get_allowed_formats( + canonical_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + root = self.get_path_for_link(link) + try: + return os.listdir(root) + except OSError as err: + if err.errno in {errno.ENOENT, errno.ENOTDIR}: + return [] + raise + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def _link_for_candidate(self, link, candidate): + # type: (Link, str) -> Link + root = self.get_path_for_link(link) + path = os.path.join(root, candidate) + + return Link(path_to_url(path)) + + def cleanup(self): + # type: () -> None + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link(self, link): + # type: (Link) -> str + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + candidates = [] + + for wheel_name in self._get_candidates(link, package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if not wheel.supported(): + # Built for a different python/arch/etc + continue + candidates.append((wheel.support_index_min(), wheel_name)) + + if not candidates: + return link + + return self._link_for_candidate(link, min(candidates)[1]) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory + """ + + def __init__(self, format_control): + # type: (FormatControl) -> None + self._temp_dir = TempDirectory(kind="ephem-wheel-cache") + self._temp_dir.create() + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(WheelCache, self).__init__( + cache_dir, format_control, {'binary'} + ) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link(self, link): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + # type: (Link) -> str + return self._ephem_cache.get_path_for_link(link) + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + retval = self._wheel_cache.get(link, package_name) + if retval is link: + retval = self._ephem_cache.get(link, package_name) + return retval + + def cleanup(self): + # type: () -> None + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06ba01dbe0b2ef5ae047762b5a21705cecb74eff GIT binary patch literal 281 zcmXv|yG{c!5cH)Xij*Iqa)(j`^NL6$gb)oKO{kF2%JJjm!?(6<=YZ7w4F8ZXNt?f* zV(%nIn%$k}iu^`*=)3XT5mT|s&`o%t^yY6 z&|%G`_dHl0T|CRQZ(E6)dxwTQEGAj03{S?(VlY#M-NUf^w~ZxqDt>Y~_X-6Vf$7ps+c5oA7hmCC?|f7_ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95a9ae6a4b08fd6efb1cdd8c2d66f64cfcecdd7d GIT binary patch literal 5094 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 LygvBH%KQHZmT`kG literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f587353b0f22cdf1262ddf4dc4778125a625c190 GIT binary patch literal 16865 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, ``

    `` or ```` + if completion_type: + options = auto_complete_paths(current, completion_type) + options = ((opt, 0) for opt in options) + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + opts = (o for it in opts for o in it) + if current.startswith('-'): + for opt in opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, opts) + if completion_type: + subcommands = auto_complete_paths(current, completion_type) + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type(cwords, cword, opts): + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith('-'): + return + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split('/'): + if cwords[cword - 2].split('=')[0] == o: + if not opt.metavar or any( + x in ('path', 'file', 'dir') + for x in opt.metavar.split('/')): + return opt.metavar + + +def auto_complete_paths(current, completion_type): + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(`file`, `path` or `dir`)i + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = (x for x in os.listdir(current_path) + if os.path.normcase(x).startswith(filename)) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != 'dir' and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, '') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..f6108c9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/base_command.py @@ -0,0 +1,340 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import, print_function + +import logging +import logging.config +import optparse +import os +import platform +import sys +import traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.download import PipSession +from pip._internal.exceptions import ( + BadCommand, CommandError, InstallationError, PreviousBuildDirError, + UninstallationError, +) +from pip._internal.index import PackageFinder +from pip._internal.locations import running_under_virtualenv +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import ( + get_prog, normalize_path, redact_password_from_url, +) +from pip._internal.utils.outdated import pip_version_check +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, List, Tuple, Any + from optparse import Values + from pip._internal.cache import WheelCache + from pip._internal.req.req_set import RequirementSet + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None # type: Optional[str] + usage = None # type: Optional[str] + ignore_require_venv = False # type: bool + + def __init__(self, isolated=False): + # type: (bool) -> None + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), self.name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': self.name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + def run(self, options, args): + # type: (Values, List[Any]) -> Any + raise NotImplementedError + + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession + session = PipSession( + cache=( + normalize_path(os.path.join(options.cache_dir, "http")) + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + insecure_hosts=options.trusted_hosts, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + def parse_args(self, args): + # type: (List[str]) -> Tuple + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + # type: (List[str]) -> int + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + if sys.version_info[:2] == (3, 4): + deprecated( + "Python 3.4 support has been deprecated. pip 19.1 will be the " + "last one supporting it. Please upgrade your Python as Python " + "3.4 won't be maintained after March 2019 (cf PEP 429).", + replacement=None, + gone_in='19.2', + ) + elif sys.version_info[:2] == (2, 7): + message = ( + "A future version of pip will drop support for Python 2.7." + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 will reach the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "won't be maintained after that date. " + ) + message + deprecated(message, replacement=None, gone_in=None) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('%s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to stderr + # because stdout no longer works. + print('ERROR: Pipe to stdout was broken', file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BaseException: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + allow_version_check = ( + # Does this command have the index_group options? + hasattr(options, "no_index") and + # Is this command allowed to perform this check? + not (options.disable_pip_version_check or options.no_index) + ) + # Check if we're using the latest version of pip available + if allow_version_check: + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_version_check(session, options) + + # Shutdown the logging module + logging.shutdown() + + return SUCCESS + + +class RequirementCommand(Command): + + @staticmethod + def populate_requirement_set(requirement_set, # type: RequirementSet + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + name, # type: str + wheel_cache # type: Optional[WheelCache] + ): + # type: (...) -> None + """ + Marshal cmd line args into a requirement set. + """ + # NOTE: As a side-effect, options.require_hashes and + # requirement_set.require_hashes may be updated + + for filename in options.constraints: + for req_to_add in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in args: + req_to_add = install_req_from_line( + req, None, isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in options.editables: + req_to_add = install_req_from_editable( + req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for filename in options.requirements: + for req_to_add in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache, + use_pep517=options.use_pep517): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + # If --require-hashes was a line in a requirements file, tell + # RequirementSet about it: + requirement_set.require_hashes = options.require_hashes + + if not (args or options.editables or options.requirements): + opts = {'name': name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(see "pip help %(name)s")' % opts) + + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + platform=None, # type: Optional[str] + python_versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None # type: Optional[str] + ): + # type: (...) -> PackageFinder + """ + Create a package finder appropriate to this requirement command. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug( + 'Ignoring indexes: %s', + ','.join(redact_password_from_url(url) for url in index_urls), + ) + index_urls = [] + + return PackageFinder( + find_links=options.find_links, + format_control=options.format_control, + index_urls=index_urls, + trusted_hosts=options.trusted_hosts, + allow_all_prereleases=options.pre, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + prefer_binary=options.prefer_binary, + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..a09e38f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,809 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. + +""" +from __future__ import absolute_import + +import textwrap +import warnings +from distutils.util import strtobool +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup + +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import BAR_TYPES + +if MYPY_CHECK_RUNNING: + from typing import Any, Callable, Dict, Optional + from optparse import OptionParser, Values + from pip._internal.cli.parser import ConfigOptionParser + + +def raise_option_error(parser, option, msg): + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, msg) + msg = textwrap.fill(' '.join(msg.split())) + parser.error(msg) + + +def make_option_group(group, parser): + # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def check_install_build_global(options, check_options=None): + # type: (Values, Optional[Values]) -> None + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + control.disallow_binaries() + warnings.warn( + 'Disabling all use of wheels due to the use of --build-options ' + '/ --global-options / --install-options.', stacklevel=2, + ) + + +def check_dist_restriction(options, check_target=False): + # type: (Values, bool) -> None + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + + binary_only = FormatControl(set(), {':all:'}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # guaranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Callable[..., Option] + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) # type: Callable[..., Option] + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) # type: Callable[..., Option] + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) # type: Callable[..., Option] + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Callable[..., Option] + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=( + 'Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).' + ), +) # type: Callable[..., Option] + +progress_bar = partial( + Option, + '--progress-bar', + dest='progress_bar', + type='choice', + choices=list(BAR_TYPES.keys()), + default='on', + help=( + 'Specify type of progress to be displayed [' + + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' + ), +) # type: Callable[..., Option] + +log = partial( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + help="Path to a verbose appending log." +) # type: Callable[..., Option] + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Callable[..., Option] + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Callable[..., Option] + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Callable[..., Option] + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def exists_action(): + # type: () -> Option + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", + ) + + +cert = partial( + Option, + '--cert', + dest='cert', + type='str', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Callable[..., Option] + +client_cert = partial( + Option, + '--client-cert', + dest='client_cert', + type='str', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) # type: Callable[..., Option] + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) # type: Callable[..., Option] + + +def extra_index_url(): + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).', +) # type: Callable[..., Option] + + +def find_links(): + # type: () -> Option + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to " + "archives. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.", + ) + + +def trusted_host(): + # type: () -> Option + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host as trusted, even though it does not have valid " + "or any HTTPS.", + ) + + +def constraints(): + # type: () -> Option + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.' + ) + + +def requirements(): + # type: () -> Option + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.' + ) + + +def editable(): + # type: () -> Option + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + + +src = partial( + Option, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + metavar='dir', + default=src_prefix, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".' +) # type: Callable[..., Option] + + +def _get_format_control(values, option): + # type: (Values, Option) -> Any + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=format_control, + help="Do not use binary packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all binary packages, :none: to empty the set, or one or " + "more package names with commas between them. Note that some " + "packages are tricky to compile and may fail to install when " + "this option is used on them.", + ) + + +def only_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=format_control, + help="Do not use source packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all source packages, :none: to empty the set, or one or " + "more package names with commas between them. Packages without " + "binary distributions will fail to install when this option is " + "used on them.", + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) # type: Callable[..., Option] + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only use wheels compatible with Python " + "interpreter version . If not specified, then the " + "current system interpreter minor version is used. A major " + "version (e.g. '2') can be specified to match all " + "minor revs of that major version. A minor version " + "(e.g. '34') can also be specified."), +) # type: Callable[..., Option] + + +implementation = partial( + Option, + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only use wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), +) # type: Callable[..., Option] + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only use wheels compatible with Python " + "abi , e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), +) # type: Callable[..., Option] + + +def prefer_binary(): + # type: () -> Option + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages." + ) + + +cache_dir = partial( + Option, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + help="Store the cache data in ." +) # type: Callable[..., Option] + + +def no_cache_dir_callback(option, opt, value, parser): + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=no_cache_dir_callback, + help="Disable the cache.", +) # type: Callable[..., Option] + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Callable[..., Option] + +build_dir = partial( + Option, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + metavar='dir', + help='Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # type: Callable[..., Option] + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Callable[..., Option] + +no_build_isolation = partial( + Option, + '--no-build-isolation', + dest='build_isolation', + action='store_false', + default=True, + help='Disable isolation when building a modern source distribution. ' + 'Build dependencies specified by PEP 518 must be already installed ' + 'if this option is used.' +) # type: Callable[..., Option] + + +def no_use_pep517_callback(option, opt, value, parser): + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517 = partial( + Option, + '--use-pep517', + dest='use_pep517', + action='store_true', + default=None, + help='Use PEP 517 for building source distributions ' + '(use --no-use-pep517 to force legacy behaviour).' +) # type: Any + +no_use_pep517 = partial( + Option, + '--no-use-pep517', + dest='use_pep517', + action='callback', + callback=no_use_pep517_callback, + default=None, + help=SUPPRESS_HELP +) # type: Any + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) # type: Callable[..., Option] + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.", +) # type: Callable[..., Option] + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Callable[..., Option] + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Callable[..., Option] + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) # type: Callable[..., Option] + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def _merge_hash(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...', +) # type: Callable[..., Option] + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.', +) # type: Callable[..., Option] + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + ] +} # type: Dict[str, Any] + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + ] +} # type: Dict[str, Any] diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..767f35d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/main_parser.py @@ -0,0 +1,104 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import ( + commands_dict, get_similar_commands, get_summaries, +) +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_prog +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, List + + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + # type: () -> ConfigOptionParser + """Creates and returns the main parser for pip's CLI + """ + + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + pip_pkg_dir = os.path.abspath(os.path.join( + os.path.dirname(__file__), "..", "..", + )) + parser.version = 'pip %s from %s (python %s)' % ( + __version__, pip_pkg_dir, sys.version[:3], + ) + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + # so the help formatter knows + parser.main = True # type: ignore + + # create command listing for description + command_summaries = get_summaries() + description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] + parser.description = '\n'.join(description) + + return parser + + +def parse_command(args): + # type: (List[str]) -> Tuple[str, List[str]] + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) # type: ignore + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py new file mode 100644 index 0000000..e1eaac4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/parser.py @@ -0,0 +1,261 @@ +"""Base option parser setup""" +from __future__ import absolute_import + +import logging +import optparse +import sys +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types + +from pip._internal.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.compat import get_terminal_size + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option, ' <%s>', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items = {name: [] for name in override_order} + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option('--' + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(UNKNOWN_ERROR, str(err)) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(UNKNOWN_ERROR, "%s\n" % msg) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/cli/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..2e90db3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,79 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip._internal.commands.completion import CompletionCommand +from pip._internal.commands.configuration import ConfigurationCommand +from pip._internal.commands.download import DownloadCommand +from pip._internal.commands.freeze import FreezeCommand +from pip._internal.commands.hash import HashCommand +from pip._internal.commands.help import HelpCommand +from pip._internal.commands.list import ListCommand +from pip._internal.commands.check import CheckCommand +from pip._internal.commands.search import SearchCommand +from pip._internal.commands.show import ShowCommand +from pip._internal.commands.install import InstallCommand +from pip._internal.commands.uninstall import UninstallCommand +from pip._internal.commands.wheel import WheelCommand + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Type + from pip._internal.cli.base_command import Command + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + ConfigurationCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] # type: List[Type[Command]] + +commands_dict = {c.name: c for c in commands_order} + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e4af7a5b1b4b5d049208e4c43da571b69afebb3 GIT binary patch literal 2509 zcmaJ@OK;mo5Z)!JM`VeX9mTQbN0e6^6}6N;(k4X^6m{YxXe$J@lQcvFg66Jl+PkE( zr0m#`PchJ5dg>prk3IDd^oJC@_LRSnOFOfcWG9G1VwbbCvyb`qn^}HWDisJke|y#E zf8`1J7aN181j4sa;!BheMjXN@GX#}}V^EY$VM@!fv}}ot%sN>uXGBisoxGN_;*2af z1uf^qm@GO)E$2l^+K#Q|Gh$qpowAk-VnR+jlUg1VXJy5yXt^lP$th<_%O!DMPCL_D zw#AIBI#n%?i&;76%xSqS=H-I3KnY(^|G-`+#06P%YVx9UQTI=ZOY*XF8TzMro>zH+ zm-!T*ESCI(auS~{V2@)>jG&h*aN^`n{vo!BZ zrhC;naA!D?>kBWAPYy**>)v&qxW|(OJYGZ)bXGDgS~T*8P1PmP4beiRhFtgx8agi# zN%tuQfzQ2k2U6rniC?;8mML5~PH zZT@b6vsP<}A9@D4o}9&jIOVSW8##mlh|dvl$O7hV6%?d>d>IV?8S+0&Vzyr6;Me~_ z1tFFRLdIXFg(sfq@_R}}3IH>~fB0lH6OMh=hnxX@JA8m^;^KrF)TXwvH~%*08n;E{ zdm_Hm(DrqzkPom}_L$CU9-C&G1A-wbRRh|pi4}%A*lPtYsj5)jhY}-O2rcHcrd6k_ z^?I6fT^9MSn-*NR-A%fRyRJfP(~A(=jbT_f2Iq!CKQ}AHJiRi~?o_%~xORGBgemK1 zaFs!;`4LuaozztpZDvQQ@N;$Tan{P(vM2It7l#`?}s zV;@>5hHFG2yVHdc3-!~j!hetyug~`#NOy4AC>za2ZF&dqA2p69)wgHrCV_|>$!-Vk zX;nspY`-x94K<0HcXud)#+nD&pic{hQKT^ZbolE`rQ=j{?NqGmi%3U8{x{JDF^ zSz9xw^@kqI%Z57+S9K*X6G2uj|K$pytnrnoPUU!vV#w z(ZqTWanSJuOZ%wI^QfQ`O@0{9S$sySC_am3j0jfC&tlG^n(f+1!poebg{Y$}V>DKQ zu9pVj6^M8MilGow6lxTQI@Lmh>Y)kPx}p=>)B+;59381!w=6c#eq=mN*4|BgZ%apb z^JvAqxXi1lPNy03D63dOSrMm9_|ojjZ|=BWzaCb+oOwT$Rh^cFIE{56q}CWjrTGX% z`~j*)7wC=F>77yIR=>c2&CWW1*_z*?(}T`#_14})3$1g`AGD^zV87c9YW9a9-N@%CnxCqu(jaS*Z=W;)LL8b`)~Bl?S|c`j{)%^#;A4M;iUyJIK&7~ zP-}``TMNYCzft2g>d%^&Se058@Obm+q440t*|JGFQ~0s>cAmy_FBM)<*8k?v=NMkP z*}rm_M>kG6E9%~F+SJ~2Moaakl; z8rNzwf*%(wu1OK)j63Q|_ofHd(gEE6B!>!JlhGkRza#!J9RGV6R6JclKL@Lb2T7Sx zU>xK;m@Wu;E}j<8R`ehy)#}S9b@F_+;Mo_+(-$v-AA%~a_O~s$e_j=Dzls+dW$Xop zp=P{@vH-eM&5{WEX7sDI)Ok~U1b2(iK_Tqok>-N_02^4tcXWksZ}A8l+UC~oH2C0r zJaME$`iBuBT|)AbHW>pvB4pV_naT$2Y(i)m12B|9nvH-NmbPes5nuB?xV=xpj=HOC z@K1w=AVN)r15^x6NpGLH(pI%p*}o63^>1G4$64x6Bf-e_$y|;8{|}WF<1nl+fPSBl wzEAp&k%Jklzwg_G-vduRP)c#x;iqcG6-nv5yn6LFswagiy`zorEyLCS0p-GW9smFU literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..381f6f1bab0c40c812815322ba51026166dac48d GIT binary patch literal 3083 zcmai0UvnF`5y$-{MNxL_wo2kQ9aL3jc$qoMYLX`DSf1L7+Hsp&8cCfdOf)yA14tcx zygLJ+WM8N!c_vToOy2V#Kju5+li;;a`3ipOE=Y=!CAr5r++u-UEPnXy5)T&^8U&u7 z;yZg!=Lz{QcBYRD!k^)lUqZtOvobQUI+lg9o!K4Re4UO1Ung@1UdJb|AMf2?wvTD2D5ia(EJ&^lfcq9<9%6VL&c+XP!>Wx23>8v z7!2Z^fmrWx6_ujsRex*zo|b7z-*3qSo@IfgNiirhuF@i>QpG~SNFvfw1@a9udCnT~ zTNWV=I(Z`S8qIvQg0qot&m^3>zWI->?TxK3zFKS1<(BD2|JvOCd}nQG`CA+u_rCsM z?|6xRbHQ}F)Z}X>ucPhS@=SiS&DNu>=)pgCHzPFoVqZIv#s(tyswJw97=vKvmr zf->HXhnb?`U+8N)1t<~OKpMOF;dxNH!#pv_zHW0KldMSMj2;z&!C~O%EC5Ocj~NXg zB;(;r14({`MVURn0$bxBP`wt^8H8)gt=8CY2+#!AA$ld2<7HO&-T-N$G8+E<|G;>3 zHH=X=l?PLraYXeTCX`AJCzL%q$12)_Q^YLD(i{&mpi4{Fn;16H))hM*#OeTjBK2$VAm zN}1hpnbYx@+ws36U5k0le^Kw$u!y}No%(mgC7n4aTXXu>`dQTh3D2kc@BxL2RC0k8 z2{lv|bf43qD*C|GUXn02b~l7lyy?k2!6^I)m2!+R56nL(q7vPR^@?%N}4 zWdFyq$cXfvV`t>_U1l+xIn2eqvD&|V7(*=-Y0x%6JAY2wWDB6Z0ot1rE$MrwK6`8A zytJ|00~WU)SAG~G-jyBh>v^dP!GYnqRKkN`v}X!+_1?w+2r%0&h>ROt&^BNnT=!f6l=o;ghKiW*M8ercR15XYbfaSq||1R|;H zQIzJXiXvT41}rK{C3PcaMuKzGei;kNh5iNP5*G?5fI8}lVpzgfT*B7ujm}Id+hB zFNm^7&WZIoIkAr2k<|x2KJmqu%02a9o{t&^ykf4ZosiU8BrmOFPu11j$TMT!5B4J1 zS|ndojsE;;6B&HEFmhj-xxmLd=4KUcLB&y$ssnzBZ$;Ord+8yE>jK^&&eF(+crlfB zF!*0W(}T3xYaT;+7+G(V@9n29xVL~-p|}IXfvxTKT>%#-V*2Ce*U){{xR<3;A@28$ zH+1cjD!2@x80PJJ<_}cf2VrWZiFVDOvaS8`ZN{uqy|b~sy}A7-`c*NcgP~Nk1Uk|8 zWutN_RG7!X4SjoZGkCQ5INDj?ezdi_qunR`xdcyevEs~l(sjk3sUs1W+Gm{cTxkdH zSONji9xxLWHy=LO*_d85z@2ua@uGmKLVHIdRb0FMBFzI|ETUm;oCi|8jXmGsEA@i; zPI5#F3S+MUrX9dx3-l5*h1hlLw$%V4Hmw`ZqU~GNudYNcXken|@qk03Hlk=yuwjOB zGm4%L<7_fgiy~GepmtHAYjOzm70)4gdpXuB!JiIO_yQ#kO?rsC5QJWsWNQK>iK1D= zfhFFBae*goss+xLO=!m10~usD@0gKb9>eMm)eziA0%;%uY?h(XzlEG_pXF;i$zo0&2>{parqy)a Jc^iIp_kX;yHOBw| literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2242fdc7eab0c80663f760cd9c2f52cee14ca60e GIT binary patch literal 6911 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 HZd>^;K}>W^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f51707144e424d1063ecea565c6a75f61cdf058e GIT binary patch literal 2879 zcmb7GTaV*J7WOrEoTR&_=LW+9-plL~sht1|VnAqxb_NjI)qoaeXO-2+a=R*t)8)%l zmHT3)pL!&ohKKzHJ&*erV1J2UdEzhd#8-CGot}NdQB_WzQ$BSr-#O*K4hEiv=YP?i zCqMKx?MJm(KNg5jFhqfgXhdgPs!w!X(FQXn2L4TErq;x2cowtM&ZN`OHgi&U;x=@L zbyIKRHMGNeX@AlO?UF9>NN;XU2A^xBPX^C4GN7F^bFxK@ueIUUPdHT@>h*TCFLG8& z8YXFxbNLWF@9~^cc0Y>e6f5U`o~BVoKn_03c^b+4c_w+z!01dlrIp&%6OyoGKP(Pr zqBe`9s69btS;#zRqV`B4Bv1BnPHi74?Xfz4{g^94+yg?tr%%g-)0AdX_|wL_k=ML-u`A-#XD}ac;)TeMBS8abqnSu#a!7rFutAt}Liwn9 zmv`Vtb*rI$|8Bwang8#+kV&42C)GQ@+M=OR?a*WS(ReIQ#0Zh5oc}*3)>mOv;p}2; zV~FoDNlofY?aWvhOMPj42aqkbg}JbZP7GoaYo-xfh4r~}A!z}mBt5`qQ!*f1WSi`e zYh;&Pe-1#dblo5~8}2P|?F;U0@(Q@Gk~`x%0QBme-;mcKedB`XoV(;r zC3|5gKqIOC!^#MFH3))@RMq{Bg{V7GQP7Ok)-++XI(;OlFXyyPh{~B-%#f*<(~aFe zfbA#9eGHH{AOJcue?~LPBbj6~KX2eO^1qoU!f$g32xR^~^-F=YrzMj~0ZlSVsTd9I z+9Fg)7!|90*AAi62zzQLr7}8IcCz$w;Ofg=&+^DNB{VH^)V&| zN?!?-Eo)5f`A734p8H1$W6F?-5LhDf*6r3{9Kb3k2v{CRthU=fPsp6pQ1X&~Rz3P+ z+9LWe;j)Yv%?_a;lKwmr{*2}O5%Z%srb6ubB=@siu7a@=vJ+JXFBR2jXz?9Dj$c#L zu9|LOsyab{aKU*sS9@P(>}0KN?G=n!YeUl1z5o?QN0l7}s9eOSsqPSTwfCSkNE{@E z@){}MP_q$-kNmr$GWPtTxnWjg(QXjX$+1!Tt(=*>MdNZwuLjEm&MSmEkW6|wjz%HY8)J)<#xj`W|0tK_+Ra3J}!827)d$? z#KzN{p+|^u%E$YQFuW(;&ptRL@5Nzp`0m?sdT+Mi?49ZRAAUIgW{h6F&SP*~WJiCF z7nNc*11?C)vxtpVfuLB#xXr?-IN`6u%{v(4Atp`VH9ESb8>^pdURiC(T+kQ0^h|xx;5dXoXdfZtv&Wux2qSGzRr3u=Sy0p&pQyUyxyt}l| zJJNZ99w=RKx)>ft52KGUz}Q+^OSOBO=+C>So$9UQ-^rb+w(NYTKhU1sICbQ;#qRm_ zr9+I{n$q-i{#bjAezmmDZ@kcS?O$#0G9LmGy^U7IZ^F>pYicpfQ37>W!Mr6sh2@ab z89lDu1eY?BN$Os6TZXZ^jDZ1c;jbwrx;MPZZAF>5XSoVX-EDS-B;nk_nycK@ow6X% z#DA+67D-~s2TG_+;kVWFs*>DZoql;8u1p!MO$pN+m{Nx~*Bj0~LF>h3gbs;IougE1 zCuTItfLE9QL1}eXmma^XR$J`_8^-PT10O40Z!5`QRoVwf4ZbZjLCW7!;$|AEJti-+ zFF=StV$$?2y|24KjAs}?-Q`aq%QFpqM}Nhru3beDGz@#HFtaG7C`>O@PL)j2{V;rr zCb*I~VMy{AY)dg}yA=3hs2x$F2>40eWBDw^7Y&V4(UbxI1UA)!RYk^>u`s-JV5svy zLC%#QO>@`+A=KpBu-s^@H~Qm7Hr!TrO-os#Q-|D8@2Kyh`Z|hobWxC_CfRM`-*`#F zlF>fCQV{5-X1V&-tbc!XlgcI&qnA?BAnMJlJ9D%&+=cjd8MSF@^MB{+u2LpYhZBoP kw(wJkYdpFP#6~*ZkK54yMYT?$u8h9n8hvE7`5Arl7wvsSp#T5? literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ef1acf92f9ebd832e1790d408904f6d51f7f34c GIT binary patch literal 2073 zcmZuyTW=gS6t+FLy(XcpsuFI~OMsQSyU{mLVudY zakF9aC3N{S3=A=xpcDrfn>k5HK&r15Sk>1KZ1`Gp> z?J<|!kHX9!aKDtC`FpV%``vDJJnGQ%_S5=1jY6Ki5K%m}j-fT#dO<{o;=Il^aw`d_@trgm6oHDh~3 zj8Fi|`o@%W!)deI4U1vU0IWHzCr1VfK<%cVXWaO|Ca2`G-*L3f zxK!GU#(5lZsogL#@oSIqVOS;#(BVlTOl-iTBg=vdQG=DPQ5t8lqEy$Slu^J<>PE<_ z8N47MgOG5Hr9H{xOuI!WBp3QL;Ln9J7r=~;L|zshOWTqsLv4p*BsF=m2db=78YQ8W zl>UzXF8YOtcSFVdyP@b0^Mr9B`>E&;CX`;6*Rs!d*=G?gcCUP*hSx_Ek$gJ5cH>5W zyI;gbcR_jgX_4(+jV4pGS#=0Oagl{dKbohF>>G}I#WQgVTz?n3JOcy5r?87{Oiq3) zczR|XOc$!|9itH$`b{&T*P-8qF7LrGBl0Yei4L(MKq<&T*;{CaC(ge0^umnXLyuSY zK?;W+!!vtkshSxN$dQfF&V@&F0g#R9%9^~{nCt!vn6AlAU7UsYbrT@U6fGrWkGAA9 zU{flcOBIV%%0Z&A8ahRNc@qm<AXKpOcTZK59$>^ny$gRSZLO|D9j`RX`HSv-OqoR>huLr)Vi*yy<0&I=ByXgEsZ zfwnTfCp_>>yJf*37j%8hpU!UscWZDmC)rz+PGR(?ovN_ELSqiYML4<&T~_~jqy@As z;d5A+{myAa(Xa$Jfg)i55m#W)o>5Pnjl>6L^*&@#?<9kIQ4;qCq2zRtO2TBqn~b3R zs#1a(l%7hOdiCEgl`4kvY{CWuLqkju7HL>3m;M1}1TEkI literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..618349aed865d77291f915f2c0a7b2074d02d510 GIT binary patch literal 1249 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 HS|<5FF#NM| literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63da0a90c011c540af99d346c846ef4bf8cad753 GIT binary patch literal 8740 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 AL;wH) literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py new file mode 100644 index 0000000..801cecc --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/check.py @@ -0,0 +1,41 @@ +import logging + +from pip._internal.cli.base_command import Command +from pip._internal.operations.check import ( + check_package_set, create_package_set_from_installed, +) + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + name = 'check' + usage = """ + %prog [options]""" + summary = 'Verify installed packages have compatible dependencies.' + + def run(self, options, args): + package_set, parsing_probs = create_package_set_from_installed() + missing, conflicting = check_package_set(package_set) + + for project_name in missing: + version = package_set[project_name].version + for dependency in missing[project_name]: + logger.info( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[0], + ) + + for project_name in conflicting: + version = package_set[project_name].version + for dep_name, dep_version, req in conflicting[project_name]: + logger.info( + "%s %s has requirement %s, but you have %s %s.", + project_name, version, req, dep_name, dep_version, + ) + + if missing or conflicting or parsing_probs: + return 1 + else: + logger.info("No broken requirements found.") diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py new file mode 100644 index 0000000..2fcdd39 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/completion.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import sys +import textwrap + +from pip._internal.cli.base_command import Command +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip %(shell)s completion start%(script)s# pip %(shell)s completion end +""" + +COMPLETION_SCRIPTS = { + 'bash': """ + _pip_completion() + { + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 ) ) + } + complete -o default -F _pip_completion %(prog)s + """, + 'zsh': """ + function _pip_completion { + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] ) ) + } + compctl -K _pip_completion %(prog)s + """, + 'fish': """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c %(prog)s + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + name = 'completion' + summary = 'A helper command used for command completion.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(CompletionCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + cmd_opts.add_option( + '--fish', '-f', + action='store_const', + const='fish', + dest='shell', + help='Emit completion code for fish') + + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ['--' + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, '') % { + 'prog': get_prog(), + } + ) + print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) + else: + sys.stderr.write( + 'ERROR: You must pass %s\n' % ' or '.join(shell_options) + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..950e205 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py @@ -0,0 +1,253 @@ +import logging +import os +import subprocess + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import Configuration, kinds +from pip._internal.exceptions import PipError +from pip._internal.locations import running_under_virtualenv, site_config_file +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.misc import get_prog + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """Manage local and global configuration. + + Subcommands: + + list: List the active configuration (or from the file specified) + edit: Edit the configuration file in an editor + get: Get the value associated with name + set: Set the name=value + unset: Unset the value associated with name + + If none of --user, --global and --site are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen on the to the user file by + default. + """ + + name = 'config' + usage = """ + %prog [] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + """ + + summary = "Manage local and global configuration." + + def __init__(self, *args, **kwargs): + super(ConfigurationCommand, self).__init__(*args, **kwargs) + + self.configuration = None + + self.cmd_opts.add_option( + '--editor', + dest='editor', + action='store', + default=None, + help=( + 'Editor to use to edit the file. Uses VISUAL or EDITOR ' + 'environment variables if not provided.' + ) + ) + + self.cmd_opts.add_option( + '--global', + dest='global_file', + action='store_true', + default=False, + help='Use the system-wide configuration file only' + ) + + self.cmd_opts.add_option( + '--user', + dest='user_file', + action='store_true', + default=False, + help='Use the user configuration file only' + ) + + self.cmd_opts.add_option( + '--site', + dest='site_file', + action='store_true', + default=False, + help='Use the current environment configuration file only' + ) + + self.cmd_opts.add_option( + '--venv', + dest='venv_file', + action='store_true', + default=False, + help=( + '[Deprecated] Use the current environment configuration ' + 'file in a virtual environment only' + ) + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name + } + + # Determine action + if not args or args[0] not in handlers: + logger.error("Need an action ({}) to perform.".format( + ", ".join(sorted(handlers))) + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options, need_value): + # Convert legacy venv_file option to site_file or error + if options.venv_file and not options.site_file: + if running_under_virtualenv(): + options.site_file = True + deprecated( + "The --venv option has been deprecated.", + replacement="--site", + gone_in="19.3", + ) + else: + raise PipError( + "Legacy --venv option requires a virtual environment. " + "Use --site instead." + ) + + file_options = [key for key, value in ( + (kinds.USER, options.user_file), + (kinds.GLOBAL, options.global_file), + (kinds.SITE, options.site_file), + ) if value] + + if not file_options: + if not need_value: + return None + # Default to user, unless there's a site file. + elif os.path.exists(site_config_file): + return kinds.SITE + else: + return kinds.USER + elif len(file_options) == 1: + return file_options[0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --site, --global) to perform." + ) + + def list_values(self, options, args): + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + logger.info("%s=%r", key, value) + + def get_name(self, options, args): + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + logger.info("%s", value) + + def set_name_value(self, options, args): + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options, args): + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def open_in_editor(self, options, args): + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}" + .format(e.returncode) + ) + + def _get_n_args(self, args, example, n): + """Helper to make sure the command got the right number of arguments + """ + if len(args) != n: + msg = ( + 'Got unexpected number of arguments, expected {}. ' + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self): + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.error( + "Unable to save configuration. Please report this as a bug.", + exc_info=1 + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py new file mode 100644 index 0000000..a57e4bc --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,176 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + name = 'download' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + summary = 'Download packages.' + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into ."), + ) + + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + cmdoptions.check_dist_restriction(options) + + options.src_dir = os.path.abspath(options.src_dir) + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="download" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + self.name, + None + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=options.download_dir, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=None, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=False, + ignore_installed=True, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + logger.info('Successfully downloaded %s', downloaded) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..dc9c53a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli.base_command import Command +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + name = 'freeze' + usage = """ + %prog [options]""" + summary = 'Output installed packages in requirements format.' + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + try: + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + finally: + wheel_cache.cleanup() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 0000000..423440e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + + """ + name = 'hash' + usage = '%prog [options] ...' + summary = 'Compute hashes of package archives.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(HashCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-a', '--algorithm', + dest='algorithm', + choices=STRONG_HASHES, + action='store', + default=FAVORITE_HASH, + help='The hash algorithm to use: one of %s' % + ', '.join(STRONG_HASHES)) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + logger.info('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + + +def _hash_of_file(path, algorithm): + """Return the hash digest of a file.""" + with open(path, 'rb') as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py new file mode 100644 index 0000000..49a81cb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + name = 'help' + usage = """ + %prog """ + summary = 'Show help for commands.' + ignore_require_venv = True + + def run(self, options, args): + from pip._internal.commands import commands_dict, get_similar_commands + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = commands_dict[cmd_name]() + command.parser.print_help() + + return SUCCESS diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py new file mode 100644 index 0000000..c13da44 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,587 @@ +from __future__ import absolute_import + +import errno +import logging +import operator +import os +import shutil +from optparse import SUPPRESS_HELP + +from pip._vendor import pkg_resources + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.cli.status_codes import ERROR +from pip._internal.exceptions import ( + CommandError, InstallationError, PreviousBuildDirError, +) +from pip._internal.locations import distutils_scheme, virtualenv_no_global +from pip._internal.operations.check import check_install_conflicts +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet, install_given_reqs +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ( + ensure_dir, get_installed_version, + protect_pip_from_modification_on_windows, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +logger = logging.getLogger(__name__) + + +def is_wheel_installed(): + """ + Return whether the wheel package is installed. + """ + try: + import wheel # noqa: F401 + except ImportError: + return False + + return True + + +def build_wheels(builder, pep517_requirements, legacy_requirements, session): + """ + Build wheels for requirements, depending on whether wheel is installed. + """ + # We don't build wheels for legacy requirements if wheel is not installed. + should_build_legacy = is_wheel_installed() + + # Always build PEP 517 requirements + build_failures = builder.build( + pep517_requirements, + session=session, autobuilding=True + ) + + if should_build_legacy: + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + builder.build( + legacy_requirements, + session=session, autobuilding=True + ) + + return build_failures + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + name = 'install' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Install packages.' + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.pre()) + + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into . ' + 'By default this will not replace existing files/folders in ' + '. Use --upgrade to replace existing packages in ' + 'with new versions.' + ) + cmd_opts.add_option(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)") + cmd_opts.add_option( + '--no-user', + dest='use_user_site', + action='store_false', + help=SUPPRESS_HELP) + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option(cmdoptions.src()) + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='only-if-needed', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled ' + '[default: %default]. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages (reinstalling instead).') + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + cmdoptions.check_dist_restriction(options, check_target=True) + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + options.src_dir = os.path.abspath(options.src_dir) + install_options = options.install_options or [] + if options.use_user_site: + if options.prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + install_options.append('--user') + install_options.append('--prefix=') + + target_temp_dir = TempDirectory(kind="target") + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + + # Create a target directory for using with the target option + target_temp_dir.create() + install_options.append('--home=' + target_temp_dir.path) + + global_options = options.global_options or [] + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + check_supported_wheels=not options.target_dir, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + upgrade_strategy=upgrade_strategy, + force_reinstall=options.force_reinstall, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=options.ignore_installed, + isolated=options.isolated_mode, + use_pep517=options.use_pep517 + ) + resolver.resolve(requirement_set) + + protect_pip_from_modification_on_windows( + modifying_pip=requirement_set.has_requirement("pip") + ) + + # Consider legacy and PEP517-using requirements separately + legacy_requirements = [] + pep517_requirements = [] + for req in requirement_set.requirements.values(): + if req.use_pep517: + pep517_requirements.append(req) + else: + legacy_requirements.append(req) + + wheel_builder = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + + build_failures = build_wheels( + builder=wheel_builder, + pep517_requirements=pep517_requirements, + legacy_requirements=legacy_requirements, + session=session, + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + if build_failures: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(r.name for r in build_failures))) + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Consistency Checking of the package set we're installing. + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + self._warn_about_conflicts(to_install) + + # Don't warn about script install locations if + # --target has been specified + warn_script_location = options.warn_script_location + if options.target_dir: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir.path, + prefix=options.prefix_path, + pycompile=options.compile, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + ) + + lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir.path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + reqs = sorted(installed, key=operator.attrgetter('name')) + items = [] + for req in reqs: + item = req.name + try: + installed_version = get_installed_version( + req.name, working_set=working_set + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed = ' '.join(items) + if installed: + logger.info('Successfully installed %s', installed) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() + + if options.target_dir: + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + return requirement_set + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + with target_temp_dir: + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_scheme('', home=target_temp_dir.path) + purelib_dir = scheme['purelib'] + platlib_dir = scheme['platlib'] + data_dir = scheme['data'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. Pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + + def _warn_about_conflicts(self, to_install): + try: + package_set, _dep_info = check_install_conflicts(to_install) + except Exception: + logger.error("Error checking for conflicts.", exc_info=True) + return + missing, conflicting = _dep_info + + # NOTE: There is some duplication here from pip check + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + logger.critical( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[1], + ) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + logger.critical( + "%s %s has requirement %s, but you'll have %s %s which is " + "incompatible.", + project_name, version, req, dep_name, dep_version, + ) + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] + + +def create_env_error_message(error, show_traceback, using_user_site): + """Format an error message for an EnvironmentError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an EnvironmentError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not using_user_site: + parts.extend([ + user_option_part, " or ", + permissions_part.lower(), + ]) + else: + parts.append(permissions_part) + parts.append(".\n") + + return "".join(parts).strip() + "\n" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py new file mode 100644 index 0000000..d70782d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,302 @@ +from __future__ import absolute_import + +import json +import logging + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import CommandError +from pip._internal.index import PackageFinder +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.packaging import get_installer + +logger = logging.getLogger(__name__) + + +class ListCommand(Command): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + name = 'list' + usage = """ + %prog [options]""" + summary = 'List installed packages.' + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + default="columns", + choices=('columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "or json", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, self.parser + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, index_urls, session): + """ + Create a package finder appropriate to this list command. + """ + return PackageFinder( + find_links=options.find_links, + index_urls=index_urls, + allow_all_prereleases=options.pre, + trusted_hosts=options.trusted_hosts, + session=session, + ) + + def run(self, options, args): + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + ) + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return {pkg for pkg in packages if pkg.key not in dep_keys} + + def iter_packages_latest_infos(self, packages, options): + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + + for dist in packages: + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + evaluator = finder.candidate_evaluator + best_candidate = evaluator.get_best_candidate(all_candidates) + if best_candidate is None: + continue + + remote_version = best_candidate.version + if best_candidate.location.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist + + def output_package_listing(self, packages, options): + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + if options.verbose >= 1: + logger.info("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + logger.info("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + logger.info(format_for_json(packages, options)) + + def output_package_listing_columns(self, data, header): + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + logger.info(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if options.verbose >= 1 or dist_is_editable(proj): + row.append(proj.location) + if options.verbose >= 1: + row.append(get_installer(proj)) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py new file mode 100644 index 0000000..c157a31 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,135 @@ +from __future__ import absolute_import + +import logging +import sys +import textwrap +from collections import OrderedDict + +from pip._vendor import pkg_resources +from pip._vendor.packaging.version import parse as parse_version +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS +from pip._internal.download import PipXmlrpcTransport +from pip._internal.exceptions import CommandError +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import get_terminal_size +from pip._internal.utils.logging import indent_log + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command): + """Search for PyPI packages whose name or summary contains .""" + name = 'search' + usage = """ + %prog [options] """ + summary = 'Search PyPI for packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + index_url = options.index + with self._build_session(options) as session: + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + latest = highest_version(hit.get('versions', ['-'])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, latest), summary) + try: + logger.info(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + if dist.version == latest: + logger.info('INSTALLED: %s (latest)', dist.version) + else: + logger.info('INSTALLED: %s', dist.version) + logger.info('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py new file mode 100644 index 0000000..a18a902 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,168 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + name = 'show' + usage = """ + %prog [options] ...""" + summary = 'Show information about installed packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + } + file_list = None + metadata = None + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [l.split(',')[0] for l in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + logger.info("---") + + name = dist.get('name', '') + required_by = [ + pkg.project_name for pkg in pkg_resources.working_set + if name in [required.name for required in pkg.requires()] + ] + + logger.info("Name: %s", name) + logger.info("Version: %s", dist.get('version', '')) + logger.info("Summary: %s", dist.get('summary', '')) + logger.info("Home-page: %s", dist.get('home-page', '')) + logger.info("Author: %s", dist.get('author', '')) + logger.info("Author-email: %s", dist.get('author-email', '')) + logger.info("License: %s", dist.get('license', '')) + logger.info("Location: %s", dist.get('location', '')) + logger.info("Requires: %s", ', '.join(dist.get('requires', []))) + logger.info("Required-by: %s", ', '.join(required_by)) + + if verbose: + logger.info("Metadata-Version: %s", + dist.get('metadata-version', '')) + logger.info("Installer: %s", dist.get('installer', '')) + logger.info("Classifiers:") + for classifier in dist.get('classifiers', []): + logger.info(" %s", classifier) + logger.info("Entry-points:") + for entry in dist.get('entry_points', []): + logger.info(" %s", entry.strip()) + if list_files: + logger.info("Files:") + for line in dist.get('files', []): + logger.info(" %s", line.strip()) + if "files" not in dist: + logger.info("Cannot locate installed-files.txt") + return results_printed diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..0cd6f54 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import install_req_from_line +from pip._internal.utils.misc import protect_pip_from_modification_on_windows + + +class UninstallCommand(Command): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + name = 'uninstall' + usage = """ + %prog [options] ... + %prog [options] -r ...""" + summary = 'Uninstall packages.' + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + with self._build_session(options) as session: + reqs_to_uninstall = {} + for name in args: + req = install_req_from_line( + name, isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + for filename in options.requirements: + for req in parse_requirements( + filename, + options=options, + session=session): + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=self.name) + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..cd72a3d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + name = 'wheel' + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Build wheels from your requirements.' + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into , where the default is the " + "current working directory."), + ) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.prefer_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + with RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="wheel" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=options.wheel_dir, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + req_tracker=req_tracker, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=True, + isolated=options.isolated_mode, + use_pep517=options.use_pep517 + ) + resolver.resolve(requirement_set) + + # build wheels + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + no_clean=options.no_clean, + ) + build_failures = wb.build( + requirement_set.requirements.values(), session=session, + ) + if len(build_failures) != 0: + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/configuration.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/configuration.py new file mode 100644 index 0000000..b199fa7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/configuration.py @@ -0,0 +1,384 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import locale +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ( + ConfigurationError, ConfigurationFileCouldNotBeLoaded, +) +from pip._internal.locations import ( + global_config_files, legacy_config_file, new_config_file, site_config_file, +) +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, NewType, Optional, Tuple + ) + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + SITE="site", # [Virtual] Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +class Configuration(object): + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated, load_only=None): + # type: (bool, Kind) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.SITE, None] + if load_only not in _valid_load_only: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, _valid_load_only[:-1])) + ) + ) + self.isolated = isolated # type: bool + self.load_only = load_only # type: Optional[Kind] + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.SITE, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._override_order + } # type: Dict[Kind, Dict[str, Any]] + self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] + + def load(self): + # type: () -> None + """Loads configuration from configuration files and environment + """ + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self): + # type: () -> Optional[str] + """Returns the file with highest priority in configuration + """ + assert self.load_only is not None, \ + "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self): + # type: () -> Iterable[Tuple[str, Any]] + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key): + # type: (str) -> Any + """Get a value from the configuration. + """ + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_load_only() + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key): + # type: (str) -> None + """Unset a value in the configuration. + """ + self._ensure_have_load_only() + + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Remove the key in the parser + modified_something = False + if parser.has_section(section): + # Returns whether the option was removed or not + modified_something = parser.remove_option(section, name) + + if modified_something: + # name removed from parser, section may now be empty + section_iter = iter(parser.items(section)) + try: + val = next(section_iter) + except StopIteration: + val = None + + if val is None: + parser.remove_section(section) + + self._mark_as_modified(fname, parser) + else: + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the current in-memory state. + """ + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) + + # + # Private routines + # + + def _ensure_have_load_only(self): + # type: () -> None + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self): + # type: () -> Dict[str, Any] + """A dictionary representing the loaded configuration. + """ + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in self._override_order: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self): + # type: () -> None + """Loads configuration from configuration files + """ + config_files = dict(self._iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug( + "Skipping file '%s' (variant: %s)", fname, variant + ) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant, fname): + # type: (Kind, str) -> RawConfigParser + logger.debug("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname): + # type: (str) -> RawConfigParser + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + try: + parser.read(fname) + except UnicodeDecodeError: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason="contains invalid {} characters".format( + locale.getpreferredencoding(False) + ), + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + return parser + + def _load_environment_vars(self): + # type: () -> None + """Loads configuration from environment variables + """ + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self._get_environ_vars()) + ) + + def _normalized_keys(self, section, items): + # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def _get_environ_vars(self): + # type: () -> Iterable[Tuple[str, str]] + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), val + + # XXX: This is patched in the tests. + def _iter_config_files(self): + # type: () -> Iterable[Tuple[Kind, List[str]]] + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get('PIP_CONFIG_FILE', None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + # at the base we have any global configuration + yield kinds.GLOBAL, list(global_config_files) + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, [legacy_config_file, new_config_file] + + # finally virtualenv configuration first trumping others + yield kinds.SITE, [site_config_file] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname, parser): + # type: (str, RawConfigParser) -> None + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/download.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/download.py new file mode 100644 index 0000000..2683cf0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/download.py @@ -0,0 +1,979 @@ +from __future__ import absolute_import + +import cgi +import email.utils +import getpass +import json +import logging +import mimetypes +import os +import platform +import re +import shutil +import sys + +from pip._vendor import requests, six, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.lockfile import LockError +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.requests.utils import get_netrc_auth +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.urllib3.util import IS_PYOPENSSL + +import pip +from pip._internal.exceptions import HashMismatch, InstallationError +from pip._internal.locations import write_delete_marker_file +from pip._internal.models.index import PyPI +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, consume, display_path, + format_size, get_installed_version, rmtree, split_auth_from_netloc, + splitext, unpack_file, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import DownloadProgressProvider +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( + Optional, Tuple, Dict, IO, Text, Union + ) + from pip._internal.models.link import Link + from pip._internal.utils.hashes import Hashes + from pip._internal.vcs import AuthInfo + +try: + import ssl # noqa +except ImportError: + ssl = None + +HAS_TLS = (ssl is not None) or IS_PYOPENSSL + +__all__ = ['get_file_content', + 'is_url', 'url_to_path', 'path_to_url', + 'is_archive_file', 'unpack_vcs_link', + 'unpack_file_url', 'is_vcs_url', 'is_file_url', + 'unpack_http_url', 'unpack_url'] + + +logger = logging.getLogger(__name__) + + +# These are environment variables present when running under various +# CI systems. For each variable, some CI systems that use the variable +# are indicated. The collection was chosen so that for each of a number +# of popular systems, at least one of the environment variables is used. +# This list is used to provide some indication of and lower bound for +# CI traffic to PyPI. Thus, it is okay if the list is not comprehensive. +# For more background, see: https://github.com/pypa/pip/issues/5499 +CI_ENVIRONMENT_VARIABLES = ( + # Azure Pipelines + 'BUILD_BUILDID', + # Jenkins + 'BUILD_ID', + # AppVeyor, CircleCI, Codeship, Gitlab CI, Shippable, Travis CI + 'CI', +) + + +def looks_like_ci(): + # type: () -> bool + """ + Return whether it looks like pip is running under CI. + """ + # We don't use the method of checking for a tty (e.g. using isatty()) + # because some CI systems mimic a tty (e.g. Travis CI). Thus that + # method doesn't provide definitive information in either direction. + return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": pip.__version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if HAS_TLS: + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + # Use None rather than False so as not to give the impression that + # pip knows it is not being run under CI. Rather, it is a null or + # inconclusive result. Also, we include some value rather than no + # value to make it easier to know that the check has been run. + data["ci"] = True if looks_like_ci() else None + + user_data = os.environ.get("PIP_USER_AGENT_USER_DATA") + if user_data is not None: + data["user_data"] = user_data + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True): + # type: (bool) -> None + self.prompting = prompting + self.passwords = {} # type: Dict[str, AuthInfo] + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Split the credentials from the netloc. + netloc, url_user_password = split_auth_from_netloc(parsed.netloc) + + # Set the url of the request to the url without any credentials + req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + # Use the credentials embedded in the url if we have none stored + if username is None: + username, password = url_user_password + + # Get creds from netrc if we still don't have them + if username is None and password is None: + netrc_auth = get_netrc_auth(req.url) + username, password = netrc_auth if netrc_auth else (None, None) + + if username or password: + # Store the username and password + self.passwords[netloc] = (username, password) + + # Send the basic auth with this request + req = HTTPBasicAuth(username or "", password or "")(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + def handle_401(self, resp, **kwargs): + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username = six.moves.input("User for %s: " % parsed.netloc) + password = getpass.getpass("Password: ") + + # Store the new username and password to use for future requests + if username or password: + self.passwords[parsed.netloc] = (username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + req.register_hook("response", self.warn_on_401) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def warn_on_401(self, resp, **kwargs): + # warn user that they provided incorrect credentials + if resp.status_code == 401: + logger.warning('401 Error, Credentials not correct for %s', + resp.request.url) + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class SafeFileCache(FileCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, *args, **kwargs): + super(SafeFileCache, self).__init__(*args, **kwargs) + + # Check to ensure that the directory containing our cache directory + # is owned by the user current executing pip. If it does not exist + # we will check the parent directory until we find one that does exist. + # If it is not owned by the user executing pip then we will disable + # the cache and log a warning. + if not check_path_owner(self.directory): + logger.warning( + "The directory '%s' or its parent directory is not owned by " + "the current user and the cache has been disabled. Please " + "check the permissions and owner of that directory. If " + "executing pip with sudo, you may want sudo's -H flag.", + self.directory, + ) + + # Set our directory to None to disable the Cache + self.directory = None + + def get(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).get(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def set(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).set(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def delete(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).delete(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + +class PipSession(requests.Session): + + timeout = None # type: Optional[int] + + def __init__(self, *args, **kwargs): + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + insecure_hosts = kwargs.pop("insecure_hosts", []) + + super(PipSession, self).__init__(*args, **kwargs) + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth() + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache, use_dir_lock=True), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + # We want to use a non-validating adapter for any requests which are + # deemed insecure. + for host in insecure_hosts: + self.mount("https://{}/".format(host), insecure_adapter) + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) + + +def get_file_content(url, comes_from=None, session=None): + # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + + :param url: File path or url. + :param comes_from: Origin description of requirements. + :param session: Instance of pip.download.PipSession. + """ + if session is None: + raise TypeError( + "get_file_content() missing 1 required keyword argument: 'session'" + ) + + match = _scheme_re.search(url) + if match: + scheme = match.group(1).lower() + if (scheme == 'file' and comes_from and + comes_from.startswith('http')): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + if scheme == 'file': + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + else: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_scheme_re = re.compile(r'^(http|https|file):', re.I) +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) + + +def is_url(name): + # type: (Union[str, Text]) -> bool + """Returns true if the name looks like a URL""" + if ':' not in name: + return False + scheme = name.split(':', 1)[0].lower() + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def url_to_path(url): + # type: (str) -> str + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + if not netloc or netloc == 'localhost': + # According to RFC 8089, same as empty authority. + netloc = '' + elif sys.platform == 'win32': + # If we have a UNC path, prepend UNC share notation. + netloc = '\\\\' + netloc + else: + raise ValueError( + 'non-local file URIs are not supported on this platform: %r' + % url + ) + + path = urllib_request.url2pathname(netloc + path) + return path + + +def path_to_url(path): + # type: (Union[str, Text]) -> str + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def is_archive_file(name): + # type: (str) -> bool + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def unpack_vcs_link(link, location): + vcs_backend = _get_used_vcs_backend(link) + vcs_backend.unpack(location) + + +def _get_used_vcs_backend(link): + for backend in vcs.backends: + if link.scheme in backend.schemes: + vcs_backend = backend(link.url) + return vcs_backend + + +def is_vcs_url(link): + # type: (Link) -> bool + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + # type: (Link) -> bool + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + # type: (Link) -> bool + """Return whether a file:// Link points to a directory. + + ``link`` must not have any other scheme but file://. Call is_file_url() + first. + + """ + link_path = url_to_path(link.url_without_fragment) + return os.path.isdir(link_path) + + +def _progress_indicator(iterable, *args, **kwargs): + return iterable + + +def _download_url( + resp, # type: Response + link, # type: Link + content_file, # type: IO + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> None + try: + total_length = int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + total_length = 0 + + cached_resp = getattr(resp, "from_cache", False) + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif cached_resp: + show_progress = False + elif total_length > (40 * 1000): + show_progress = True + elif not total_length: + show_progress = True + else: + show_progress = False + + show_url = link.show_url + + def resp_read(chunk_size): + try: + # Special case for urllib3. + for chunk in resp.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = resp.raw.read(chunk_size) + if not chunk: + break + yield chunk + + def written_chunks(chunks): + for chunk in chunks: + content_file.write(chunk) + yield chunk + + progress_indicator = _progress_indicator + + if link.netloc == PyPI.netloc: + url = show_url + else: + url = link.url_without_fragment + + if show_progress: # We don't show progress on cached responses + progress_indicator = DownloadProgressProvider(progress_bar, + max=total_length) + if total_length: + logger.info("Downloading %s (%s)", url, format_size(total_length)) + else: + logger.info("Downloading %s", url) + elif cached_resp: + logger.info("Using cached %s", url) + else: + logger.info("Downloading %s", url) + + logger.debug('Downloading from URL %s', link) + + downloaded_chunks = written_chunks( + progress_indicator( + resp_read(CONTENT_CHUNK_SIZE), + CONTENT_CHUNK_SIZE + ) + ) + if hashes: + hashes.check_against_chunks(downloaded_chunks) + else: + consume(downloaded_chunks) + + +def _copy_file(filename, location, link): + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % + display_path(download_location), ('i', 'w', 'b', 'a')) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + if session is None: + raise TypeError( + "unpack_http_url() missing 1 required keyword argument: 'session'" + ) + + with TempDirectory(kind="unpack") as temp_dir: + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url(link, + session, + temp_dir.path, + hashes, + progress_bar) + + # unpack the archive to the build dir location. even when only + # downloading archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified; let's copy the archive there + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + if not already_downloaded_path: + os.unlink(from_path) + + +def unpack_file_url( + link, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> None + """Unpack link into location. + + If download_dir is provided and link points to a file, make a copy + of the link file inside download_dir. + """ + link_path = url_to_path(link.url_without_fragment) + + # If it's a url to a local directory + if is_dir_url(link): + if os.path.isdir(location): + rmtree(location) + shutil.copytree(link_path, location, symlinks=True) + if download_dir: + logger.info('Link is a directory, ignoring download_dir') + return + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(link_path) + + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link_path + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified and not already downloaded + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise + + +def unpack_url( + link, # type: Optional[Link] + location, # type: Optional[str] + download_dir=None, # type: Optional[str] + only_download=False, # type: bool + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + """Unpack link. + If link is a VCS link: + if only_download, export into download_dir and ignore location + else unpack into location + for other types of link: + - unpack into location + - if download_dir, copy the file into download_dir + - if only_download, mark location for deletion + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if is_vcs_url(link): + unpack_vcs_link(link, location) + + # file urls + elif is_file_url(link): + unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + if session is None: + session = PipSession() + + unpack_http_url( + link, + location, + download_dir, + session, + hashes=hashes, + progress_bar=progress_bar + ) + if only_download: + write_delete_marker_file(location) + + +def _download_http_url( + link, # type: Link + session, # type: PipSession + temp_dir, # type: str + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> Tuple[str, str] + """Download link url into temp_dir using provided session""" + target_url = link.url.split('#', 1)[0] + try: + resp = session.get( + target_url, + # We use Accept-Encoding: identity here because requests + # defaults to accepting compressed responses. This breaks in + # a variety of ways depending on how the server is configured. + # - Some servers will notice that the file isn't a compressible + # file and will leave the file alone and with an empty + # Content-Encoding + # - Some servers will notice that the file is already + # compressed and will leave the file alone and will add a + # Content-Encoding: gzip header + # - Some servers won't notice anything at all and will take + # a file that's already been compressed and compress it again + # and set the Content-Encoding: gzip header + # By setting this to request only the identity encoding We're + # hoping to eliminate the third case. Hopefully there does not + # exist a server which when given a file will notice it is + # already compressed and that you're not asking for a + # compressed file and will then decompress it before sending + # because if that's the case I don't think it'll ever be + # possible to make this work. + headers={"Accept-Encoding": "identity"}, + stream=True, + ) + resp.raise_for_status() + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", exc.response.status_code, link, + ) + raise + + content_type = resp.headers.get('content-type', '') + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + type, params = cgi.parse_header(content_disposition) + # We use ``or`` here because we don't want to use an "empty" value + # from the filename param. + filename = params.get('filename') or filename + ext = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(content_type) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + file_path = os.path.join(temp_dir, filename) + with open(file_path, 'wb') as content_file: + _download_url(resp, link, content_file, hashes, progress_bar) + return file_path, content_type + + +def _check_download_dir(link, download_dir, hashes): + # type: (Link, str, Hashes) -> Optional[str] + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + if os.path.exists(download_path): + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + return None diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py new file mode 100644 index 0000000..7b291a1 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,274 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + from pip._internal.req.req_install import InstallRequirement + + +class PipError(Exception): + """Base pip exception""" + + +class ConfigurationError(PipError): + """General exception in configuration""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None # type: Optional[InstallRequirement] + head = '' + + def body(self): + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' %s --hash=%s:%s' % (package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + prefix = ' or' + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file + """ + + def __init__(self, reason="could not be loaded", fname=None, error=None): + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error.message) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/index.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/index.py new file mode 100644 index 0000000..ff614b3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/index.py @@ -0,0 +1,1108 @@ +"""Routines related to PyPI, indexes""" +from __future__ import absolute_import + +import cgi +import itertools +import logging +import mimetypes +import os +import posixpath +import re +import sys +from collections import namedtuple + +from pip._vendor import html5lib, requests, six +from pip._vendor.distlib.compat import unescape +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.requests.exceptions import HTTPError, RetryError, SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.models.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.link import Link +from pip._internal.pep425tags import get_supported +from pip._internal.utils.compat import ipaddress +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, + redact_password_from_url, +) +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from logging import Logger + from typing import ( + Tuple, Optional, Any, List, Union, Callable, Set, Sequence, + Iterable, MutableMapping + ) + from pip._vendor.packaging.version import _BaseVersion + from pip._vendor.requests import Response + from pip._internal.pep425tags import Pep425Tag + from pip._internal.req import InstallRequirement + from pip._internal.download import PipSession + + SecureOrigin = Tuple[str, str, Optional[str]] + BuildTag = Tuple[Any, ...] # either empty tuple or Tuple[int, str] + CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] + + +__all__ = ['FormatControl', 'FoundCandidates', 'PackageFinder'] + + +SECURE_ORIGINS = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] # type: List[SecureOrigin] + + +logger = logging.getLogger(__name__) + + +def _match_vcs_scheme(url): + # type: (str) -> Optional[str] + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response): + # type: (Response) -> None + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url, session): + # type: (str, PipSession) -> None + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + _ensure_html_header(resp) + + +def _get_html_response(url, session): + # type: (str, PipSession) -> Response + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if _is_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', redact_password_from_url(url)) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + resp.raise_for_status() + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + _ensure_html_header(resp) + + return resp + + +def _handle_get_page_fail( + link, # type: Link + reason, # type: Union[str, Exception] + meth=None # type: Optional[Callable[..., None]] +): + # type: (...) -> None + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _get_html_page(link, session=None): + # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.debug('Cannot look at %s URL %s', vcs_scheme, link) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = urllib_parse.urlparse(url) + if (scheme == 'file' and os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + try: + resp = _get_html_response(url, session=session) + except _NotHTTP: + logger.debug( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by HEAD.', link, + ) + except _NotHTML as exc: + logger.debug( + 'Skipping page %s because the %s request got Content-Type: %s', + link, exc.request_desc, exc.content_type, + ) + except HTTPError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: %s" % exc) + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return HTMLPage(resp.content, resp.url, resp.headers) + return None + + +class CandidateEvaluator(object): + + def __init__( + self, + valid_tags, # type: List[Pep425Tag] + prefer_binary=False # type: bool + + ): + # type: (...) -> None + self._prefer_binary = prefer_binary + self._valid_tags = valid_tags + + def is_wheel_supported(self, wheel): + # type: (Wheel) -> bool + return wheel.supported(self._valid_tags) + + def _sort_key(self, candidate): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + If not finding wheels, then sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self._valid_tags) + 3. source archives + If prefer_binary was set, then all wheels are sorted above sources. + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + support_num = len(self._valid_tags) + build_tag = tuple() # type: BuildTag + binary_preference = 0 + if candidate.location.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(candidate.location.filename) + if not wheel.supported(self._valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + if self._prefer_binary: + binary_preference = 1 + pri = -(wheel.support_index_min(self._valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + return (binary_preference, candidate.version, build_tag, pri) + + def get_best_candidate(self, candidates): + # type: (List[InstallationCandidate]) -> InstallationCandidate + """ + Return the best candidate per the instance's sort order, or None if + no candidates are given. + """ + if not candidates: + return None + + return max(candidates, key=self._sort_key) + + +class FoundCandidates(object): + """A collection of candidates, returned by `PackageFinder.find_candidates`. + + This class is only intended to be instantiated by PackageFinder through + the `from_specifier()` constructor. + + Arguments: + + * `candidates`: A sequence of all available candidates found. + * `specifier`: Specifier to filter applicable versions. + * `prereleases`: Whether prereleases should be accounted. Pass None to + infer from the specifier. + * `evaluator`: A CandidateEvaluator object to sort applicable candidates + by order of preference. + """ + + def __init__( + self, + candidates, # type: List[InstallationCandidate] + versions, # type: Set[str] + evaluator, # type: CandidateEvaluator + ): + # type: (...) -> None + self._candidates = candidates + self._evaluator = evaluator + self._versions = versions + + @classmethod + def from_specifier( + cls, + candidates, # type: List[InstallationCandidate] + specifier, # type: specifiers.BaseSpecifier + prereleases, # type: Optional[bool] + evaluator, # type: CandidateEvaluator + ): + # type: (...) -> FoundCandidates + versions = { + str(v) for v in specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + (str(c.version) for c in candidates), + prereleases=prereleases, + ) + } + return cls(candidates, versions, evaluator) + + def iter_all(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through all candidates. + """ + return iter(self._candidates) + + def iter_applicable(self): + # type: () -> Iterable[InstallationCandidate] + """Iterate through candidates matching the versions associated with + this instance. + """ + # Again, converting version to str to deal with debundling. + return (c for c in self.iter_all() if str(c.version) in self._versions) + + def get_best(self): + # type: () -> Optional[InstallationCandidate] + """Return the best candidate available, or None if no applicable + candidates are found. + """ + candidates = list(self.iter_applicable()) + return self._evaluator.get_best_candidate(candidates) + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__( + self, + find_links, # type: List[str] + index_urls, # type: List[str] + allow_all_prereleases=False, # type: bool + trusted_hosts=None, # type: Optional[Iterable[str]] + session=None, # type: Optional[PipSession] + format_control=None, # type: Optional[FormatControl] + platform=None, # type: Optional[str] + versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None, # type: Optional[str] + prefer_binary=False # type: bool + ): + # type: (...) -> None + """Create a PackageFinder. + + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param versions: A list of strings or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param abi: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param implementation: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param prefer_binary: Whether to prefer an old, but valid, binary + dist over a new source dist. + """ + if session is None: + raise TypeError( + "PackageFinder() missing 1 required keyword argument: " + "'session'" + ) + + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + self.find_links = [] # type: List[str] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + self.find_links.append(link) + + self.index_urls = index_urls + + # These are boring links that have already been logged somehow: + self.logged_links = set() # type: Set[Link] + + self.format_control = format_control or FormatControl(set(), set()) + + # Domains that we won't emit warnings for when not using HTTPS + self.secure_origins = [ + ("*", host, "*") + for host in (trusted_hosts if trusted_hosts else []) + ] # type: List[SecureOrigin] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # The Session we'll use to make requests + self.session = session + + # The valid tags to check potential found wheel candidates against + valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + self.candidate_evaluator = CandidateEvaluator( + valid_tags=valid_tags, prefer_binary=prefer_binary, + ) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not HAS_TLS: + for link in itertools.chain(self.index_urls, self.find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == "https": + logger.warning( + "pip is configured with locations that require " + "TLS/SSL, however the ssl module in Python is not " + "available." + ) + break + + def get_formatted_locations(self): + # type: () -> str + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + "Looking in indexes: {}".format(", ".join( + redact_password_from_url(url) for url in self.index_urls)) + ) + if self.find_links: + lines.append( + "Looking in links: {}".format(", ".join(self.find_links)) + ) + return "\n".join(lines) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] + """ + Sort locations into "files" (archives) and "urls", and return + a pair of lists (files,urls) + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + else: + logger.warning( + "Path '{0}' is ignored: " + "it is a directory.".format(path), + ) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + def _validate_secure_origin(self, logger, location): + # type: (Logger, Link) -> bool + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin = (parsed.scheme, parsed.hostname, parsed.port) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + protocol = origin[0].rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in (SECURE_ORIGINS + self.secure_origins): + if protocol != secure_origin[0] and secure_origin[0] != "*": + continue + + try: + # We need to do this decode dance to ensure that we have a + # unicode object, even on Python 2.x. + addr = ipaddress.ip_address( + origin[1] + if ( + isinstance(origin[1], six.text_type) or + origin[1] is None + ) + else origin[1].decode("utf8") + ) + network = ipaddress.ip_network( + secure_origin[1] + if isinstance(secure_origin[1], six.text_type) + # setting secure_origin[1] to proper Union[bytes, str] + # creates problems in other places + else secure_origin[1].decode("utf8") # type: ignore + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if (origin[1] and + origin[1].lower() != secure_origin[1].lower() and + secure_origin[1] != "*"): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port patches + if (origin[2] != secure_origin[2] and + secure_origin[2] != "*" and + secure_origin[2] is not None): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + parsed.hostname, + parsed.hostname, + ) + + return False + + def _get_index_urls_locations(self, project_name): + # type: (str) -> List[str] + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] + + def find_all_candidates(self, project_name): + # type: (str) -> List[Optional[InstallationCandidate]] + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_links. + All versions found are returned as an InstallationCandidate list. + + See _link_package_versions for details on which files are accepted + """ + index_locations = self._get_index_urls_locations(project_name) + index_file_loc, index_url_loc = self._sort_locations(index_locations) + fl_file_loc, fl_url_loc = self._sort_locations( + self.find_links, expand_dir=True, + ) + + file_locations = (Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, + )) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links. + # We want to filter out any thing which does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + ) + if self._validate_secure_origin(logger, link) + ] + + logger.debug('%d location(s) to search for versions of %s:', + len(url_locations), project_name) + + for location in url_locations: + logger.debug('* %s', location) + + canonical_name = canonicalize_name(project_name) + formats = self.format_control.get_allowed_formats(canonical_name) + search = Search(project_name, canonical_name, formats) + find_links_versions = self._package_versions( + # We trust every directly linked archive in find_links + (Link(url, '-f') for url in self.find_links), + search + ) + + page_versions = [] + for page in self._get_pages(url_locations, project_name): + logger.debug('Analyzing links from page %s', page.url) + with indent_log(): + page_versions.extend( + self._package_versions(page.iter_links(), search) + ) + + file_versions = self._package_versions(file_locations, search) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.location.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return file_versions + find_links_versions + page_versions + + def find_candidates( + self, + project_name, # type: str + specifier=None, # type: Optional[specifiers.BaseSpecifier] + ): + """Find matches for the given project and specifier. + + If given, `specifier` should implement `filter` to allow version + filtering (e.g. ``packaging.specifiers.SpecifierSet``). + + Returns a `FoundCandidates` instance. + """ + if specifier is None: + specifier = specifiers.SpecifierSet() + return FoundCandidates.from_specifier( + self.find_all_candidates(project_name), + specifier=specifier, + prereleases=(self.allow_all_prereleases or None), + evaluator=self.candidate_evaluator, + ) + + def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[Link] + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + candidates = self.find_candidates(req.name, req.specifier) + best_candidate = candidates.get_best() + + installed_version = None # type: Optional[_BaseVersion] + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + + def _format_versions(cand_iter): + # This repeated parse_version and str() conversion is needed to + # handle different vendoring sources from pip and pkg_resources. + # If we stop using the pkg_resources provided specifier and start + # using our own, we can drop the cast to str(). + return ", ".join(sorted( + {str(c.version) for c in cand_iter}, + key=parse_version, + )) or "none" + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + _format_versions(candidates.iter_all()), + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % req + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + _format_versions(candidates.iter_applicable()), + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + _format_versions(candidates.iter_applicable()), + ) + return best_candidate.location + + def _get_pages(self, locations, project_name): + # type: (Iterable[Link], str) -> Iterable[HTMLPage] + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() # type: Set[Link] + for location in locations: + if location in seen: + continue + seen.add(location) + + page = _get_html_page(location, session=self.session) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + # type: (Iterable[Link]) -> List[Link] + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() # type: Set[Link] + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _package_versions( + self, + links, # type: Iterable[Link] + search # type: Search + ): + # type: (...) -> List[Optional[InstallationCandidate]] + result = [] + for link in self._sort_links(links): + v = self._link_package_versions(link, search) + if v is not None: + result.append(v) + return result + + def _log_skipped_link(self, link, reason): + # type: (Link, str) -> None + if link not in self.logged_links: + logger.debug('Skipping link %s; %s', link, reason) + self.logged_links.add(link) + + def _link_package_versions(self, link, search): + # type: (Link, Search) -> Optional[InstallationCandidate] + """Return an InstallationCandidate or None""" + version = None + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + self._log_skipped_link(link, 'not a file') + return None + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext, + ) + return None + if "binary" not in search.formats and ext == WHEEL_EXTENSION: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied, + ) + return None + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return None + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return None + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return None + + if not self.candidate_evaluator.is_wheel_supported(wheel): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return None + + version = wheel.version + + # This should be up by the search.ok_binary check, but see issue 2700. + if "source" not in search.formats and ext != WHEEL_EXTENSION: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied, + ) + return None + + if not version: + version = _egg_info_matches(egg_info, search.canonical) + if not version: + self._log_skipped_link( + link, 'Missing project version for %s' % search.supplied) + return None + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != sys.version[:3]: + self._log_skipped_link( + link, 'Python version is incorrect') + return None + try: + support_this_python = check_requires_python(link.requires_python) + except specifiers.InvalidSpecifier: + logger.debug("Package %s has an invalid Requires-Python entry: %s", + link.filename, link.requires_python) + support_this_python = True + + if not support_this_python: + logger.debug("The package %s is incompatible with the python " + "version in use. Acceptable python versions are: %s", + link, link.requires_python) + return None + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + +def _find_name_version_sep(egg_info, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + `egg_info` must be an egg info string for the given package, and + `canonical_name` must be the package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> egg_info = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(egg_info, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(egg_info): + if c != "-": + continue + if canonicalize_name(egg_info[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(egg_info, canonical_name)) + + +def _egg_info_matches(egg_info, canonical_name): + # type: (str, str) -> Optional[str] + """Pull the version part out of a string. + + :param egg_info: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(egg_info, canonical_name) + 1 + except ValueError: + return None + version = egg_info[version_start:] + if not version: + return None + return version + + +def _determine_base_url(document, page_url): + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _get_encoding_from_headers(headers): + """Determine if we have any encoding information in our headers. + """ + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params['charset'] + return None + + +def _clean_link(url): + # type: (str) -> str + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + # Split the URL into parts according to the general structure + # `scheme://netloc/path;parameters?query#fragment`. Note that the + # `netloc` can be empty and the URI will then refer to a local + # filesystem path. + result = urllib_parse.urlparse(url) + # In both cases below we unquote prior to quoting to make sure + # nothing is double quoted. + if result.netloc == "": + # On Windows the path part might contain a drive letter which + # should not be quoted. On Linux where drive letters do not + # exist, the colon should be quoted. We rely on urllib.request + # to do the right thing here. + path = urllib_request.pathname2url( + urllib_request.url2pathname(result.path)) + else: + # In addition to the `/` character we protect `@` so that + # revision strings in VCS URLs are properly parsed. + path = urllib_parse.quote(urllib_parse.unquote(result.path), safe="/@") + return urllib_parse.urlunparse(result._replace(path=path)) + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + # type: (bytes, str, MutableMapping[str, str]) -> None + self.content = content + self.url = url + self.headers = headers + + def __str__(self): + return redact_password_from_url(self.url) + + def iter_links(self): + # type: () -> Iterable[Link] + """Yields all links in the page""" + document = html5lib.parse( + self.content, + transport_encoding=_get_encoding_from_headers(self.headers), + namespaceHTMLElements=False, + ) + base_url = _determine_base_url(document, self.url) + for anchor in document.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self.url, requires_python=pyrequire) + + +Search = namedtuple('Search', 'supplied canonical formats') +"""Capture key aspects of a search. + +:attribute supplied: The user supplied package. +:attribute canonical: The canonical package name. +:attribute formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. +""" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/locations.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/locations.py new file mode 100644 index 0000000..10860f7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/locations.py @@ -0,0 +1,211 @@ +"""Locations where we look for configs, install stuff, etc""" +from __future__ import absolute_import + +import os +import os.path +import platform +import site +import sys +import sysconfig +from distutils import sysconfig as distutils_sysconfig +from distutils.command.install import SCHEME_KEYS # type: ignore + +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Union, Dict, List, Optional + + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def write_delete_marker_file(directory): + # type: (str) -> None + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) + + +def running_under_virtualenv(): + # type: () -> bool + """ + Return True if we're running inside a virtualenv, False otherwise. + + """ + if hasattr(sys, 'real_prefix'): + return True + elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): + return True + + return False + + +def virtualenv_no_global(): + # type: () -> bool + """ + Return True if in a venv and no system site packages. + """ + # this mirrors the logic in virtualenv.py for locating the + # no-global-site-packages.txt file + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') + if running_under_virtualenv() and os.path.isfile(no_global_file): + return True + else: + return False + + +if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') +else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + +# under macOS + virtualenv sys.prefix is not properly resolved +# it is something like /path/to/python/bin/.. +# Note: using realpath due to tmp dirs on OSX being symlinks +src_prefix = os.path.abspath(src_prefix) + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") # type: Optional[str] + +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE +user_dir = expanduser('~') +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.ini' + + legacy_storage_dir = os.path.join(user_dir, 'pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.conf' + + legacy_storage_dir = os.path.join(user_dir, '.pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + +global_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + +site_config_file = os.path.join(sys.prefix, config_basename) +new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) + + +def distutils_scheme(dist_name, user=False, home=None, root=None, + isolated=False, prefix=None): + # type:(str, bool, str, str, bool, str) -> dict + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + scheme = {} + + if isolated: + extra_dist_args = {"script_args": ["--no-user-cfg"]} + else: + extra_dist_args = {} + dist_args = {'name': dist_name} # type: Dict[str, Union[str, List[str]]] + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + d.parse_config_files() + # NOTE: Ignoring type since mypy can't find attributes on 'Command' + i = d.get_command_obj('install', create=True) # type: Any + assert i is not None + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={} prefix={}".format(user, prefix) + i.user = user or i.user + if user: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + if 'install_lib' in d.get_option_dict('install'): # type: ignore + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python' + sys.version[:3], + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1281d8b607306ac01b6f13130942777d0b1c596 GIT binary patch literal 269 zcmXwzO-=(b423h@P*v&$SY_Kq8~!S$65{UwY+!|itT6GE3~45E%mBSn@6eNU%Pm;p zX@#Zl*?tTA-H*p3CAGE3FE`SE`sKe08E%C<6mjZVx#Cex2J7-pCtJPSC2D@NtgAM% z^)c&J>oDYlNtg&TM%IF7k9jtFm=wDs0M}Lk8$|;-yO&=wiF{`nO=ro}ZE#50tjN4J z0A-%X%g$X?kh-%IuFGXZ;k2GF7Usz$pQiGfZ3xq^6hF_aX5E{6z(+=kHkd;)1LAlF Sn5FOC@Jh^&fY*JDET})2CQs}D literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/candidate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5abefffc3b60f5efcdad1f21a10e2c7074ede443 GIT binary patch literal 1302 zcmaJ=OOMn>5bkb2W_H%I3IrmBC}_e7OJL^#3L7Cr7)5}95#l9bDQY_Io|R|Y54yb* zW;2|2B~JMd;mCi;FYz@e{sN~|*)t1>6(v=5xw>BcRr$tnI3Pg(iZj2Tb_w|pKh^}_ z zlu9O@!+zpQS9*se@m>*^BtEp~H>YnGwia588VZa>Au}mzwZHv9RYqA=)OI9BRat|U z2|YTOu3gTJrllEWA4Erk5m1T%BjJgRo!MVNEa{SPQqv_nK#eUOkWTH^-jW=!nZG16 z0?dG&sZ)EB{@soR`ec)kHO{VDG+RE5i93^3KMU$>xAfJQpUO zmRdrcI5+VhGtRHr%f-)gc`4=9{KxO>>6M+C(LYQtZ*Rws;wq~yu5h~eqALFUDV^=3 zv1MqYR;Ca-&P%DZjgJ71s)hLi8bP)J2*P|ipgtSWExLd9*ttdPN2L@4fbjHy$H4X! z2uc4zlwkrL(yyHs-~I6Fu^G?*^__WnVf0>x*8ngdW}l1t6UfX7s9?T45?BzCHn2^c ze*<5(T@U7d<^`QIOcnwQkt@!d0p|eEo<=?3{P~{HtD7F@vP_`@!eqX}dc)P&Ql&Lq z9CZ^?a}u4fsdfhtRO^H2GnWOMt!)wxlW$=-5$sVROA}Qh-4#2qaM5a?48wSgZO*ig z>j_4Cb*639&C%f6AMa2vDoAG#2!o?(zWz8(mmt#cryK09@mCQ&jKJl6|E5msV7}Tx TbPY#tafJgG&;XzYNdxD9AVgL` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/format_control.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..428e2cfcf7e30bbe878f061a6e2aff1d493bb76b GIT binary patch literal 2272 zcmaJ?+j1L45S`hZWLY+GFiBN_AgDYwqhHHQBBWfThl$KyU%3s;vB#+pDcR8oI6%7t4vGAumgHSqE=XHCd%O#8q_@Yq zuB^x^Mo-Sj8pevM%2`?8W4jz)&dGV~)#N+!9L8B`!RzzI+`~i<{A@XiGo3`^M~_uB zRJzeibYtMh{%RPn(gG@Jqoh1z^tsC=S*M^68mtFcYu?f5;}1rR>IiVJH>1g zM>~fLe0EY5_4Evm))etSnXY4az1<$_aMRCJd(+qLUJ^;A)Am5OSNcNSNpHtrY|2}K z7;fIYk@fDZ_I31G@Aloh?O)o%aCrUjKG(O0@z&=-e@vUEi!jcVM$p=WM5-vo$%Kvw zN(5WOouVqB6lOxq!H<-jVOEuU9NqHx_`(UuTSv+Pp+t?wDPr{Rob`cPpRH5KfCwiG zG7Mm$Y3W&L6mF8ODQzxZ3Nl@ILZ}TPE@GaV)A@Muv~f~6VVVMFf>oN{hv@@eKMV%f z3;29!RiDHB44bhM;?n=wB!z%OgBp!4y0Liy6Ukwd^?4s@(6`Z@0~;5&I^){Q$<>#W zYmJwaX45Ua68T~Vhedvx3PHF~#R>5y9h%%AblOd5YBkhCd>$fd`iV> zMw7EshyTDLXZvvafKTl0htkUJbx;44Tl@R~cgy*7w4`+aipgz>zHie?+85dH)>j}D z{Hvntl=B<)r)+yEx9_tTHz!W+NN3&B@zFUO&ob=oa(uD&-P|!J@_nnEZ9IDl3IkYf z=QY1Jc9&3+ORoswv9|%GZVMOIf&KEY-HA94RU?Oaos_Anb1X z(MT0u=Id3JnQ#|&thNe=P(BUmg*88xkrIPZHu58(wu5LSReA-7rk5d@UE?(rK^1Zl z1wkW8%gn}CPG;uWhfOn;vUHlMJuD=b)|xdj6oOLm^koV`33+^vh^22~_m3E~L@wDEnO2QQ)0s zUB3tQq9z2`b%bORMO}yu9nvH3z?1mOiC5snc+=1#VQFT+@y~eX`<%R8T52O0KeEkF4}FAwx?nLNMsL9M z4mgGwmS~7mg3%sggn1W;dE7hqQlIkTI~)VU~Z+PWXPo_~~Tt1Fsa< zyf8Y>;_IcjUW>DW#g!_@f^i-5Obf2!EYG>tu_2DEXwfy}O$nC6%bQM4?S4<<@Cce0`P=CT_Ae zXwPs}WHK3+j7yyer(U-@Q%xwsRih(th%Dm(FXISDjmi3Lp}Px)a^m*Ea9{UI-+}36 za0bmlf&l?x2vCj>I-Y95ylnz81CYAzxK?$kTXV?Ounwl{OUPvN-x6-K z-f243ifqV1wKk>D*9iEgHlp;)D3jMKO$yZKl-7OL`9Zxo-#M2O7XFsd!D`hNQCH%g zh3ifS;6mb)XsLcGlhwX4m42BdPUvo_PLj!nQ(6O=re7BQQX9_P0_1ZFPc{}O4A%yB zEsouH@z(#(9zc5!K)fy;!|$Y2T`f+#!*UGQ015Cmm1Ag5Z%`f&cy8t|**`ox+_&Ko eq;}}0yBn5m_-anpYwQ|y|3Q(rvO#d05c~(5{yVV% literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/link.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a95355251f33d67327989f54cc783b16d77b9f12 GIT binary patch literal 4992 zcmb_g%X<{Z5uewtMyu5#2_X<*dkh9^Z6tv}HV|ybVDX5>n(%PqHDo;6?$wT%7u~ZG z+HZ9UiJu*>-aVTBQ)!lPBb$pgvEMM;Z`sd+I2e| zt`CQ$dP&g=!AMxHmla+NM#Ds)@o=I(p?K`zU^rQy)U_KL z8)l{F8Y}VgGqZk(>G!ni$O~ws)v9_{NIW4qkdeeoTW%V=Z4p$>?7;7CE-fv)OTWLr zRJ(WUyIOWcaOO2qH}Rz0hy`<-A`Xc;vt<(aDSw(`mC0}U=2cH}b}bIEGQaIV^&`+H zZvSxS2lv{|rEA~1cOTShw`w;a#QrWx{W$W1tZ=`b1UxG|i0}=5`{w=I%Xhq0-XKML zKXNGjo)KaR(`Gl z9|k_kDhe+FKfuNmKElS?1m=}NJIE##Z4~$+Hl^?iKd?Q<4)5soaZr!2X+@n-)T5vt z1oap@uBelW`W~oIjg--)N%|2H6(VsO-s~^M0 zRWobZj~;ivy2}&6C67|+c#hgb<^&jVXj?$K<24?`ea@|j@uwe4NBSWg>^!);TypTM zHG00JH$5i#^*TUT-$tnJ=wc$(yZSSI3$UxXM%Mr|yQVnZH6w%3mz5UMVpn@+tPORw zH6txD^A`i*XFyZS`=K-~>7*_0z>v5t8r(@@KT0`s(%6}43Eu26 zkYUyS>_!}Nslsn?ML&|M7hxGJ+Y29Oqs0YRQj~W#Jn1y!cErv&v2bK6{AhKqzp~&@ z+CH>#lg+dhM}y1XQ_M~yj#AH$Fi)-e)7{-Uvv<^-pPZ1V9`jPqY5F{X9GUQj51jSI zkokV(+*!KgoWHO*=iG1k(h0pyXNB)^J1d*mMp|gLr`Bw)*1$Sm3bj_+DW?_5nPhn$ z38}Yw#(}+z%LaJh*Il8DXV351+%Xo7)JG=T$o^!KWgX8-Cgn z6e5{PDPP*#gX}<0y$`LovUy=DHW7CJKV(XdEKs>9T0Z1ux4UhZ=0KpHN7}8`7t8M9##SEm4wx){(W~NA$HS?MJ z?&?i*O1r0}Mr!5MXQ;;vl&V$h9CBuQ&fMMW%co>D(>j$?(wR}2jc@!bDCgyFEIZKK{8GuO>Pq{>hemesZ7^>m0z)S5AcQvXN2Ye8YN z_EMkk977FsP6;OwF>5!F6;X^-4S3{*906ZOdACobs&lwUk`Y$+jd!EU;T@OLR9YMm!DTMrNrcESmm?vwFIG z3FD<|F3c%?5?eIUb6St1?=;#YN>1f8isU_~F?~AUD?vP1`jfz6ciO?Oc4S=fbzGJRm8lAzpj{Hf%p}ixUJ+5+E7k zBY^$Auh_rGaIS-~TZVdF)_@-U%q)Yyt8HsL$j{!6&*maX`u>tK6J1-qFUjoK%32Wn zLTK_39%bw&K=wkbpO4m70aO!hg3&d*7Soyq<$t}_bA3PFvJw)i9VuI?#k^Xa!K!NG zm1DBPlQtKdncWoLYKR8s^#qy33ND>TaXUp9kTbbhLsCuFkSv{PWyXGdodZ9fJpG8T zu6{A|;~!2x`lQ-7lsswTQHDA|P(1pjhk776MP(Y@kx6@;@2~Q(m5sSraZeY4njpC+ z8m+u)6jnvtPI{HO5PB&_UMtS!S65htcuBQZGb=cUa1xE@8}o{k&JnUiwpSQBmPQ(j z&Ht-O)9$NFziOLUgkH)p@fomPv&82_ea)yt`>yc>oP*XKRo3mx+*z2BE$>_xU}50` zz0O}$uZ6|W=xg!ZLN{cKRT%HhHqXvpdi3c#?5Q}ux1Z_|M$XQWQ5HIvmM2>{xZc5D zi>7Q1npe_0c@3el|2^9F(=3lRL8s_DC^f9?prhtbZ)jFgj_)({)uWQ#FL6||nbXL4hCV09RYDYSzMd4Mr8;b0>R%!M_sSlfH)sy&viO#AWXo2(L3heuz}l<8 zc@x$f8Bnob{pgsad`$l2tAPcI7f(mpt0!`ff_?Nw$SEH}x{0N-a zv*fRsm}mM>*(mFl(HT<#_X-P6$y)U|-4iH6T{kPaE_(EKKzP}8pTIM_Bj{gQ+(0i$ zO}luH!26_`jZO|1j&xIeO0>b_BtLsqESx811I2j=x0eJRpSVE$7YSSuF?N`ksL@t8AG+a4QpGkbqjJ<9vCZ;uxj=um1z0Q@ zWt$$f-)7myA4b&7>QtUH%b1)US6i~qBNmG}w4QTeyw2quQUpD!ppaC(O*S>Sbu8Y9 zg4kpEmF>vjU_12#IT!l46;gT#YNeE$vZMPlsvDD_CSZStbTdKJ2|BN`;_k;Vtw~ua yMu>cHaABYRQ$mz!c$C0i2q{e6R_rTz7<@^!NKOLSxSUZKO`2tOZJE@|=6?Xj(u}wO literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py new file mode 100644 index 0000000..b66c365 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/candidate.py @@ -0,0 +1,31 @@ +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._vendor.packaging.version import _BaseVersion + from pip._internal.models.link import Link + from typing import Any + + +class InstallationCandidate(KeyBasedCompareMixin): + """Represents a potential "candidate" for installation. + """ + + def __init__(self, project, version, location): + # type: (Any, str, Link) -> None + self.project = project + self.version = parse_version(version) # type: _BaseVersion + self.location = location + + super(InstallationCandidate, self).__init__( + key=(self.project, self.version, self.location), + defining_class=InstallationCandidate + ) + + def __repr__(self): + # type: () -> str + return "".format( + self.project, self.version, self.location, + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py new file mode 100644 index 0000000..53138e4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/format_control.py @@ -0,0 +1,73 @@ +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, FrozenSet + + +class FormatControl(object): + """Helper for managing formats from which a package can be installed. + """ + + def __init__(self, no_binary=None, only_binary=None): + # type: (Optional[Set], Optional[Set]) -> None + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary + + def __eq__(self, other): + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + # type: (str, Optional[Set], Optional[Set]) -> None + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + # Without a none, we want to discard everything as :all: covers it + if ':none:' not in new: + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name): + # type: (str) -> FrozenSet + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard('source') + elif canonical_name in self.no_binary: + result.discard('binary') + elif ':all:' in self.only_binary: + result.discard('source') + elif ':all:' in self.no_binary: + result.discard('binary') + return frozenset(result) + + def disallow_binaries(self): + # type: () -> None + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/index.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/index.py new file mode 100644 index 0000000..ead1efb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/index.py @@ -0,0 +1,31 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class PackageIndex(object): + """Represents a Package Index and provides easier access to endpoints + """ + + def __init__(self, url, file_storage_domain): + # type: (str, str) -> None + super(PackageIndex, self).__init__() + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self._url_for_path('simple') + self.pypi_url = self._url_for_path('pypi') + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path): + # type: (str) -> str + return urllib_parse.urljoin(self.url, path) + + +PyPI = PackageIndex( + 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' +) +TestPyPI = PackageIndex( + 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' +) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/link.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/link.py new file mode 100644 index 0000000..2f42076 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/models/link.py @@ -0,0 +1,163 @@ +import posixpath +import re + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import ( + WHEEL_EXTENSION, redact_password_from_url, splitext, +) +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple, Union + from pip._internal.index import HTMLPage + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL + """ + + def __init__(self, url, comes_from=None, requires_python=None): + # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None + """ + url: + url of the resource pointed to (href of the link) + comes_from: + instance of HTMLPage where the link was found, or string. + requires_python: + String containing the `Requires-Python` metadata field, specified + in PEP 345. This may be specified by a data-requires-python + attribute in the HTML link tag, as described in PEP 503. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self.url = url + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + + super(Link, self).__init__( + key=(self.url), + defining_class=Link + ) + + def __str__(self): + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (redact_password_from_url(self.url), + self.comes_from, rp) + else: + return redact_password_from_url(str(self.url)) + + def __repr__(self): + return '' % self + + @property + def filename(self): + # type: () -> str + _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) + name = posixpath.basename(path.rstrip('/')) or netloc + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self.url) + return name + + @property + def scheme(self): + # type: () -> str + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + # type: () -> str + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + # type: () -> str + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + def splitext(self): + # type: () -> Tuple[str, str] + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + # type: () -> str + return self.splitext()[1] + + @property + def url_without_fragment(self): + # type: () -> str + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + # type: () -> Optional[str] + match = self._egg_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + # type: () -> Optional[str] + match = self._subdirectory_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + # type: () -> Optional[str] + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + # type: () -> Optional[str] + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + # type: () -> Optional[str] + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + # type: () -> bool + return self.ext == WHEEL_EXTENSION + + @property + def is_artifact(self): + # type: () -> bool + """ + Determines if this points to an actual artifact (e.g. a tarball) or if + it points to an "abstract" thing like a path or a VCS location. + """ + from pip._internal.vcs import vcs + + if self.scheme in vcs.all_schemes: + return False + + return True diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27e410c09a5fcc251fc9a15a806ed9709f1c96af GIT binary patch literal 205 zcmZ?b<>g`kf<1{+u^{>}h=2h`Aj1KOi&=m~3PUi1CZpd};mRORi zUzS*;pO&AKl3G-(pIfA#locOuQEZxLUY25#9A8joWKfc3k)BnQW0+=YX{jHgUyxa# zo0(T!l9-dDTTzf#Zk(J|1rh|~_{_YL)S|q^9R2)))S|?a%>2A!{dk~gW=VX!UP0w8 T4x8Nkl+v73JCJ*dftUdR#|tF^w?AX0$$rofnIy*slPW|eWmFN^EmTn=5hGm@BQZK z6*qgUt>BmV%^vAG-D$%eN!i$6v9 z&9Qkr-(d^v0-o@XeJWAXg(=F@IKGND3(Qa zhYN|tg(J#ukX`z4`q^l8v`^9G*ATfDX#+#d62h4IM`Mif7&sdnyPKKT!~EC!eeKIH z#%8AH=B9C=kFCAM%tYVH&BMwY?ZC+O+*;9IXj|`CT4oPi@f%$m1C{#=S@qCiR&M2$ zH-y;A*m$8ao7v;auPdKxFR|luv=h-i>4jd5uTufV^VpkSG|W;= zPCgpmXuBSM5B{XJjKYmm#4$*R@m^ucK{VRGp#ldGz$e4LH*pDtReHTtcsJya(4Mcg zYJ$8YOo*Z}66q#KcnJ++n)EXyW=T+b7S%ZI_hGQ8z6!+Tp;T;CH^BjBN6R{8Sm_bqSH%bh5&XF(OKUNf;;l|@WUPUK{puf zy#Kwdcc;H8;_vrv-@V&;-Wf%s_a>-&Z+A3&^@Hx_J}FfL9y2b0nNB+5LZyf7bT@c+ z&>rm-*Sdn^mBFdA20f7`Cn&y-1Ik4Rt>WmeVd<7Wt-HFRFY41qQ(xAFhqsijp=V=|C4NTi18@b1k=) zv`qu6;&By-t8QX$?Bq_a4XWY~%o^9AtKc0qu|vH>`;7)&O+3sihgGbr_KY{Wu5CSp zEeE!ov5R%JO*eO$#VTJJ@?mbPmC*OhaxKtU5r50-c_nKw`zs?i2;I3Yu0v-}bSCMx zu4Ao{n-k=Ivr4Y@q8`9GajFLZc#-tFU;)G)m~$0YAN4%Bk#5HXT;IQ`uyh(g?G=@N@?QJQrsv?g z`bcoWaVp7)5X}MKYfVu~fZR;DsZ1@C4zNJ4wUbZ`xF{UH6UN&BYGHTn) zFQRF<7OXdvg)LK&aRy_VXw}6sS-M7+s!1d%^@}>z_F}w{28|=!t8{Ek)&#gaWHEhe zVW}}e8_GL47p(E}Am4V?%>Ov#LmWVU0HIYK-7#(5He7?GqZbCO#|J0G5n_n%qyv#_ze5HCdHULE-~ko2R~u2riS|p^DgZhwahR;L@ZJs?K-2bH zrK2Z@2#&%fPw;oN2cRYpv@FF{#Zn-nWIHC_n`~CJ7^J;oCYTW7$r;H1Evs;|^k}t$ zRiOvPta4AVeryMjpby0RZsSp=&V~PT%pO+A283q2hHJW}0a6t!7$1`+R+bg?vv^{F_Yc%kGKT$nd-FhR!@mq@7WeT#bEx-oA;*RsW3nxe!kY7@K2 zSBJU*<(IPY9TX%ei++VBn-H39BTpL0nK`3rsJUaW(NT`Q_7sB*V8f+h?B36*j9D3@ zaLJ8}cW>dkL8-b)Ggsh65dEfkfKmkWH{mrDIOMe_+SW}JH_ap8t+guUhpS>h zeX}~W`pAm-FdW5)eOgQ^^zi*L=T3V zN4~Uf7S$kNX*USO1uP^^L%|73!wn-S%ZiJ*{@VdklBJ?uo&Z_eMkyLg6(N7=%!)xD z&X?)7=yF+>HlCV4DjwP=#X}n$jyj5~kQa+*m#G)D!H!*3M-|K8HJ$B^a2P>lLQzA> z{1`B+RD6zy834)6_N8%QQ z?>;H(WR#44^|SI)@awB5mx5oPXsP7(&z+i4iux*D@K3qijCfSCta1At!M%f^##%kzqSD?|GxE`jVYnsly+i~Wd^Zy0Hp1_s> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c42e54dbad37c7046057ed0f91a3c682c0dac2c GIT binary patch literal 5620 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..215989f19e4df46220606577c6e1798ea258887c GIT binary patch literal 10549 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 z

    j24Sp1!lQJyFPx-Oq=!{ZCh^>ASXQFF8h^)*pLB*J)rc(wSfRV)cq8x-HPgwl* z&6Q$B{DNL;aj&27xK|}OP(sf(A|f8798iU{nx{81Us!g%mCZE?Q(NURpCDp9MQ%YP zc{HjHlixFi{EifOT!88@^)kHCw0isITh?BbjW7U7d9n-lYHDfd{ zHfL*J)y_&3+j>QDwY18#6Shx%!M7>E!Zy-Ip^LvcFi@jPtUfN)#h-n&N4Z`}e5H$% ztwq3-p$5SZ0w)9l2%tGJIRFmUlfN~J1!H7LLJ$F=iog)KSQ0j(0Dt}!#O>@DMM=DO zXouX_6Og2*51XO*ctKMK$ja70_PCoNE(zfeT_)KE23k|h7pIl{L0o!}HF+5D6#@>GMOWTtf(h@VReF_S8B8Ryti$xiU)NL7yU zBxxp^k|i|6jPDnep0xI6cC`Bzr9l2f3kS2n7;`Y%OQj{V34`4PW}zma%>EgTQtimx M*}3Vt<+-W<1KT=2ga7~l literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/check.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/check.py new file mode 100644 index 0000000..920df5d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/check.py @@ -0,0 +1,155 @@ +"""Validation of dependencies of packages +""" + +import logging +from collections import namedtuple + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.operations.prepare import make_abstract_dist +from pip._internal.utils.misc import get_installed_distributions +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +logger = logging.getLogger(__name__) + +if MYPY_CHECK_RUNNING: + from pip._internal.req.req_install import InstallRequirement + from typing import ( + Any, Callable, Dict, Optional, Set, Tuple, List + ) + + # Shorthands + PackageSet = Dict[str, 'PackageDetails'] + Missing = Tuple[str, Any] + Conflicting = Tuple[str, str, Any] + + MissingDict = Dict[str, List[Missing]] + ConflictingDict = Dict[str, List[Conflicting]] + CheckResult = Tuple[MissingDict, ConflictingDict] + +PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) + + +def create_package_set_from_installed(**kwargs): + # type: (**Any) -> Tuple[PackageSet, bool] + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + + package_set = {} + problems = False + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + try: + package_set[name] = PackageDetails(dist.version, dist.requires()) + except RequirementParseError as e: + # Don't crash on broken metadata + logging.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems + + +def check_package_set(package_set, should_ignore=None): + # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + if should_ignore is None: + def should_ignore(name): + return False + + missing = dict() + conflicting = dict() + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + if should_ignore(package_name): + continue + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate() + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version # type: str + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + return missing, conflicting + + +def check_install_conflicts(to_install): + # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + package_set, _ = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ) + ) + + +def _simulate_installation_of(to_install, package_set): + # type: (List[InstallRequirement], PackageSet) -> Set[str] + """Computes the version of packages after installing to_install. + """ + + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + dist = make_abstract_dist(inst_req).dist() + name = canonicalize_name(dist.key) + package_set[name] = PackageDetails(dist.version, dist.requires()) + + installed.add(name) + + return installed + + +def _create_whitelist(would_be_installed, package_set): + # type: (Set[str], PackageSet) -> Set[str] + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].requires: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..0c4c761 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,247 @@ +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache + from pip._vendor.pkg_resources import ( + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=None, # type: Optional[bool] + user_only=None, # type: Optional[bool] + skip_regex=None, # type: Optional[str] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + for link in find_links: + yield '-f %s' % link + installations = {} # type: Dict[str, FrozenRequirement] + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = FrozenRequirement.from_dist(dist) + except RequirementParseError: + logger.warning( + "Could not parse requirement: %s", + dist.project_name + ) + continue + if exclude_editable and req.editable: + continue + installations[req.name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() # type: Set[str] + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) # type: Dict[str, List[str]] + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = install_req_from_editable( + line, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = install_req_from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + elif line_req.name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), line_req.name + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[line_req.name]).rstrip() + del installations[line_req.name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if canonicalize_name(installation.name) not in skip: + yield str(installation).rstrip() + + +def get_requirement_info(dist): + # type: (Distribution) -> RequirementInfo + """ + Compute and return values (req, editable, comments) for use in + FrozenRequirement.from_dist(). + """ + if not dist_is_editable(dist): + return (None, False, []) + + location = os.path.normcase(os.path.abspath(dist.location)) + + from pip._internal.vcs import vcs, RemoteNotFoundError + vc_type = vcs.get_backend_type(location) + + if not vc_type: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement {!r} in: {!r}', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vc_type.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + vc_type.__name__, req, + ) + ] + return (location, True, comments) + + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + vc_type.name, + ) + return (None, True, []) + + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + else: + if req is not None: + return (req, True, []) + + logger.warning( + 'Could not determine repository location of %s', location + ) + comments = ['## !! Could not determine repository location'] + + return (None, False, comments) + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + req, editable, comments = get_requirement_info(dist) + if req is None: + req = dist.as_requirement() + + return cls(dist.project_name, req, editable, comments=comments) + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..077a985 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,426 @@ +"""Prepares a distribution for installation +""" + +import logging +import os + +from pip._vendor import pkg_resources, requests + +from pip._internal.build_env import BuildEnvironment +from pip._internal.download import ( + is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, +) +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, + PreviousBuildDirError, VcsHashUnsupported, +) +from pip._internal.utils.compat import expanduser +from pip._internal.utils.hashes import MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional + from pip._internal.req.req_install import InstallRequirement + from pip._internal.index import PackageFinder + from pip._internal.download import PipSession + from pip._internal.req.req_tracker import RequirementTracker + +logger = logging.getLogger(__name__) + + +def make_abstract_dist(req): + # type: (InstallRequirement) -> DistAbstraction + """Factory to make an abstract dist object. + + Preconditions: Either an editable req with a source_dir, or satisfied_by or + a wheel link, or a non-editable req with a source_dir. + + :return: A concrete DistAbstraction. + """ + if req.editable: + return IsSDist(req) + elif req.link and req.link.is_wheel: + return IsWheel(req) + else: + return IsSDist(req) + + +class DistAbstraction(object): + """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. + + The requirements for anything installable are as follows: + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + - we must be able to generate a list of run-time dependencies + without installing any additional packages (or we would + have to either burn time by doing temporary isolated installs + or alternatively violate pips 'don't start installing unless + all requirements are available' rule - neither of which are + desirable). + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req): + # type: (InstallRequirement) -> None + self.req = req # type: InstallRequirement + + def dist(self): + # type: () -> Any + """Return a setuptools Dist object.""" + raise NotImplementedError + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError + + +class IsWheel(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return list(pkg_resources.find_distributions( + self.req.source_dir))[0] + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self): + return self.req.get_dist() + + def _raise_conflicts(self, conflicting_with, conflicting_reqs): + conflict_messages = [ + '%s is incompatible with %s' % (installed, wanted) + for installed, wanted in sorted(conflicting_reqs) + ] + raise InstallationError( + "Some build dependencies for %s conflict with %s: %s." % ( + self.req, conflicting_with, ', '.join(conflict_messages)) + ) + + def install_backend_dependencies(self, finder): + # type: (PackageFinder) -> None + """ + Install any extra build dependencies that the backend requests. + + :param finder: a PackageFinder object. + """ + req = self.req + with req.build_env: + # We need to have the env active when calling the hook. + req.spin_message = "Getting requirements to build wheel" + reqs = req.pep517_backend.get_requires_for_build_wheel() + conflicting, missing = req.build_env.check_requirements(reqs) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + # Prepare for building. We need to: + # 1. Load pyproject.toml (if it exists) + # 2. Set up the build environment + + self.req.load_pyproject_toml() + should_isolate = self.req.use_pep517 and build_isolation + + if should_isolate: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, self.req.pyproject_requires, 'overlay', + "Installing build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + self._raise_conflicts("PEP 517/518 supported requirements", + conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))) + ) + + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + self.install_backend_dependencies(finder=finder) + + self.req.prepare_metadata() + self.req.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return self.req.satisfied_by + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + pass + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + progress_bar, # type: str + build_isolation, # type: bool + req_tracker # type: RequirementTracker + ): + # type: (...) -> None + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + + # Where still packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + if wheel_download_dir: + wheel_download_dir = normalize_path(wheel_download_dir) + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + self.progress_bar = progress_bar + + # Is build isolation allowed? + self.build_isolation = build_isolation + + @property + def _download_should_save(self): + # type: () -> bool + # TODO: Modify to reduce indentation needed + if self.download_dir: + self.download_dir = expanduser(self.download_dir) + if os.path.exists(self.download_dir): + return True + else: + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '%s'" + % display_path(self.download_dir)) + return False + + def prepare_linked_requirement( + self, + req, # type: InstallRequirement + session, # type: PipSession + finder, # type: PackageFinder + upgrade_allowed, # type: bool + require_hashes # type: bool + ): + # type: (...) -> DistAbstraction + """Prepare a requirement that would be obtained from req.link + """ + # TODO: Breakup into smaller functions + if req.link and req.link.scheme == 'file': + path = url_to_path(req.link.url) + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req) + + with indent_log(): + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + req.ensure_has_source_dir(self.build_dir) + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + # package unpacked in `req.source_dir` + if os.path.exists(os.path.join(req.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '%s' due to a" + " pre-existing build directory (%s). This is " + "likely due to a previous installation that failed" + ". pip is being responsible and not assuming it " + "can delete this. Please delete it and try again." + % (req, req.source_dir) + ) + req.populate_link(finder, upgrade_allowed, require_hashes) + + # We can't hit this spot and have populate_link return None. + # req.satisfied_by is None here (because we're + # guarded) and upgrade has no impact except when satisfied_by + # is not None. + # Then inside find_requirement existing_applicable -> False + # If no new versions are found, DistributionNotFound is raised, + # otherwise a result is guaranteed. + assert req.link + link = req.link + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if require_hashes: + # We could check these first 2 conditions inside + # unpack_url and save repetition of conditions, but then + # we would report less-useful error messages for + # unhashable requirements, complaining that there's no + # hash provided. + if is_vcs_url(link): + raise VcsHashUnsupported() + elif is_file_url(link) and is_dir_url(link): + raise DirectoryUrlHashUnsupported() + if not req.original_link and not req.is_pinned: + # Unpinned packages are asking for trouble when a new + # version is uploaded. This isn't a security check, but + # it saves users a surprising hash mismatch in the + # future. + # + # file:/// URLs aren't pinnable, so don't complain + # about them not being pinned. + raise HashUnpinned() + + hashes = req.hashes(trust_internet=not require_hashes) + if require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + hashes = MissingHashes() + + try: + download_dir = self.download_dir + # We always delete unpacked sdists after pip ran. + autodelete_unpacked = True + if req.link.is_wheel and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + if req.link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + unpack_url( + req.link, req.source_dir, + download_dir, autodelete_unpacked, + session=session, hashes=hashes, + progress_bar=self.progress_bar + ) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because of error %s', + req, + exc, + ) + raise InstallationError( + 'Could not install requirement %s because of HTTP ' + 'error %s for URL %s' % + (req, exc, req.link) + ) + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if not req.link.is_artifact: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement( + self, + req, # type: InstallRequirement + require_hashes, # type: bool + use_user_site, # type: bool + finder # type: PackageFinder + ): + # type: (...) -> DistAbstraction + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if require_hashes: + raise InstallationError( + 'The editable requirement %s cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.' % req + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = make_abstract_dist(req) + with self.req_tracker.track(req): + abstract_dist.prep_for_dist(finder, self.build_isolation) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(use_user_site) + + return abstract_dist + + def prepare_installed_requirement(self, req, require_hashes, skip_reason): + # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction + """Prepare an already-installed requirement + """ + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to %r" % (req.satisfied_by,) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.' + ) + abstract_dist = Installed(req) + + return abstract_dist diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py new file mode 100644 index 0000000..3b68f28 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pep425tags.py @@ -0,0 +1,381 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +import logging +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +import pip._internal.utils.glibc +from pip._internal.utils.compat import get_extension_suffixes +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Tuple, Callable, List, Optional, Union, Dict + ) + + Pep425Tag = Tuple[str, str, str] + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + # type: (str) -> Optional[str] + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + # type: () -> str + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + # type: () -> str + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + # type: () -> Tuple[int, ...] + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + # attrs exist only on pypy + return (sys.version_info[0], + sys.pypy_version_info.major, # type: ignore + sys.pypy_version_info.minor) # type: ignore + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + # type: () -> str + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + logger.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + # type: () -> Optional[str] + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + # type: () -> bool + return sys.maxsize == 2147483647 + + +def get_platform(): + # type: () -> str + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # type: () -> bool + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return pip._internal.utils.glibc.have_compatible_glibc(2, 5) + + +def is_manylinux2010_compatible(): + # type: () -> bool + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux2010_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 6 uses glibc 2.12. + return pip._internal.utils.glibc.have_compatible_glibc(2, 12) + + +def get_darwin_arches(major, minor, machine): + # type: (int, int, str) -> List[str] + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # type: (int, int, str) -> bool + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) # type: Dict[str, Tuple[str, ...]] + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_all_minor_versions_as_strings(version_info): + # type: (Tuple[int, ...]) -> List[str] + versions = [] + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + return versions + + +def get_supported( + versions=None, # type: Optional[List[str]] + noarch=False, # type: bool + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Pep425Tag] + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + version_info = get_impl_version_info() + versions = get_all_minor_versions_as_strings(version_info) + + impl = impl or get_abbr_impl() + + abis = [] # type: List[str] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_extension_suffixes(): + if suffix.startswith('.abi'): + abi3s.add(suffix.split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif arch_prefix == 'manylinux2010': + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches = [arch, 'manylinux1' + arch_sep + arch_suffix] + elif platform is None: + arches = [] + if is_manylinux2010_compatible(): + arches.append('manylinux2010' + arch_sep + arch_suffix) + if is_manylinux1_compatible(): + arches.append('manylinux1' + arch_sep + arch_suffix) + arches.append(arch) + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py new file mode 100644 index 0000000..43efbed --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/pyproject.py @@ -0,0 +1,171 @@ +from __future__ import absolute_import + +import io +import os +import sys + +from pip._vendor import pytoml, six + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Tuple, Optional, List + + +def _is_list_of_str(obj): + # type: (Any) -> bool + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def make_pyproject_path(setup_py_dir): + # type: (str) -> str + path = os.path.join(setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[Tuple[List[str], str, List[str]]] + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = pytoml.load(f) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format( + build_system["build-backend"] + ) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + error_template = ( + "{package} has a pyproject.toml file that does not comply " + "with PEP 518: {reason}" + ) + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise InstallationError( + error_template.format(package=req_name, reason=( + "it has a 'build-system' table but not " + "'build-system.requires' which is mandatory in the table" + )) + ) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InstallationError(error_template.format( + package=req_name, + reason="'build-system.requires' is not a list of strings.", + )) + + backend = build_system.get("build-backend") + check = [] # type: List[str] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is needed by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] + + return (requires, backend, check) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 0000000..c39f63f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import + +import logging + +from .req_install import InstallRequirement +from .req_set import RequirementSet +from .req_file import parse_requirements +from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, List, Sequence + +__all__ = [ + "RequirementSet", "InstallRequirement", + "parse_requirements", "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +def install_given_reqs( + to_install, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + *args, # type: Any + **kwargs # type: Any +): + # type: (...) -> List[InstallRequirement] + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + with indent_log(): + for requirement in to_install: + if requirement.conflicts_with: + logger.info( + 'Found existing installation: %s', + requirement.conflicts_with, + ) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except Exception: + should_rollback = ( + requirement.conflicts_with and + not requirement.install_succeeded + ) + # if install did not succeed, rollback previous uninstall + if should_rollback: + uninstalled_pathset.rollback() + raise + else: + should_commit = ( + requirement.conflicts_with and + requirement.install_succeeded + ) + if should_commit: + uninstalled_pathset.commit() + requirement.remove_temporary_source() + + return to_install diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c339482fb4e7534260eab985744fb4f6c6ae2322 GIT binary patch literal 1716 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 Q4TS8p+z%0^CiBVv2WqoKG5`Po literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7caee5df2c4fd2a4aa3d7e45fa8012605e7996d9 GIT binary patch literal 5677 zcmbtY&2!tv6~`Arh@vQ2lI71hNL$BZVpD0-w29(s63cPoBxPD#9VhHK7zn$RK!E_g z3rZG;x>P=OrcHY7NxHSyPHycV(7yrK_R@bL(?fr6K~kjTPBJN_T`YFrzJ1^O9`4M{ zlr;SQ?q7cV^)*fVC%p`R76$L4$v>fE8q*`Ktv7U?#ztf`3_Q)qY+DUW%~?^QZ8vN+ zE=0w)({R+-j;7kBMoEo}(R91qDC-(8i9Yr_(M-G2sI+Grv+cRYT>D((TzkGTuVAO5 zh4x}&5wOP5dA@Y4H!ggju@akprm<;$@z88sV#Y(QTK+fa)2ezl>u<^=>ZaTa+nq$D zb<9nFDi{}>-3@~jujlT^GWDa#Ps1dBUx-9tvJ}RQ$Eg=3TX>uQ#pl2L+*|+f{q>K% z2fwb@@7F)TY~j&1=TWtgS%fKb?x$S%n-R~fPeO_JPdkLskFvr>w-a%~GdSu2f6@&F zZ{vi32p#@R4BkbPAEM)0LuVR9I?qgIJ<}T|D=_<+*05NSId~S>f?{27*sRQEFjHg| zHjAgj=GZwrr`QyPv6xlH4t&Vddm90rL_c~OXzOV5HFT+VsP#2Z@9XG|zJcBhX~x>3 zzMy(r^+l!wyU}}TU2s3;uJ2ABQ!BZHU%l!GIw>oQ6V7E;8N7MhzTDiaEXkv$m;+tn9J;?~;sPGu#48;U?t-C}U0g#_ro>&ianUTW;Nt;WrDUx>8$c)-+nF$`1MDy+O!;wv0uIruCM;os@hFxHfnA{x`ZiB5A0JGeS!t<(7UpAv7a1!K5OqYKSXD-E&A3 zFJPgHCJDK%RV^`#L1ypzQ5Sw-N%%@;wURIf7E)AZLGto6r$x_GBK;Aeve9YAqA{oU zmY&bvY-G?ChM$=q^>Z()!!{o>>mB~3|a%0A(82dJX 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..685e550d3cab0464e55b11f32c34dfdc76a2c2e8 GIT binary patch literal 17291 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 HF!KKg4O@6d literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py new file mode 100644 index 0000000..0f18b6a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/constructors.py @@ -0,0 +1,340 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +import logging +import os +import re + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal.download import ( + is_archive_file, is_url, path_to_url, url_to_path, +) +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.pyproject import make_pyproject_path +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.misc import is_installable_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Optional, Set, Tuple, Union, + ) + from pip._internal.cache import WheelCache + + +__all__ = [ + "install_req_from_editable", "install_req_from_line", + "parse_editable" +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def _strip_extras(path): + # type: (str) -> Tuple[str, Optional[str]] + m = re.match(r'^(.+)(\[[^\]]+\])$', path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +def parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + msg = ( + 'File "setup.py" not found. Directory cannot be installed ' + 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) + ) + pyproject_path = make_pyproject_path(url_no_extras) + if os.path.isfile(pyproject_path): + msg += ( + '\n(A "pyproject.toml" file was found, but editable ' + 'mode currently requires a setup.py based build.)' + ) + raise InstallationError(msg) + + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + Requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + break + + if '+' not in url: + raise InstallationError( + '%s should either be a path to a local project or a VCS url ' + 'beginning with svn+, git+, hg+, or bzr+' % + editable_req + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '%s', please specify one " + "with #egg=your_package_name" % editable_req + ) + return package_name, url, None + + +def deduce_helpful_msg(req): + # type: (str) -> str + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + msg = "" + if os.path.exists(req): + msg = " It does exist." + # Try to parse and check if it is a requirements file. + try: + with open(req, 'r') as fp: + # parse first line only + next(parse_requirements(fp.read())) + msg += " The argument you provided " + \ + "(%s) appears to be a" % (req) + \ + " requirements file. If that is the" + \ + " case, use the '-r' flag to install" + \ + " the packages specified within it." + except RequirementParseError: + logger.debug("Cannot parse '%s' as requirements \ + file" % (req), exc_info=True) + else: + msg += " File '%s' does not exist." % (req) + return msg + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, # type: str + comes_from=None, # type: Optional[str] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + name, url, extras_override = parse_editable(editable_req) + if url.startswith('file:'): + source_dir = url_to_path(url) + else: + source_dir = None + + if name is not None: + try: + req = Requirement(name) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % name) + else: + req = None + return InstallRequirement( + req, comes_from, source_dir=source_dir, + editable=True, + link=Link(url), + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=extras_override or (), + ) + + +def install_req_from_line( + name, # type: str + comes_from=None, # type: Optional[Union[str, InstallRequirement]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + """ + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _strip_extras(path) + looks_like_dir = os.path.isdir(p) and ( + os.path.sep in name or + (os.path.altsep is not None and os.path.altsep in name) or + name.startswith('.') + ) + if looks_like_dir: + if not is_installable_dir(p): + raise InstallationError( + "Directory %r is not installable. Neither 'setup.py' " + "nor 'pyproject.toml' found." % name + ) + link = Link(path_to_url(p)) + elif is_archive_file(p): + if not os.path.isfile(p): + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + link = Link(path_to_url(p)) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == 'file' and re.search(r'\.\./', link.url): + link = Link( + path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req_as_string = "%s==%s" % (wheel.name, wheel.version) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + if extras_as_string: + extras = Requirement("placeholder" + extras_as_string.lower()).extras + else: + extras = () + if req_as_string is not None: + try: + req = Requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif ('=' in req_as_string and + not any(op in req_as_string for op in operators)): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = "" + raise InstallationError( + "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) + ) + else: + req = None + + return InstallRequirement( + req, comes_from, link=link, markers=markers, + use_pep517=use_pep517, isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=extras, + ) + + +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> InstallRequirement + try: + req = Requirement(req_string) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req_string) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if (req.url and comes_from and comes_from.link and + comes_from.link.netloc in domains_not_allowed): + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + "%s depends on %s " % (comes_from.name, req) + ) + + return InstallRequirement( + req, comes_from, isolated=isolated, wheel_cache=wheel_cache, + use_pep517=use_pep517 + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 0000000..270b75c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,383 @@ +""" +Requirements file parsing +""" + +from __future__ import absolute_import + +import optparse +import os +import re +import shlex +import sys + +from pip._vendor.six.moves import filterfalse +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.cli import cmdoptions +from pip._internal.download import get_file_content +from pip._internal.exceptions import RequirementsFileParseError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Iterator, List, NoReturn, Optional, Text, Tuple, + ) + from pip._internal.req import InstallRequirement + from pip._internal.cache import WheelCache + from pip._internal.index import PackageFinder + from pip._internal.download import PipSession + + ReqFileLines = Iterator[Tuple[int, Text]] + +__all__ = ['parse_requirements'] + +SCHEME_RE = re.compile(r'^(http|https|file):', re.I) +COMMENT_RE = re.compile(r'(^|\s)+#.*$') + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') + +SUPPORTED_OPTIONS = [ + cmdoptions.constraints, + cmdoptions.editable, + cmdoptions.requirements, + cmdoptions.no_index, + cmdoptions.index_url, + cmdoptions.find_links, + cmdoptions.extra_index_url, + cmdoptions.always_unzip, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.pre, + cmdoptions.trusted_host, + cmdoptions.require_hashes, +] # type: List[Callable[..., optparse.Option]] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] # type: List[Callable[..., optparse.Option]] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] + + +def parse_requirements( + filename, # type: str + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + constraint=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> Iterator[InstallRequirement] + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param session: Instance of pip.download.PipSession. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + :param use_pep517: Value of the --use-pep517 option. + """ + if session is None: + raise TypeError( + "parse_requirements() missing 1 required keyword argument: " + "'session'" + ) + + _, content = get_file_content( + filename, comes_from=comes_from, session=session + ) + + lines_enum = preprocess(content, options) + + for line_number, line in lines_enum: + req_iter = process_line(line, filename, line_number, finder, + comes_from, options, session, wheel_cache, + use_pep517=use_pep517, constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + # type: (Text, Optional[optparse.Values]) -> ReqFileLines + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) # type: ReqFileLines + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = skip_regex(lines_enum, options) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def process_line( + line, # type: Text + filename, # type: str + line_number, # type: int + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None, # type: Optional[bool] + constraint=False # type: bool +): + # type: (...) -> Iterator[InstallRequirement] + """Process a single requirements line; This can result in creating/yielding + requirements, or updating the finder. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + + :param constraint: If True, parsing a constraints file. + :param options: OptionParser options that we may update + """ + parser = build_parser(line) + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + defaults.format_control = finder.format_control + args_str, options_str = break_args_options(line) + # Prior to 2.7.3, shlex cannot deal with unicode entries + if sys.version_info < (2, 7, 3): + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if constraint else '-r', filename, line_number, + ) + + # yield a line requirement + if args_str: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in opts.__dict__ and opts.__dict__[dest]: + req_options[dest] = opts.__dict__[dest] + yield install_req_from_line( + args_str, line_comes_from, constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, options=req_options, wheel_cache=wheel_cache + ) + + # yield an editable requirement + elif opts.editables: + isolated = options.isolated_mode if options else False + yield install_req_from_editable( + opts.editables[0], comes_from=line_comes_from, + use_pep517=use_pep517, + constraint=constraint, isolated=isolated, wheel_cache=wheel_cache + ) + + # parse a nested requirements file + elif opts.requirements or opts.constraints: + if opts.requirements: + req_path = opts.requirements[0] + nested_constraint = False + else: + req_path = opts.constraints[0] + nested_constraint = True + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join(os.path.dirname(filename), req_path) + # TODO: Why not use `comes_from='-r {} (line {})'` here as well? + parsed_reqs = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parsed_reqs: + yield req + + # percolate hash-checking option upward + elif opts.require_hashes: + options.require_hashes = opts.require_hashes + + # set finder options + elif finder: + if opts.index_url: + finder.index_urls = [opts.index_url] + if opts.no_index is True: + finder.index_urls = [] + if opts.extra_index_urls: + finder.index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + finder.find_links.append(value) + if opts.pre: + finder.allow_all_prereleases = True + if opts.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + # type: (Text) -> Tuple[str, Text] + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) # type: ignore + + +def build_parser(line): + # type: (Text) -> optparse.OptionParser + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + # type: (Any, str) -> NoReturn + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, msg) + raise RequirementsFileParseError(msg) + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] # type: List[Text] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def skip_regex(lines_enum, options): + # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines + """ + Skip lines that match '--skip-requirements-regex' pattern + + Note: the regex pattern is only built once + """ + skip_regex = options.skip_requirements_regex if options else None + if skip_regex: + pattern = re.compile(skip_regex) + lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) + return lines_enum + + +def expand_env_variables(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discussion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 0000000..25a692e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,1028 @@ +from __future__ import absolute_import + +import logging +import os +import shutil +import sys +import sysconfig +import zipfile +from distutils.util import change_root + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pep517.wrappers import Pep517HookCaller + +from pip._internal import wheel +from pip._internal.build_env import NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, +) +from pip._internal.models.link import Link +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.compat import native_str +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + _make_build_dir, ask_path_exists, backup_dir, call_subprocess, + display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, + get_installed_version, redact_password_from_url, rmtree, +) +from pip._internal.utils.packaging import get_metadata +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner +from pip._internal.vcs import vcs +from pip._internal.wheel import move_wheel_files + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union, + ) + from pip._internal.build_env import BuildEnvironment + from pip._internal.cache import WheelCache + from pip._internal.index import PackageFinder + from pip._vendor.pkg_resources import Distribution + from pip._vendor.packaging.specifiers import SpecifierSet + from pip._vendor.packaging.markers import Marker + + +logger = logging.getLogger(__name__) + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relevant requirement and also contains logic for + installing the said requirement. + """ + + def __init__( + self, + req, # type: Optional[Requirement] + comes_from, # type: Optional[Union[str, InstallRequirement]] + source_dir=None, # type: Optional[str] + editable=False, # type: bool + link=None, # type: Optional[Link] + update=True, # type: bool + markers=None, # type: Optional[Marker] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + extras=() # type: Iterable[str] + ): + # type: (...) -> None + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + if source_dir is not None: + self.source_dir = os.path.normpath(os.path.abspath(source_dir)) + else: + self.source_dir = None + self.editable = editable + + self._wheel_cache = wheel_cache + if link is None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + + if extras: + self.extras = extras + elif req: + self.extras = { + pkg_resources.safe_extra(extra) for extra in req.extras + } + else: + self.extras = set() + if markers is None and req: + markers = req.marker + self.markers = markers + + self._egg_info_path = None # type: Optional[str] + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None + # This hold the pkg_resources.Distribution object if this requirement + # conflicts with another installed distribution: + self.conflicts_with = None + # Temporary build location + self._temp_build_dir = TempDirectory(kind="req-build") + # Used to store the global directory where the _temp_build_dir should + # have been created. Cf _correct_build_location method. + self._ideal_build_dir = None # type: Optional[str] + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None # type: Optional[bool] + # UninstallPathSet of uninstalled distribution (for possible rollback) + self.uninstalled_pathset = None + self.options = options if options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + self.is_direct = False + + self.isolated = isolated + self.build_env = NoOpBuildEnvironment() # type: BuildEnvironment + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory = None # type: Optional[str] + + # The static build requirements (from pyproject.toml) + self.pyproject_requires = None # type: Optional[List[str]] + + # Build requirements that we will check are available + self.requirements_to_check = [] # type: List[str] + + # The PEP 517 backend we should use to build the project + self.pep517_backend = None # type: Optional[Pep517HookCaller] + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + def __str__(self): + # type: () -> str + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % redact_password_from_url(self.link.url) + elif self.link: + s = redact_password_from_url(self.link.url) + else: + s = '' + if self.satisfied_by is not None: + s += ' in %s' % display_path(self.satisfied_by.location) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from %s)' % comes_from + return s + + def __repr__(self): + # type: () -> str + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def populate_link(self, finder, upgrade, require_hashes): + # type: (PackageFinder, bool, bool) -> None + """Ensure that if a link can be found for this, that it is found. + + Note that self.link may still be None - if Upgrade is False and the + requirement is already installed. + + If require_hashes is True, don't use the wheel cache, because cached + wheels, always built locally, have different hashes than the files + downloaded from the index server and thus throw false hash mismatches. + Furthermore, cached wheels at present have undeterministic contents due + to file modification times. + """ + if self.link is None: + self.link = finder.find_requirement(self, upgrade) + if self._wheel_cache is not None and not require_hashes: + old_link = self.link + self.link = self._wheel_cache.get(self.link, self.name) + if old_link != self.link: + logger.debug('Using cached wheel link: %s', self.link) + + # Things that are valid for all kinds of requirements? + @property + def name(self): + # type: () -> Optional[str] + if self.req is None: + return None + return native_str(pkg_resources.safe_name(self.req.name)) + + @property + def specifier(self): + # type: () -> SpecifierSet + return self.req.specifier + + @property + def is_pinned(self): + # type: () -> bool + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return (len(specifiers) == 1 and + next(iter(specifiers)).operator in {'==', '==='}) + + @property + def installed_version(self): + # type: () -> Optional[str] + return get_installed_version(self.name) + + def match_markers(self, extras_requested=None): + # type: (Optional[Iterable[str]]) -> bool + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ('',) + if self.markers is not None: + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) + else: + return True + + @property + def has_hash_options(self): + # type: () -> bool + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.options.get('hashes', {})) + + def hashes(self, trust_internet=True): + # type: (bool) -> Hashes + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.options.get('hashes', {}).copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + def from_path(self): + # type: () -> Optional[str] + """Format a nice indicator to show where this "comes from" + """ + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def build_location(self, build_dir): + # type: (str) -> Optional[str] + assert build_dir is not None + if self._temp_build_dir.path is not None: + return self._temp_build_dir.path + if self.req is None: + # for requirement via a path to a directory: the name of the + # package is not available yet so we create a temp directory + # Once run_egg_info will have run, we'll be able + # to fix it via _correct_build_location + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir.create() + self._ideal_build_dir = build_dir + + return self._temp_build_dir.path + if self.editable: + name = self.name.lower() + else: + name = self.name + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug('Creating directory %s', build_dir) + _make_build_dir(build_dir) + return os.path.join(build_dir, name) + + def _correct_build_location(self): + # type: () -> None + """Move self._temp_build_dir to self._ideal_build_dir/self.req.name + + For some requirements (e.g. a path to a directory), the name of the + package is not available until we run egg_info, so the build_location + will return a temporary directory and store the _ideal_build_dir. + + This is only called by self.run_egg_info to fix the temporary build + directory. + """ + if self.source_dir is not None: + return + assert self.req is not None + assert self._temp_build_dir.path + assert (self._ideal_build_dir is not None and + self._ideal_build_dir.path) # type: ignore + old_location = self._temp_build_dir.path + self._temp_build_dir.path = None + + new_location = self.build_location(self._ideal_build_dir) + if os.path.exists(new_location): + raise InstallationError( + 'A package already exists in %s; please remove it to continue' + % display_path(new_location)) + logger.debug( + 'Moving package %s from %s to new location %s', + self, display_path(old_location), display_path(new_location), + ) + shutil.move(old_location, new_location) + self._temp_build_dir.path = new_location + self._ideal_build_dir = None + self.source_dir = os.path.normpath(os.path.abspath(new_location)) + self._egg_info_path = None + + # Correct the metadata directory, if it exists + if self.metadata_directory: + old_meta = self.metadata_directory + rel = os.path.relpath(old_meta, start=old_location) + new_meta = os.path.join(new_location, rel) + new_meta = os.path.normpath(os.path.abspath(new_meta)) + self.metadata_directory = new_meta + + def remove_temporary_source(self): + # type: () -> None + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.source_dir and os.path.exists( + os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): + logger.debug('Removing source in %s', self.source_dir) + rmtree(self.source_dir) + self.source_dir = None + self._temp_build_dir.cleanup() + self.build_env.cleanup() + + def check_if_exists(self, use_user_site): + # type: (bool) -> bool + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.conflicts_with appropriately. + """ + if self.req is None: + return False + try: + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + if self.editable and self.satisfied_by: + self.conflicts_with = self.satisfied_by + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + return True + except pkg_resources.DistributionNotFound: + return False + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution( + self.req.name + ) + if use_user_site: + if dist_in_usersite(existing_dist): + self.conflicts_with = existing_dist + elif (running_under_virtualenv() and + dist_in_site_packages(existing_dist)): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to %s in %s" % + (existing_dist.project_name, existing_dist.location) + ) + else: + self.conflicts_with = existing_dist + return True + + # Things valid for wheels + @property + def is_wheel(self): + # type: () -> bool + if not self.link: + return False + return self.link.is_wheel + + def move_wheel_files( + self, + wheeldir, # type: str + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + move_wheel_files( + self.name, self.req, wheeldir, + user=use_user_site, + home=home, + root=root, + prefix=prefix, + pycompile=pycompile, + isolated=self.isolated, + warn_script_location=warn_script_location, + ) + + # Things valid for sdists + @property + def setup_py_dir(self): + # type: () -> str + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + + setup_py = os.path.join(self.setup_py_dir, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + @property + def pyproject_toml(self): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + + return make_pyproject_path(self.setup_py_dir) + + def load_pyproject_toml(self): + # type: () -> None + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pep517_data = load_pyproject_toml( + self.use_pep517, + self.pyproject_toml, + self.setup_py, + str(self) + ) + + if pep517_data is None: + self.use_pep517 = False + else: + self.use_pep517 = True + requires, backend, check = pep517_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) + + # Use a custom function to call subprocesses + self.spin_message = "" + + def runner( + cmd, # type: List[str] + cwd=None, # type: Optional[str] + extra_environ=None # type: Optional[Mapping[str, Any]] + ): + # type: (...) -> None + with open_spinner(self.spin_message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + spinner=spinner + ) + self.spin_message = "" + + self.pep517_backend._subprocess_runner = runner + + def prepare_metadata(self): + # type: () -> None + """Ensure that project metadata is available. + + Under PEP 517, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir + + with indent_log(): + if self.use_pep517: + self.prepare_pep517_metadata() + else: + self.run_egg_info() + + if not self.req: + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + self.req = Requirement( + "".join([ + self.metadata["Name"], + op, + self.metadata["Version"], + ]) + ) + self._correct_build_location() + else: + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) != metadata_name: + logger.warning( + 'Generating metadata for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + def prepare_pep517_metadata(self): + # type: () -> None + assert self.pep517_backend is not None + + metadata_dir = os.path.join( + self.setup_py_dir, + 'pip-wheel-metadata' + ) + ensure_dir(metadata_dir) + + with self.build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + backend = self.pep517_backend + self.spin_message = "Preparing wheel metadata" + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) + + def run_egg_info(self): + # type: () -> None + if self.name: + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + self.setup_py, self.name, + ) + else: + logger.debug( + 'Running setup.py (path:%s) egg_info for package from %s', + self.setup_py, self.link, + ) + script = SETUPTOOLS_SHIM % self.setup_py + base_cmd = [sys.executable, '-c', script] + if self.isolated: + base_cmd += ["--no-user-cfg"] + egg_info_cmd = base_cmd + ['egg_info'] + # We can't put the .egg-info files at the root, because then the + # source code will be mistaken for an installed egg, causing + # problems + if self.editable: + egg_base_option = [] # type: List[str] + else: + egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') + ensure_dir(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + with self.build_env: + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.setup_py_dir, + command_desc='python setup.py egg_info') + + @property + def egg_info_path(self): + # type: () -> str + if self._egg_info_path is None: + if self.editable: + base = self.source_dir + else: + base = os.path.join(self.setup_py_dir, 'pip-egg-info') + filenames = os.listdir(base) + if self.editable: + filenames = [] + for root, dirs, files in os.walk(base): + for dir in vcs.dirnames: + if dir in dirs: + dirs.remove(dir) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir in list(dirs): + # Don't search in anything that looks like a virtualenv + # environment + if ( + os.path.lexists( + os.path.join(root, dir, 'bin', 'python') + ) or + os.path.exists( + os.path.join( + root, dir, 'Scripts', 'Python.exe' + ) + )): + dirs.remove(dir) + # Also don't search through tests + elif dir == 'test' or dir == 'tests': + dirs.remove(dir) + filenames.extend([os.path.join(root, dir) + for dir in dirs]) + filenames = [f for f in filenames if f.endswith('.egg-info')] + + if not filenames: + raise InstallationError( + "Files/directories not found in %s" % base + ) + # if we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort( + key=lambda x: x.count(os.path.sep) + + (os.path.altsep and x.count(os.path.altsep) or 0) + ) + self._egg_info_path = os.path.join(base, filenames[0]) + return self._egg_info_path + + @property + def metadata(self): + # type: () -> Any + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + # type: () -> Distribution + """Return a pkg_resources.Distribution for this requirement""" + if self.metadata_directory: + base_dir, distinfo = os.path.split(self.metadata_directory) + metadata = pkg_resources.PathMetadata( + base_dir, self.metadata_directory + ) + dist_name = os.path.splitext(distinfo)[0] + typ = pkg_resources.DistInfoDistribution + else: + egg_info = self.egg_info_path.rstrip(os.path.sep) + base_dir = os.path.dirname(egg_info) + metadata = pkg_resources.PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + # https://github.com/python/mypy/issues/1174 + typ = pkg_resources.Distribution # type: ignore + + return typ( + base_dir, + project_name=dist_name, + metadata=metadata, + ) + + def assert_source_matches_version(self): + # type: () -> None + assert self.source_dir + version = self.metadata['version'] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + 'Requested %s, but installing version %s', + self, + version, + ) + else: + logger.debug( + 'Source in %s has version %s, which satisfies requirement %s', + display_path(self.source_dir), + version, + self, + ) + + # For both source distributions and editables + def ensure_has_source_dir(self, parent_dir): + # type: (str) -> str + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.build_location(parent_dir) + return self.source_dir + + # For editable installations + def install_editable( + self, + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + prefix=None # type: Optional[str] + ): + # type: (...) -> None + logger.info('Running setup.py develop for %s', self.name) + + if self.isolated: + global_options = list(global_options) + ["--no-user-cfg"] + + if prefix: + prefix_param = ['--prefix={}'.format(prefix)] + install_options = list(install_options) + prefix_param + + with indent_log(): + # FIXME: should we do --install-headers here too? + with self.build_env: + call_subprocess( + [ + sys.executable, + '-c', + SETUPTOOLS_SHIM % self.setup_py + ] + + list(global_options) + + ['develop', '--no-deps'] + + list(install_options), + + cwd=self.setup_py_dir, + ) + + self.install_succeeded = True + + def update_editable(self, obtain=True): + # type: (bool) -> None + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is " + "unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == 'file': + # Static paths don't get updated + return + assert '+' in self.link.url, "bad url: %r" % self.link.url + if not self.update: + return + vc_type, url = self.link.url.split('+', 1) + backend = vcs.get_backend(vc_type) + if backend: + vcs_backend = backend(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir) + else: + vcs_backend.export(self.source_dir) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.link, vc_type)) + + # Top-level Actions + def uninstall(self, auto_confirm=False, verbose=False, + use_user_site=False): + # type: (bool, bool, bool) -> Optional[UninstallPathSet] + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + if not self.check_if_exists(use_user_site): + logger.warning("Skipping %s as it is not installed.", self.name) + return None + dist = self.satisfied_by or self.conflicts_with + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _clean_zip_name(self, name, prefix): # only used by archive. + # type: (str, str) -> str + assert name.startswith(prefix + os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + def _get_archive_name(self, path, parentdir, rootdir): + # type: (str, str, str) -> str + path = os.path.join(parentdir, path) + name = self._clean_zip_name(path, rootdir) + return self.name + '/' + name + + # TODO: Investigate if this should be kept in InstallRequirement + # Seems to be used only when VCS + downloads + def archive(self, build_dir): + # type: (str) -> None + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.metadata["version"]) + archive_path = os.path.join(build_dir, archive_name) + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + display_path(archive_path), ('i', 'w', 'b', 'a')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warning('Deleting %s', display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warning( + 'Backing up %s to %s', + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) + if create_archive: + zip = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, + allowZip64=True + ) + dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dir_arcname = self._get_archive_name(dirname, + parentdir=dirpath, + rootdir=dir) + zipdir = zipfile.ZipInfo(dir_arcname + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + file_arcname = self._get_archive_name(filename, + parentdir=dirpath, + rootdir=dir) + filename = os.path.join(dirpath, filename) + zip.write(filename, file_arcname) + zip.close() + logger.info('Saved %s', display_path(archive_path)) + + def install( + self, + install_options, # type: List[str] + global_options=None, # type: Optional[Sequence[str]] + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + global_options = global_options if global_options is not None else [] + if self.editable: + self.install_editable( + install_options, global_options, prefix=prefix, + ) + return + if self.is_wheel: + version = wheel.wheel_version(self.source_dir) + wheel.check_compatibility(version, self.name) + + self.move_wheel_files( + self.source_dir, root=root, prefix=prefix, home=home, + warn_script_location=warn_script_location, + use_user_site=use_user_site, pycompile=pycompile, + ) + self.install_succeeded = True + return + + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + \ + self.options.get('global_options', []) + install_options = list(install_options) + \ + self.options.get('install_options', []) + + if self.isolated: + # https://github.com/python/mypy/issues/1174 + global_options = global_options + ["--no-user-cfg"] # type: ignore + + with TempDirectory(kind="record") as temp_dir: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = self.get_install_args( + global_options, record_filename, root, prefix, pycompile, + ) + msg = 'Running setup.py install for %s' % (self.name,) + with open_spinner(msg) as spinner: + with indent_log(): + with self.build_env: + call_subprocess( + install_args + install_options, + cwd=self.setup_py_dir, + spinner=spinner, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + self.install_succeeded = True + + def prepend_root(path): + # type: (str) -> str + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + with open(record_filename) as f: + for line in f: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + logger.warning( + 'Could not find .egg-info directory in install record' + ' for %s', + self, + ) + # FIXME: put the record somewhere + # FIXME: should this be an error? + return + new_lines = [] + with open(record_filename) as f: + for line in f: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath(prepend_root(filename), egg_info_dir) + ) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') + + def get_install_args( + self, + global_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + pycompile # type: bool + ): + # type: (...) -> List[str] + install_args = [sys.executable, "-u"] + install_args.append('-c') + install_args.append(SETUPTOOLS_SHIM % self.setup_py) + install_args += list(global_options) + \ + ['install', '--record', record_filename] + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + if prefix is not None: + install_args += ['--prefix', prefix] + + if pycompile: + install_args += ["--compile"] + else: + install_args += ["--no-compile"] + + if running_under_virtualenv(): + py_ver_str = 'python' + sysconfig.get_python_version() + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + py_ver_str, self.name)] + + return install_args diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 0000000..d1966a4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,193 @@ +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.logging import indent_log +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from typing import Dict, Iterable, List, Optional, Tuple + from pip._internal.req.req_install import InstallRequirement + + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, require_hashes=False, check_supported_wheels=True): + # type: (bool, bool) -> None + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 + self.require_hashes = require_hashes + self.check_supported_wheels = check_supported_wheels + + # Mapping of alias: real_name + self.requirement_aliases = {} # type: Dict[str, str] + self.unnamed_requirements = [] # type: List[InstallRequirement] + self.successfully_downloaded = [] # type: List[InstallRequirement] + self.reqs_to_cleanup = [] # type: List[InstallRequirement] + + def __str__(self): + # type: () -> str + reqs = [req for req in self.requirements.values() + if not req.comes_from] + reqs.sort(key=lambda req: req.name.lower()) + return ' '.join([str(req.req) for req in reqs]) + + def __repr__(self): + # type: () -> str + reqs = [req for req in self.requirements.values()] + reqs.sort(key=lambda req: req.name.lower()) + reqs_str = ', '.join([str(req.req) for req in reqs]) + return ('<%s object; %d requirement(s): %s>' + % (self.__class__.__name__, len(reqs), reqs_str)) + + def add_requirement( + self, + install_req, # type: InstallRequirement + parent_req_name=None, # type: Optional[str] + extras_requested=None # type: Optional[Iterable[str]] + ): + # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + name = install_req.name + + # If the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + name, install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + if self.check_supported_wheels and not wheel.supported(): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + # This next bit is really a sanity check. + assert install_req.is_direct == (parent_req_name is None), ( + "a direct req shouldn't have a parent and also, " + "a non direct req should have a parent" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not name: + # url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement(name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: %s (already in %s, name=%r)" + % (install_req, existing_req, name) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.requirements[name] = install_req + # FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + # We'd want to rescan this requirements later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = ( + install_req.link and + not ( + existing_req.link and + install_req.link.path == existing_req.link.path + ) + ) + if does_not_satisfy_constraint: + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % name, + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + existing_req.extras = tuple(sorted( + set(existing_req.extras) | set(install_req.extras) + )) + logger.debug( + "Setting %s extras to: %s", + existing_req, existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, project_name): + # type: (str) -> bool + name = project_name.lower() + if (name in self.requirements and + not self.requirements[name].constraint or + name in self.requirement_aliases and + not self.requirements[self.requirement_aliases[name]].constraint): + return True + return False + + def get_requirement(self, project_name): + # type: (str) -> InstallRequirement + for name in project_name, project_name.lower(): + if name in self.requirements: + return self.requirements[name] + if name in self.requirement_aliases: + return self.requirements[self.requirement_aliases[name]] + raise KeyError("No project with the name %r" % project_name) + + def cleanup_files(self): + # type: () -> None + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..e36a3f6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_tracker.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from types import TracebackType + from typing import Iterator, Optional, Set, Type + from pip._internal.req.req_install import InstallRequirement + from pip._internal.models.link import Link + +logger = logging.getLogger(__name__) + + +class RequirementTracker(object): + + def __init__(self): + # type: () -> None + self._root = os.environ.get('PIP_REQ_TRACKER') + if self._root is None: + self._temp_dir = TempDirectory(delete=False, kind='req-tracker') + self._temp_dir.create() + self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path + logger.debug('Created requirements tracker %r', self._root) + else: + self._temp_dir = None + logger.debug('Re-using requirements tracker %r', self._root) + self._entries = set() # type: Set[InstallRequirement] + + def __enter__(self): + # type: () -> RequirementTracker + return self + + def __exit__( + self, + exc_type, # type: Optional[Type[BaseException]] + exc_val, # type: Optional[BaseException] + exc_tb # type: Optional[TracebackType] + ): + # type: (...) -> None + self.cleanup() + + def _entry_path(self, link): + # type: (Link) -> str + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + # type: (InstallRequirement) -> None + link = req.link + info = str(req) + entry_path = self._entry_path(link) + try: + with open(entry_path) as fp: + # Error, these's already a build in progress. + raise LookupError('%s is already being built: %s' + % (link, fp.read())) + except IOError as e: + if e.errno != errno.ENOENT: + raise + assert req not in self._entries + with open(entry_path, 'w') as fp: + fp.write(info) + self._entries.add(req) + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + # type: (InstallRequirement) -> None + link = req.link + self._entries.remove(req) + os.unlink(self._entry_path(link)) + logger.debug('Removed %s from build tracker %r', req, self._root) + + def cleanup(self): + # type: () -> None + for req in set(self._entries): + self.remove(req) + remove = self._temp_dir is not None + if remove: + self._temp_dir.cleanup() + logger.debug('%s build tracker %r', + 'Removed' if remove else 'Cleaned', + self._root) + + @contextlib.contextmanager + def track(self, req): + # type: (InstallRequirement) -> Iterator[None] + self.add(req) + yield + self.remove(req) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..733301c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,633 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, + normalize_path, renames, rmtree, +) +from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Callable, Dict, Iterable, Iterator, List, Optional, Set, Tuple, + ) + from pip._vendor.pkg_resources import Distribution + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + # type: (Distribution, str, bool) -> List[str] + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + exe_name = os.path.join(bin_dir, script_name) + paths_to_remove = [exe_name] + if WINDOWS: + paths_to_remove.append(exe_name + '.exe') + paths_to_remove.append(exe_name + '.exe.manifest') + if is_gui: + paths_to_remove.append(exe_name + '-script.pyw') + else: + paths_to_remove.append(exe_name + '-script.py') + return paths_to_remove + + +def _unique(fn): + # type: (Callable) -> Callable[..., Iterator[Any]] + @functools.wraps(fn) + def unique(*args, **kw): + # type: (Any, Any) -> Iterator[Any] + seen = set() # type: Set[Any] + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + # type: (Distribution) -> Iterator[str] + """ + Yield all the uninstallation paths for dist based on RECORD-without-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + """ + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + path = os.path.join(dn, base + '.pyo') + yield path + + +def compact(paths): + # type: (Iterable[str]) -> Set[str] + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths = set() # type: Set[str] + for path in sorted(paths, key=len): + should_skip = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths): + # type: (Iterable[str]) -> Set[str] + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() # type: Set[str] + + def norm_join(*a): + # type: (str) -> str + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) + for w in wildcards): + # This directory has already been handled. + continue + + all_files = set() # type: Set[str] + all_subdirs = set() # type: Set[str] + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) + for d in subdirs) + all_files.update(norm_join(root, dirname, f) + for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +def compress_for_output_listing(paths): + # type: (Iterable[str]) -> Tuple[Set[str], Set[str]] + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = set(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + # probably this one https://github.com/python/mypy/issues/390 + _normcased_files = set(map(os.path.normcase, files)) # type: ignore + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.join(dirpath, fname) + if (os.path.isfile(file_) and + os.path.normcase(file_) not in _normcased_files): + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | { + os.path.join(folder, "*") for folder in folders + } + + return will_remove, will_skip + + +class StashedUninstallPathSet(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # type: () -> None + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} # type: Dict[str, TempDirectory] + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] # type: List[Tuple[str, str]] + + def _get_directory_stash(self, path): + # type: (str) -> str + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir = AdjacentTempDirectory(path) # type: TempDirectory + save_dir.create() + except OSError: + save_dir = TempDirectory(kind="uninstall") + save_dir.create() + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + # type: (str) -> str + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind='uninstall') + save_dir.create() + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path): + # type: (str) -> str + """Stashes the directory or file and returns its new location. + """ + if os.path.isdir(path): + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if os.path.isdir(path) and os.path.isdir(new_path): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self): + # type: () -> None + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self): + # type: () -> None + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logging.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug('Replacing %s from %s', new_path, path) + if os.path.isfile(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self): + # type: () -> bool + return bool(self._moves) + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + # type: (Distribution) -> None + self.paths = set() # type: Set[str] + self._refuse = set() # type: Set[str] + self.pth = {} # type: Dict[str, UninstallPthEntries] + self.dist = dist + self._moved_paths = StashedUninstallPathSet() + + def _permitted(self, path): + # type: (str) -> bool + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + # type: (str) -> None + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + # type: (str, str) -> None + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def remove(self, auto_confirm=False, verbose=False): + # type: (bool, bool) -> None + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + + dist_name_version = ( + self.dist.project_name + "-" + self.dist.version + ) + logger.info('Uninstalling %s:', dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + moved = self._moved_paths + + for_rename = compress_for_rename(self.paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.debug('Removing file or directory %s', path) + + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + # type: (bool) -> bool + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + # type: (str, Iterable[str]) -> None + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self.paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = set(self.paths) + will_skip = set() + + _display('Would remove:', will_remove) + _display('Would not remove (might be manually added):', will_skip) + _display('Would not remove (outside of prefix):', self._refuse) + if verbose: + _display('Will actually move:', compress_for_rename(self.paths)) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + # type: () -> None + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return + logger.info('Rolling back uninstall of %s', self.dist.project_name) + self._moved_paths.rollback() + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + # type: () -> None + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> UninstallPathSet + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + return cls(dist) + + if dist_path in {p for p in {sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib")} + if p}: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.project_name, + ) + ) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (link_pointer, dist.project_name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location, + ) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + _scripts_to_remove = [] + console_scripts = dist.get_entry_map(group='console_scripts') + for name in console_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, False)) + # find gui_scripts + gui_scripts = dist.get_entry_map(group='gui_scripts') + for name in gui_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, True)) + + for s in _scripts_to_remove: + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + # type: (str) -> None + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() # type: Set[str] + self._saved_lines = None # type: Optional[List[bytes]] + + def add(self, entry): + # type: (str) -> None + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + # type: () -> None + logger.debug('Removing pth entries from %s:', self.file) + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + # type: () -> bool + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/resolve.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/resolve.py new file mode 100644 index 0000000..f49667b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/resolve.py @@ -0,0 +1,393 @@ +"""Dependency Resolution + +The dependency resolution in pip is performed as follows: + +for top-level requirements: + a. only one spec allowed per project, regardless of conflicts or not. + otherwise a "double requirement" exception is raised + b. they override sub-dependency requirements. +for sub-dependencies + a. "first found, wins" (where the order is breadth first) +""" + +import logging +from collections import defaultdict +from itertools import chain + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, + UnsupportedPythonVersion, +) +from pip._internal.req.constructors import install_req_from_req_string +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_in_usersite, ensure_dir +from pip._internal.utils.packaging import check_dist_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, DefaultDict, List, Set + from pip._internal.download import PipSession + from pip._internal.req.req_install import InstallRequirement + from pip._internal.index import PackageFinder + from pip._internal.req.req_set import RequirementSet + from pip._internal.operations.prepare import ( + DistAbstraction, RequirementPreparer + ) + from pip._internal.cache import WheelCache + +logger = logging.getLogger(__name__) + + +class Resolver(object): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__( + self, + preparer, # type: RequirementPreparer + session, # type: PipSession + finder, # type: PackageFinder + wheel_cache, # type: Optional[WheelCache] + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + isolated, # type: bool + upgrade_strategy, # type: str + use_pep517=None # type: Optional[bool] + ): + # type: (...) -> None + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + self.preparer = preparer + self.finder = finder + self.session = session + + # NOTE: This would eventually be replaced with a cache that can give + # information about both sdist and wheels transparently. + self.wheel_cache = wheel_cache + + # This is set in resolve + self.require_hashes = None # type: Optional[bool] + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.isolated = isolated + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + self.use_pep517 = use_pep517 + + self._discovered_dependencies = \ + defaultdict(list) # type: DefaultDict[str, List] + + def resolve(self, requirement_set): + # type: (RequirementSet) -> None + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + # make the wheelhouse + if self.preparer.wheel_download_dir: + ensure_dir(self.preparer.wheel_download_dir) + + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + self.require_hashes = ( + requirement_set.require_hashes or + any(req.has_hash_options for req in root_reqs) + ) + + # Display where finder is looking for packages + locations = self.finder.get_formatted_locations() + if locations: + logger.info(locations) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] # type: List[InstallRequirement] + hash_errors = HashErrors() + for req in chain(root_reqs, discovered_reqs): + try: + discovered_reqs.extend( + self._resolve_one(requirement_set, req) + ) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + def _is_upgrade_allowed(self, req): + # type: (InstallRequirement) -> bool + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.is_direct + + def _set_req_to_reinstall(self, req): + # type: (InstallRequirement) -> None + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or dist_in_usersite(req.satisfied_by): + req.conflicts_with = req.satisfied_by + req.satisfied_by = None + + # XXX: Stop passing requirement_set for options + def _check_skip_installed(self, req_to_install): + # type: (InstallRequirement) -> Optional[str] + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return 'already satisfied, skipping upgrade' + return 'already satisfied' + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return 'already up-to-date' + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _get_abstract_dist_for(self, req): + # type: (InstallRequirement) -> DistAbstraction + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + assert self.require_hashes is not None, ( + "require_hashes should have been set in Resolver.resolve()" + ) + + if req.editable: + return self.preparer.prepare_editable_requirement( + req, self.require_hashes, self.use_user_site, self.finder, + ) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement( + req, self.require_hashes, skip_reason + ) + + upgrade_allowed = self._is_upgrade_allowed(req) + abstract_dist = self.preparer.prepare_linked_requirement( + req, self.session, self.finder, upgrade_allowed, + self.require_hashes + ) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" or + self.force_reinstall or + self.ignore_installed or + req.link.scheme == 'file' + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + 'Requirement already satisfied (use --upgrade to upgrade):' + ' %s', req, + ) + + return abstract_dist + + def _resolve_one( + self, + requirement_set, # type: RequirementSet + req_to_install # type: InstallRequirement + ): + # type: (...) -> List[InstallRequirement] + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # register tmp src for cleanup in case something goes wrong + requirement_set.reqs_to_cleanup.append(req_to_install) + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.dist() + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as err: + if self.ignore_requires_python: + logger.warning(err.args[0]) + else: + raise + + more_reqs = [] # type: List[InstallRequirement] + + def add_req(subreq, extras_requested): + sub_install_req = install_req_from_req_string( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self.wheel_cache, + use_pep517=self.use_pep517 + ) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append( + add_to_parent + ) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + req_to_install.is_direct = True + requirement_set.add_requirement( + req_to_install, parent_req_name=None, + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + '%s does not provide the extra \'%s\'', + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + requirement_set.successfully_downloaded.append(req_to_install) + + return more_reqs + + def get_installation_order(self, req_set): + # type: (RequirementSet) -> List[InstallRequirement] + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() # type: Set[InstallRequirement] + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52f4e5b47442fac1f642b85436b119e1c073d555 GIT binary patch literal 200 zcmZ?b<>g`kf<1{+u^{>}h=2h`Aj1KOi&=m~3PUi1CZpd};mRORi zUzS*;pO&AKl3G-(pIfA#locOuQEZxLUY25#9A8joWKfc3k)BnQW0+=YX{jHgUyxa# zo0(T!l9-dDTTzf#Zk(J|1rh|~_{_YL)S|q^9R1Rg%$#EVc%VRLNqoFsLFFwDo80`A O(wtN~kW-3*m;nHsj5Y57 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adeaa7ef1dea96ffc24c242b042211ce5c6b3437 GIT binary patch literal 8031 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1ad426c520f22c033c5b2efe14d2266a8231f90 GIT binary patch literal 2609 zcmaJ@+inv_7~Yc)ahwnWp)D$CB&xQSirvy8AgU_TKmoNF1hl|P)pooyb~f2lXJ#Fo znwy5(N__;l>^tNs`#kHjF*Uh(D+(?@Kk{Q?IR+B?3X6+ZYe~PWJ)fbk3 znys@FYz>kP=03DKrw;n9Es|uch&fR^RFNpjW1jF-NushWj?xi&!c#iH3QpyO>{F3K zED0TCg(8gSf`?Q^St`4&*ND>U*yRa2kXc+P9zbCxR3EZhPKD$cEC<1u3yB>;fa&_( zr}v)*+qZ9Se;YjbzTdyoztwR{cPpKg&3n04Oyh%<8#nJixVgRc=+3?VCJD8fqsPYJ zI$jCvEpGWXV0M^|@SJkvew5!h_V97#d%xqB%^*l=!h@h}1wn-X#_b^Zxu9|NPu7sp7pc6}@2=GlbAfL~pPg1Xtzd^valh5eE7A(x+;8b+jwu&xV(;UF$vS z#ev-Xz62MU>n{s(1Et*JeArtZ|6)((+X=_O@PZRH#~;)ZfxBI91!&+F6r z%i7d>W#jw$+k2R$q3j==h0oo&zug5-Wv5`^z;le zqvQCb#0rqWK`wZ4P6M=##rq$LlobGT;N$hn2IE6o#Oe`px=!<)rwq6>kM2v^mgaK7cbvEZL#)C? zxxC=1ac3bGlYb_lGqV&5X8M9E?k+S)oh6pL<~8lQEeOV;rXBt0RG9~)Fww{Rj`iG| zA}plHd8CZ<5-IV@zM`d|B1o?@S0QN*ZLF+eg@+Zj*$Uh&toTW}$~&}`J9Q52y&C3N zcWD1=tNLzZ>Zuy5vAPD#+`|U_3;BDS$2k|8PL5IsjPfj!N|Vg6NWWY!}cP0=;@=cv&hswF80q5zl7pyxom&Y_T zhns>9$9!(>jo7re6B5!?yIdI_Whr=aF;E0FV@Q$>3GN+X z83!Z39Th+*Vn%S6085gMIU`Y8snw7@ppnEzRUJwd#F0ygNI2m%z1~4WKo@|jkgFCt+ zE*K&J@t5b_g9|%K<#Myv8%1iT7<9ud>E)B08oD?3W$&O%o@Rx~0u$*%go2N#V5aWs z(}ovN`dZU}#}TK|l`WK#a4+U#9(S7MnT5g_+L0{c8ff`G8V}V4kvnatjge=sxgH4G^I9jH?SBE-!sL?x literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ed9421d598218606301be1999645c3cf391ffef GIT binary patch literal 1284 zcmZuvOK;mo5Z>iW5+%Ed;}ov@0D)Z029jc_Nu8oC0?Sfc)KP-OX%NPSKyg33=-TzeMip z6=*|k7pt|WZ=S#DG`?*%zVEzv)oy>+{>Ignu^$Sl%!5(Fs4@=dxx6q(vRB@@uu|B5 zbWxaNxl5NWqx02zZ62!EmaE`0D&B{lK}^D^|MrWojt<4ATW`yUXO*M-Zh%ugFyJte z39|uH{0`>)fkb=gXzNhB#FyFxP4NWJFt;X1Y7_h;CirLV12okq+6*@K&U%f`e}F85 z04JE}=_>sHsM~stpsFtO(*nuQ zaPph9r^Ojcd%A^-Um61%oH)MI9ZM=4Avx^P>BSsEyU(6FGIoNPa~eoCb_kW=IC4N8 z8qJTxwjCHPpRukFbs(L^fzN2APi4YskHWuXk-P~VIC7qkX28v$DPiOco=(eObXE_JFVbK(J7FX#k9<}g$&iWaqIo45tD--Wac92$ z4bULgz#wxK+jvvkz?*mjuVMr9k0I*bRaSaTf#7$5DveWqH+43lQ)Stul69%baRRS_ zrx&8EYoY_;>09UNV^?{&jn1os){ZJ%d)tpxY3X)$n>X2hbD37JEf?ywn`yxIo4lA7 z&js-?2^rNbMn!f+B%syqm^}|CrsR334u! z1CNm$c?X`v2QHj=1y0PmfEa6jc4l_I+0W1S_BxE@TXgXDyT#ZKbNDNqf^$;!fQ(=Q zQZ~Nz(0HEm%o7 zRHQZ5yim1mUQ;`%TqQ~?G*3apQtez0ULqD)x1%_giaJN(;2E(9C%EKgAI!e>SRheHuiDw^8ve7WfwWJ-=V4;(PI|YOS=)`sKRr#Zwv2 zZ~swoolA6R6?LBsvpZmO8#>@|&*I=g7uw+R9=`|Jqq^V17P;CfRKH>6fFS$-;Q9?* jKQ1yVHXJp#nz#OE?wS$qv#bz{RGt~ml_AO{B+vQ{OyH_^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5fcd49616749f0a50f9ce63df0688c3e92d03ce9 GIT binary patch literal 1688 zcmZ8h-E!PC6qaPK*Ku|ONdrvF3>YX(JS4lN(4k>U`AL(OAuO3BOzA?$<5=2V@A?l( z-ZUBKD!c(NkX-T(JO!7!<%(C}iX&|TP2|xz^09P$biVVQuiI@8!T2M(_59BkLVxL( z%RylAB}_2_K@r6%%5WcJy(TH?6QixZWwhP5L0f4fbNUWO%;AsV-A8}9zl>wVLE91!JxU&^G&qf|Bat1@M=_MnFa(}lSKQ|y3{=nPYQj!)2$SEDgG z!B0`XY$It+JidaFekk5UKf=zjUE{D(<5P4(q*D{wJSAegCTA`s;DOXSTI+aym&uCf z!XKu|LF`W%7Z8gtBv10;s$X!wSLDo327X>hzY<`bZSC|_BNB0v1ar!X!~DUWG#@L+vrV@TeBPlHl_I60*s8!Ic|_@hIY9shXS#eO`G9xEC_YW2P*KKsl7f z1!aMy7E4~lOo%X#GA7C>W_%73qUJB$hp_#3#FxPKPu?wgGL0nbP9xqO6e)#Ebu->Q z7>D6~aWDULNM|Ys{8GAlJhLdw9WeEEhY(!ye)KL#*M|!@igX<|ptn zgSkfMj--7~0Agzo$wqCRIn+MKr?|!wQfysV8pc8<4S?6_9p7I0 zV&_2?jSK$pr#oxw&p!-)?if>&|8F|}eDg)gV#(;WGB`}+$iM5y1(a~kaw&Y{s*~x{ ztNyT%pZV{LE!8k)P}&|e72!-=zL6SV*M#QbTW;xO_=-N#Yt(4?KdT2c)+Z%+ND_0*mWI{B13C z=+^^#Z4^yesM8n8!7hZw--UIo4SHahI>4(zp&F=df&$`Ft40H@ zA;7>s{%xNh`LggSg9?QtF<*|@RVY2rhjB^v$d|g)_{HFY>B3)uB3`}Zf8ZaEl6V9T z2T_$u?VDw#Ji6R%oF%y*M`HG`v?wN3=?@}cM#p^ZL1#n!J-7#;s|gZdQ})mX+gE_P zo-_B7O}lV*mZqjj6X73#C0I~i7!E4vS}Y8?P84ry@rD*RL8x0m+0K7-?HIatpu<2F za!YS;E?zYByrG3Aq=D2xVSe;dT)M4rQ)%vlte{oO9%_&bzgxrw3|-P9Hh$G|-*gw< GoBslZ{=B9D literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec2412608069917d3a8899cc05e76029bda76d93 GIT binary patch literal 3607 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 BwL$;@ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f80c1636a763bb8f8e0aa0f850f223b4188eb8d5 GIT binary patch literal 1949 zcmbtUOK;Oa5Z<+&N7JP5N{B*bBrZ9$;Z@N}fU5R@5F$bXBoqm)9M7h4aBO#X8`>(j z_J_cc|G+Qtl@ot~6EjXy+Nh;LU2A5%-tp`=&z(x8#BlxaZhu;E82d?^(ZW63M$#@a zU=0QwtdKYOO9nPLrwklvo!AWrGj5>WCjIQt*dtGXc@Lrn@(pg9)4%4h<1O+wL}Fy&&XQOQ?*tcf>gTJRkdbEh)ul_ zJ?+60UnIRp4@_%wucN|;t&Od%+WT4(Bx^yWjTeS%he`D1vEMnSj~R&|GEzleSUbQ3 zqQNX*>&a1C6nGXGA*RVUst3mN{P^x=;anf-`keG|kvt0wm6>6E*5N076cVTH>9(Ty zRk_Nc$lM&TDcsWiq$0#D?ljqASKmI+^fN6~BuR*~w9Md3pMAyD7~ZkIQN3bPY`kEY zl(ZNpQh6p;XQWzA8TNA(_J2!!GO*9q}!pbBtZWax>|L>$MA%xWlV33^~ zL?gN;8dMkeCV)Y9E(|kj$gFF~3G7)MXV|rto-^1tG}bzHpLgt&VHY`R2`48Fm&lij zS}vWb$L3Wx31wH}Xn{eC+k+OTGEVbdY1%Q2mowG=eI%Vn#(0@K)>Xr1*thj+g{DO0 zb4cd^V?l?x8 yD+MG?x<$*eicZl!|0vR^I_eIJVI#-Qj`U4-aL!z2eK6;q4Pd{ZU$Z%jX6-+?v!)vW literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3621ccd9d37ebc3dde4071fec68b1d37958d27 GIT binary patch literal 3950 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9112323bac9401fcd1adbefbdc134b51bd2326b GIT binary patch literal 395 zcmYLFO-sW-5Z%^G5yYDZPq|34kaqnlw#14Ef`VEh^&*vJo1K)co9wdL#I}D({15(; zUi}xI+!TTX?>%PbF~iKw-rg>9@y!n34q6EP)JYRAN7oKT#}P-bh__;d+v`t}X=SWe zfGxFEN*1AK)jQ;34H2cOkU;6^$VBOA4whMKf~FmMzS5BUp;rqI8aIv-#bK283@{#G zCt9)u0)J|zwcB@$qqLVuRX~6vSV9scD${P4Qx2imjB@6>>tp)0OK9hc5Tn#$!Q#X!JP0tEu} zVkt{B>B&^-q%Zjo(p%f7{(w$@2>RHk{DnOAI}4B!WohzOaCR4$-E+>K>$m)TW~Rz; z{mZ@Z^?%MW_FsA!T^4SBi}l5=JvD zcPh;aXTsXAim3zMoPNxF%P)M({DPR-Gn+L$7yS~ROQMG7S>IS;_3{tk$?80vb=Q+P z>?z>{oo*~u1MiBmqofcXO&MJzEM3X(&lqJ7%$F6@r{eXI4e0`!JBgQ?cB2KQS45BEqhawimidVyjJ8 z+3~9=vE9hWJK^HC*R@?+VPPy?xoi8QL8`H^3#9`h8?Se{M_Bl_C+5a#avVcHFXEP49G0_mz^tI`o&^(KCsA*HxS22YT@= z_A-Jh#&(45N#QEUa{^fsrx8bDyxtd~P=}91Zf#S5iqxdWJGYa~xEK1g*KCPzzuFX$ zEp`GGL>pszL|{RGc}pd^M(UXke-9?He`H&k)C=_qQV;Z2NUtYthAfuAtRk@km1xD- zL8JwLOG)lXlS^X;+StABF_sUtM#wS5=}g6l-I%NmGEkvLEuQ+;(xK z>A+Wngnl!-=B|ZpFWNyXGmw_nJ`@8qR%K5t+HkPkI5bgH8~Nr@Cpok*R_3P7RMbc< zQo1*aO&ZO-CAV;+nBoJrXY3mXjI#k^cB?Ee4v<)A^!d;j;JafE4D{B(L|^b3qS9!r z){AK&=^+dykxk2v6GVY>oYW%ArNvB=)Y=Lnziy>gBEps|W2&rBM`;hKq~bU_iXG?g z?8leOT^Ve{^Ov_>x!j6FU&v&+BbV3Pj&m!y5q-ApU-z8u_SGw@b!($7!%tf`Zr@&B zUG4_m%R!VVHw-WDbfZ_-ymp^n>IT7JgUAh+dnyQ%WzvZQtu1wTWeH+@f|g99W4va} znU+!HMc)7U>d~~bG}@lWX(BEfY3C2nlC$W1zRw1%&D&5`+dQBwYBc(lyRV1#>yPB{ z9+XgQ#j@inNz6!Nk=qfDqqS1!atd$d%($!NlPKpn&NVzG20C_vXxWqr(P*j`jd%^% zKGPN^+i{)3GdDejE3BgZ)^ToPbwb-@yv+OOkLx6#HQ`}n&ZHEmg2@{AbK*b}Lt)=$s{#e?JAITY$7LuHdDv{A$gt&P=OCZBIrkRbWK z;T!w#>oz;!2OJXe6{f5<+b^hMyX2etTloO>>wA2M|080srf_^sz1V-0r8@g3GTlU? zqo7!t$aIbVuU58#ZWq~Kn?0*&X}!uwNq2e?7cRRT-tJ73}ms%;Y$+deEAB zMLS$t4C4*dx3u7k_1=b@g=SJCPSP?GSg2#TOk7(*DAH1A%cqAtY)^7kN#?$XmXPBz zv&t=mlT|44d82=B(s459o3N0HHQGXpxFLIJ3tdzkwxEE5edI-@Ew!iZM7AJn)s6md zz7(B!8_E8ZgrBiPc}KOO@~u#FkY&bYqyY!indv?7PK)rLL?x0WIypWhkQ#fAmXKdD zbDmdu|D9u7BplM~*3Cvk7BHzkCFd}tRmbVXelJAar_+w}vgd|b7D!8uzJRC{>XNjtQ!?FXTa?dRMs2!mmM#3w=x-jrjV~SE zcuFX)CZL-Ez*ap1-wL9b0k}O5$d*C4vW99E7-A}Y=f2-|JtTz*UAX^1u6!G^WmY*A z8RV3xD!Z_n8=@YH9KM|ds$v;z1W58@s}hh|g-47&9D+cinQ;eca_b|Xkf9Ip#YAKh zz56Xx65B(Wp^~1_Sf~>w8`b$mjUQbUBkhi@UN|WcktF`7`063=tbR`H=Kq81`m>kc zEdBb@l~1o;yME*5XSZ%QJPHN6XdJcVA|6Hn0yPg{|9eg#V&C))ohor2fmfI)H#*(- zjpeWE1xXXBQw>_EW1!u*6T)&tvy|PH!Td&^1^hM_dht%@eYf& zE}U3Fkw^k~wECaucA5%V1Sp8_@jc@q`})by*!f&#HNm1y&9eh~zc|FUP!9?N^MIen zHu25+i}5Zy&xY2(8t^SsE)1+cpvt{mSYt2e*4R!XQ%~ChZ4MfDLHp(*ZB6&%<8+VE z`zELN4d{hyIJQBZ1$P?J^jJhfB85@(B*2%r!C8b{IV%#BQj$Da$ZshQ+;9UrR+}9< z#e@jc%tMi-PH=uZiz=_D%|6XAwMPPp3a;30Qr~}`o`jG4<;B9+j5{ovD zJT^^=Vl}3bE$F)577kXnmeF27z}f3Dh<~w*^F*YRG>RIKY>NOT>L2ZGOe0@iKMa%~ z2#Nj3-=wTTm{hvahDgm&L}?|!c2pdPN&3DQch->}G(Cql$3avtq^5_Z773d2Ag$o2=m$R3o|Yr=N~5>K{HqghI_qrYrqQ31E;$-y za8@}7RC$(P0FJ7ebYH_0Fx90~Tz8VrxK@()5>R}Ami!x?0_4;c5`OuWF$8Ac=>l)T zcMr(t)`zB^QGmw+ln$-knqvFKfkkL%jYU^1rb=5?8F4l&aMnLND74F}+^)c%|MX|f z@bMcK-V|Q2KeCq}yvX=fX+0`1{{rvUH0(|OrukIWRC^jwcm_4Q2Ha%ixQVOT{W-)B zy$6!gSc}qw)i{D-09b8YjE%}O*k11P_|t|OX$#5p0SF+1J?As&cgLMf+Ve;>Pb3^P@K5@)hgeoxDHGl+DLB3qxWrj0UUMgNRxqiW7Q{T~!x{+<8; literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..308a8cccb4ec78ff1ffdc927c25721746144e278 GIT binary patch literal 1330 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..fb26111 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py @@ -0,0 +1,268 @@ +""" +This code was taken from https://github.com/ActiveState/appdirs and modified +to suit our purposes. +""" +from __future__ import absolute_import + +import os +import sys + +from pip._vendor.six import PY2, text_type + +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List + + +def user_cache_dir(appname): + # type: (str) -> str + r""" + Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + + Typical user cache directories are: + macOS: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Windows: C:\Users\\AppData\Local\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go + in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the + non-roaming app data dir (the default returned by `user_data_dir`). Apps + typically put cache data somewhere *under* the given dir here. Some + examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + """ + if WINDOWS: + # Get the base path + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + + # When using Python 2, return paths as bytes on Windows like we do on + # other operating systems. See helper function docs for more details. + if PY2 and isinstance(path, text_type): + path = _win_path_to_bytes(path) + + # Add our app name and Cache directory to it + path = os.path.join(path, appname, "Cache") + elif sys.platform == "darwin": + # Get the base path + path = expanduser("~/Library/Caches") + + # Add our app name to it + path = os.path.join(path, appname) + else: + # Get the base path + path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) + + # Add our app name to it + path = os.path.join(path, appname) + + return path + + +def user_data_dir(appname, roaming=False): + # type: (str, bool) -> str + r""" + Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: ~/Library/Application Support/ + if it exists, else ~/.config/ + Unix: ~/.local/share/ # or in + $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\ ... + ...Application Data\ + Win XP (roaming): C:\Documents and Settings\\Local ... + ...Settings\Application Data\ + Win 7 (not roaming): C:\\Users\\AppData\Local\ + Win 7 (roaming): C:\\Users\\AppData\Roaming\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if WINDOWS: + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) + elif sys.platform == "darwin": + path = os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) if os.path.isdir(os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) + ) else os.path.join( + expanduser('~/.config/'), + appname, + ) + else: + path = os.path.join( + os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), + appname, + ) + + return path + + +def user_config_dir(appname, roaming=True): + # type: (str, bool) -> str + """Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default True) can be set False to not use the + Windows roaming appdata directory. That means that for users on a + Windows network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: same as user_data_dir + Unix: ~/.config/ + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if WINDOWS: + path = user_data_dir(appname, roaming=roaming) + elif sys.platform == "darwin": + path = user_data_dir(appname) + else: + path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) + path = os.path.join(path, appname) + + return path + + +# for the discussion regarding site_config_dirs locations +# see +def site_config_dirs(appname): + # type: (str) -> List[str] + r"""Return a list of potential user-shared config dirs for this application. + + "appname" is the name of application. + + Typical user config directories are: + macOS: /Library/Application Support// + Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in + $XDG_CONFIG_DIRS + Win XP: C:\Documents and Settings\All Users\Application ... + ...Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory + on Vista.) + Win 7: Hidden, but writeable on Win 7: + C:\ProgramData\\ + """ + if WINDOWS: + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + pathlist = [os.path.join(path, appname)] + elif sys.platform == 'darwin': + pathlist = [os.path.join('/Library/Application Support', appname)] + else: + # try looking in $XDG_CONFIG_DIRS + xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + if xdg_config_dirs: + pathlist = [ + os.path.join(expanduser(x), appname) + for x in xdg_config_dirs.split(os.pathsep) + ] + else: + pathlist = [] + + # always look in /etc directly as well + pathlist.append('/etc') + + return pathlist + + +# -- Windows support functions -- + +def _get_win_folder_from_registry(csidl_name): + # type: (str) -> str + """ + This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + directory, _type = _winreg.QueryValueEx(key, shell_folder_name) + return directory + + +def _get_win_folder_with_ctypes(csidl_name): + # type: (str) -> str + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + + +if WINDOWS: + try: + import ctypes + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +def _win_path_to_bytes(path): + """Encode Windows paths to bytes. Only used on Python 2. + + Motivation is to be consistent with other operating systems where paths + are also returned as bytes. This avoids problems mixing bytes and Unicode + elsewhere in the codebase. For more details and discussion see + . + + If encoding using ASCII and MBCS fails, return the original Unicode path. + """ + for encoding in ('ASCII', 'MBCS'): + try: + return path.encode(encoding) + except (UnicodeEncodeError, LookupError): + pass + return path diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py new file mode 100644 index 0000000..845436e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/compat.py @@ -0,0 +1,264 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" +from __future__ import absolute_import, division + +import codecs +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import text_type + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Text + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress # type: ignore + ipaddress.ip_network = ipaddress.IPNetwork # type: ignore + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", "native_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", + "get_extension_suffixes", +] + + +logger = logging.getLogger(__name__) + +if sys.version_info >= (3, 4): + uses_pycache = True + from importlib.util import cache_from_source +else: + import imp + + try: + cache_from_source = imp.cache_from_source # type: ignore + except AttributeError: + # does not use __pycache__ + cache_from_source = None + + uses_pycache = cache_from_source is not None + + +if sys.version_info >= (3, 5): + backslashreplace_decode = "backslashreplace" +else: + # In version 3.4 and older, backslashreplace exists + # but does not support use for decoding. + # We implement our own replace handler for this + # situation, so that we can consistently use + # backslash replacement for all versions. + def backslashreplace_decode_fn(err): + raw_bytes = (err.object[i] for i in range(err.start, err.end)) + if sys.version_info[0] == 2: + # Python 2 gave us characters - convert to numeric bytes + raw_bytes = (ord(b) for b in raw_bytes) + return u"".join(u"\\x%x" % c for c in raw_bytes), err.end + codecs.register_error( + "backslashreplace_decode", + backslashreplace_decode_fn, + ) + backslashreplace_decode = "backslashreplace_decode" + + +def console_to_str(data): + # type: (bytes) -> Text + """Return a string, safe for output, of subprocess output. + + We assume the data is in the locale preferred encoding. + If it won't decode properly, we warn the user but decode as + best we can. + + We also ensure that the output can be safely written to + standard output without encoding errors. + """ + + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + decoded_data = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + "Subprocess output does not appear to be encoded as %s", + encoding, + ) + decoded_data = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) + + return decoded_data + + +if sys.version_info >= (3,): + def native_str(s, replace=False): + # type: (str, bool) -> str + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def native_str(s, replace=False): + # type: (str, bool) -> str + # Replace is ignored -- unicode to UTF-8 can't fail + if isinstance(s, text_type): + return s.encode('utf-8') + return s + + +def get_path_uid(path): + # type: (str) -> int + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +if sys.version_info >= (3, 4): + from importlib.machinery import EXTENSION_SUFFIXES + + def get_extension_suffixes(): + return EXTENSION_SUFFIXES +else: + from imp import get_suffixes + + def get_extension_suffixes(): + return [suffix[0] for suffix in get_suffixes()] + + +def expanduser(path): + # type: (str) -> str + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + # type: (str, str) -> bool + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) # type: ignore +else: + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except Exception: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except Exception: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..8c896f8 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,93 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" +from __future__ import absolute_import + +import logging +import warnings + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional + + +DEPRECATION_MSG_PREFIX = "DEPRECATION: " + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning = None # type: Any + + +# Warnings <-> Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _original_showwarning is not None: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + elif issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + logger.warning(message) + else: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # type: () -> None + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated(reason, replacement, gone_in, issue=None): + # type: (str, Optional[str], Optional[str], Optional[int]) -> None + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises errors if pip's current version is greater than or equal to + this. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + + Always pass replacement, gone_in and issue as keyword arguments for clarity + at the call site. + """ + + # Construct a nice message. + # This is purposely eagerly formatted as we want it to appear as if someone + # typed this entire message out. + message = DEPRECATION_MSG_PREFIX + reason + if replacement is not None: + message += " A possible replacement is {}.".format(replacement) + if issue is not None: + url = "https://github.com/pypa/pip/issues/" + str(issue) + message += " You can find discussion regarding this at {}.".format(url) + + # Raise as an error if it has to be removed. + if gone_in is not None and parse(current_version) >= parse(gone_in): + raise PipDeprecationWarning(message) + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..30139f2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,39 @@ +import codecs +import locale +import re +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Text + +BOMS = [ + (codecs.BOM_UTF8, 'utf-8'), + (codecs.BOM_UTF16, 'utf-16'), + (codecs.BOM_UTF16_BE, 'utf-16-be'), + (codecs.BOM_UTF16_LE, 'utf-16-le'), + (codecs.BOM_UTF32, 'utf-32'), + (codecs.BOM_UTF32_BE, 'utf-32-be'), + (codecs.BOM_UTF32_LE, 'utf-32-le'), +] # type: List[Tuple[bytes, Text]] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + # type: (bytes) -> Text + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..1e6b033 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,30 @@ +import os +import os.path + +from pip._internal.utils.compat import get_path_uid + + +def check_path_owner(path): + # type: (str) -> bool + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if not hasattr(os, "geteuid"): + return True + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) + return False # assume we don't own the path diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..5bea655 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import + +import ctypes +import re +import warnings + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + + +def glibc_version_string(): + # type: () -> Optional[str] + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # type: (str, int, int) -> bool + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + # type: (int, int) -> bool + version_str = glibc_version_string() # type: Optional[str] + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + # type: () -> Tuple[str, str] + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..a714206 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,115 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, HashMissing, InstallationError, +) +from pip._internal.utils.misc import read_chunks +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash + else: + from hashlib import _hash as _Hash + + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=None): + # type: (Dict[str, List[str]]) -> None + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + def check_against_chunks(self, chunks): + # type: (Iterator[bytes]) -> None + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + # type: (BinaryIO) -> None + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + # type: (str) -> None + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + # type: () -> bool + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + # type: () -> bool + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + # type: () -> None + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 0000000..a28e88c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,371 @@ +from __future__ import absolute_import + +import contextlib +import errno +import logging +import logging.handlers +import os +import sys +from logging import Filter + +from pip._vendor.six import PY2 + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX +from pip._internal.utils.misc import ensure_dir, subprocess_logger + +try: + import threading +except ImportError: + import dummy_threading as threading # type: ignore + + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + + +_log_state = threading.local() +_log_state.indentation = 0 + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, manifests +# differently in Windows and non-Windows. +if WINDOWS: + # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + def __init__(self, *args, **kwargs): + """ + A logging.Formatter that obeys the indent_log() context manager. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def get_message_start(self, formatted, levelno): + """ + Return the start of the formatted log message (not counting the + prefix to add to each line). + """ + if levelno < logging.WARNING: + return '' + if formatted.startswith(DEPRECATION_MSG_PREFIX): + # Then the message already has a prefix. We don't want it to + # look like "WARNING: DEPRECATION: ...." + return '' + if levelno < logging.ERROR: + return 'WARNING: ' + + return 'ERROR: ' + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = super(IndentingFormatter, self).format(record) + message_start = self.get_message_start(formatted, record.levelno) + formatted = message_start + formatted + + prefix = '' + if self.add_timestamp: + prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") + prefix += " " * get_indentation() + formatted = "".join([ + prefix + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(colorama.Fore.RED)), + (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None, no_color=None): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + + def should_color(self): + # Don't colorize things if we do not have colorama or if told not to + if not colorama or self._no_color: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ANSI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + # The logging module says handleError() can be customized. + def handleError(self, record): + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if (exc_class and self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level + + +class ExcludeLoggerFilter(Filter): + + """ + A logging Filter that excludes records from a logger (or its children). + """ + + def filter(self, record): + # The base Filter class allows only records from a logger (or its + # children). + return not super(ExcludeLoggerFilter, self).filter(record) + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 1: + level = "DEBUG" + elif verbosity == -1: + level = "WARNING" + elif verbosity == -2: + level = "ERROR" + elif verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + level_number = getattr(logging, level) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.ColorizedStreamHandler", + "file": "pip._internal.utils.logging.BetterRotatingFileHandler", + } + handlers = ["console", "console_errors", "console_subprocess"] + ( + ["user_log"] if include_user_log else [] + ) + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + "restrict_to_subprocess": { + "()": "logging.Filter", + "name": subprocess_logger.name, + }, + "exclude_subprocess": { + "()": "pip._internal.utils.logging.ExcludeLoggerFilter", + "name": subprocess_logger.name, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_subprocess", "exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["exclude_subprocess"], + "formatter": "indent", + }, + # A handler responsible for logging to the console messages + # from the "subprocessor" logger. + "console_subprocess": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "filters": ["restrict_to_subprocess"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": handlers, + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 0000000..ca7a529 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,1011 @@ +from __future__ import absolute_import + +import contextlib +import errno +import io +# we have a submodule named 'logging' which would shadow this if we used the +# regular name: +import logging as std_logging +import os +import posixpath +import re +import shutil +import stat +import subprocess +import sys +import tarfile +import zipfile +from collections import deque + +from pip._vendor import pkg_resources +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 +from pip._vendor.six.moves import input, shlex_quote +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote + +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import ( + running_under_virtualenv, site_packages, user_site, virtualenv_no_global, + write_delete_marker_file, +) +from pip._internal.utils.compat import ( + WINDOWS, console_to_str, expanduser, stdlib_pkgs, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +if MYPY_CHECK_RUNNING: + from typing import ( + Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, + AnyStr, Container + ) + from pip._vendor.pkg_resources import Distribution + from pip._internal.models.link import Link + from pip._internal.utils.ui import SpinnerInterface + + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'normalize_path', + 'renames', 'get_prog', + 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', + 'captured_stdout', 'ensure_dir', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', 'WHEEL_EXTENSION', + 'get_installed_version', 'remove_auth_from_url'] + + +logger = std_logging.getLogger(__name__) +subprocess_logger = std_logging.getLogger('pip.subprocessor') + +LOG_DIVIDER = '----------------------------------------' + +WHEEL_EXTENSION = '.whl' +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS + +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def ensure_dir(path): + # type: (AnyStr) -> None + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + # type: () -> str + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + # type: (str, bool) -> None + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + # if file type currently read only + if os.stat(path).st_mode & stat.S_IREAD: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def display_path(path): + # type: (Union[str, Text]) -> str + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + # type: (str, str) -> str + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + # type: (str, Iterable[str]) -> str + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + # type: (str, Iterable[str]) -> str + """Ask the message interactively, with the given possible responses""" + while 1: + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def format_size(bytes): + # type: (float) -> str + if bytes > 1000 * 1000: + return '%.1fMB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%ikB' % (bytes / 1000) + elif bytes > 1000: + return '%.1fkB' % (bytes / 1000.0) + else: + return '%ibytes' % bytes + + +def is_installable_dir(path): + # type: (str) -> bool + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def is_svn_page(html): + # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] + """ + Returns true if the page appears to be the index page of an svn repository + """ + return (re.search(r'[^<]*Revision \d+:', html) and + re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) + + +def file_contents(filename): + # type: (str) -> Text + with open(filename, 'rb') as fp: + return fp.read().decode('utf-8') + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def split_leading_dir(path): + # type: (Union[str, Text]) -> List[Union[str, Text]] + path = path.lstrip('/').lstrip('\\') + if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return [path, ''] + + +def has_leading_dir(paths): + # type: (Iterable[Union[str, Text]]) -> bool + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def normalize_path(path, resolve_symlinks=True): + # type: (str, bool) -> str + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + # type: (str) -> Tuple[str, str] + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + # type: (str, str) -> None + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + # type: (str) -> bool + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + """ + if not running_under_virtualenv(): + return True + return normalize_path(path).startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in user site. + """ + norm_path = normalize_path(dist_location(dist)) + return norm_path.startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is installed in + sysconfig.get_python_lib(). + """ + return normalize_path( + dist_location(dist) + ).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + # type: (Distribution) -> bool + """ + Return True if given Distribution is an editable install. + """ + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions(local_only=True, + skip=stdlib_pkgs, + include_editables=True, + editables_only=False, + user_only=False): + # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + """ + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + # because of pkg_resources vendoring, mypy cannot find stub in typeshed + return [d for d in pkg_resources.working_set # type: ignore + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def egg_link_path(dist): + # type: (Distribution) -> Optional[str] + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + if virtualenv_no_global(): + sites.append(site_packages) + else: + sites.append(site_packages) + if user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + return None + + +def dist_location(dist): + # type: (Distribution) -> str + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + """ + egg_link = egg_link_path(dist) + if egg_link: + return egg_link + return dist.location + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def unzip_file(filename, location, flatten=True): + # type: (str, str, bool) -> None + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + finally: + fp.close() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + finally: + zipfp.close() + + +def untar_file(filename, location): + # type: (str, str) -> None + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + leading = has_leading_dir([ + member.name for member in tar.getmembers() + ]) + for member in tar.getmembers(): + fn = member.name + if leading: + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore + path = os.path.join(location, fn) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file( + filename, # type: str + location, # type: str + content_type, # type: Optional[str] + link # type: Optional[Link] +): + # type: (...) -> None + filename = os.path.realpath(filename) + if (content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename)): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif (content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): + untar_file(filename, location) + elif (content_type and content_type.startswith('text/html') and + is_svn_page(file_contents(filename))): + # We don't really care about this + from pip._internal.vcs.subversion import Subversion + Subversion('svn+' + link.url).unpack(location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of %s' % location + ) + + +def format_command_args(args): + # type: (List[str]) -> str + """ + Format command arguments for display. + """ + return ' '.join(shlex_quote(arg) for arg in args) + + +def call_subprocess( + cmd, # type: List[str] + show_stdout=False, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None # type: Optional[SpinnerInterface] +): + # type: (...) -> Optional[Text] + """ + Args: + show_stdout: if true, use INFO to log the subprocess's stderr and + stdout streams. Otherwise, use DEBUG. Defaults to False. + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + if unset_environ is None: + unset_environ = [] + # Most places in pip use show_stdout=False. What this means is-- + # + # - We connect the child's output (combined stderr and stdout) to a + # single pipe, which we read. + # - We log this output to stderr at DEBUG level as it is received. + # - If DEBUG logging isn't enabled (e.g. if --verbose logging wasn't + # requested), then we show a spinner so the user can still see the + # subprocess is in progress. + # - If the subprocess exits with an error, we log the output to stderr + # at ERROR level if it hasn't already been displayed to the console + # (e.g. if --verbose logging wasn't enabled). This way we don't log + # the output to the console twice. + # + # If show_stdout=True, then the above is still done, but with DEBUG + # replaced by INFO. + if show_stdout: + # Then log the subprocess output at INFO level. + log_subprocess = subprocess_logger.info + used_level = std_logging.INFO + else: + # Then log the subprocess output using DEBUG. This also ensures + # it will be logged to the log file (aka user_log), if enabled. + log_subprocess = subprocess_logger.debug + used_level = std_logging.DEBUG + + # Whether the subprocess will be visible in the console. + showing_subprocess = subprocess_logger.getEffectiveLevel() <= used_level + + # Only use the spinner if we're not showing the subprocess output + # and we have a spinner. + use_spinner = not showing_subprocess and spinner is not None + + if command_desc is None: + command_desc = format_command_args(cmd) + + log_subprocess("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + subprocess_logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + + # Show the line immediately. + log_subprocess(line) + # Update the spinner. + if use_spinner: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + proc_had_error = ( + proc.returncode and proc.returncode not in extra_ok_returncodes + ) + if use_spinner: + if proc_had_error: + spinner.finish("error") + else: + spinner.finish("done") + if proc_had_error: + if on_returncode == 'raise': + if not showing_subprocess: + # Then the subprocess streams haven't been logged to the + # console yet. + subprocess_logger.error( + 'Complete output from command %s:', command_desc, + ) + # The all_output value already ends in a newline. + subprocess_logger.error(''.join(all_output) + LOG_DIVIDER) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + subprocess_logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + return ''.join(all_output) + + +def _make_build_dir(build_dir): + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +def captured_stderr(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, working_set=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums['reverse_mapping'] = reverse + return type('Enum', (), enums) + + +def split_auth_from_netloc(netloc): + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if '@' not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit('@', 1) + if ':' in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user_pass = auth.split(':', 1) + else: + user_pass = auth, None + + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + + return netloc, user_pass + + +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the password in a netloc with "****", if it exists. + + For example, "user:pass@example.com" returns "user:****@example.com". + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + password = '' if password is None else ':****' + return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): + purl = urllib_parse.urlsplit(url) + netloc = transform_netloc(purl.netloc) + # stripped url + url_pieces = ( + purl.scheme, netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + + +def _get_netloc(netloc): + return split_auth_from_netloc(netloc)[0] + + +def remove_auth_from_url(url): + # type: (str) -> str + # Return a copy of url with 'username:password@' removed. + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + return _transform_url(url, _get_netloc) + + +def redact_password_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, redact_netloc) + + +def protect_pip_from_modification_on_windows(modifying_pip): + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]) + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and + WINDOWS and + os.path.basename(sys.argv[0]) in pip_names + ) + + if should_show_use_python_msg: + new_command = [ + sys.executable, "-m", "pip" + ] + sys.argv[1:] + raise CommandError( + 'To modify pip, please run the following command:\n{}' + .format(" ".join(new_command)) + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py new file mode 100644 index 0000000..d5cb80a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/models.py @@ -0,0 +1,40 @@ +"""Utilities for defining models +""" + +import operator + + +class KeyBasedCompareMixin(object): + """Provides comparision capabilities that is based on a key + """ + + def __init__(self, key, defining_class): + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self): + return hash(self._compare_key) + + def __lt__(self, other): + return self._compare(other, operator.__lt__) + + def __le__(self, other): + return self._compare(other, operator.__le__) + + def __gt__(self, other): + return self._compare(other, operator.__gt__) + + def __ge__(self, other): + return self._compare(other, operator.__ge__) + + def __eq__(self, other): + return self._compare(other, operator.__eq__) + + def __ne__(self, other): + return self._compare(other, operator.__ne__) + + def _compare(self, other, method): + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py new file mode 100644 index 0000000..3b58cd5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py @@ -0,0 +1,162 @@ +from __future__ import absolute_import + +import datetime +import json +import logging +import os.path +import sys + +from pip._vendor import lockfile, pkg_resources +from pip._vendor.packaging import version as packaging_version + +from pip._internal.index import PackageFinder +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, get_installed_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + import optparse + from typing import Any, Dict + from pip._internal.download import PipSession + + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class SelfCheckState(object): + def __init__(self, cache_dir): + # type: (str) -> None + self.state = {} # type: Dict[str, Any] + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join(cache_dir, "selfcheck.json") + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile)[sys.prefix] + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + def save(self, pypi_version, current_time): + # type: (str, datetime.datetime) -> None + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + # Attempt to write out our version check file + with lockfile.LockFile(self.statefile_path): + if os.path.exists(self.statefile_path): + with open(self.statefile_path) as statefile: + state = json.load(statefile) + else: + state = {} + + state[sys.prefix] = { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + with open(self.statefile_path, "w") as statefile: + json.dump(state, statefile, sort_keys=True, + separators=(",", ":")) + + +def was_installed_by_pip(pkg): + # type: (str) -> bool + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + try: + dist = pkg_resources.get_distribution(pkg) + return (dist.has_metadata('INSTALLER') and + 'pip' in dist.get_metadata_lines('INSTALLER')) + except pkg_resources.DistributionNotFound: + return False + + +def pip_version_check(session, options): + # type: (PipSession, optparse.Values) -> None + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = SelfCheckState(cache_dir=options.cache_dir) + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + finder = PackageFinder( + find_links=options.find_links, + index_urls=[options.index_url] + options.extra_index_urls, + allow_all_prereleases=False, # Explicitly set to False + trusted_hosts=options.trusted_hosts, + session=session, + ) + candidate = finder.find_candidates("pip").get_best() + if candidate is None: + return + pypi_version = str(candidate.version) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + # Determine if our pypi_version is older + if (pip_version < remote_version and + pip_version.base_version != remote_version.base_version and + was_installed_by_pip('pip')): + # Advise "python -m pip" on Windows to avoid issues + # with overwriting pip.exe. + if WINDOWS: + pip_cmd = "python -m pip" + else: + pip_cmd = "pip" + logger.warning( + "You are using pip version %s, however version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..449f3fd --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py @@ -0,0 +1,85 @@ +from __future__ import absolute_import + +import logging +import sys +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging import specifiers, version + +from pip._internal import exceptions +from pip._internal.utils.misc import display_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + from email.message import Message + from pip._vendor.pkg_resources import Distribution + + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + # type: (Optional[str]) -> bool + """ + Check if the python version in use match the `requires_python` specifier. + + Returns `True` if the version of python in use matches the requirement. + Returns `False` if the version of python in use does not matches the + requirement. + + Raises an InvalidSpecifier if `requires_python` have an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + # We only use major.minor.micro + python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + # type: (Distribution) -> Message + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + metadata = dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + feed_parser = FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + +def check_dist_requires_python(dist): + pkg_info_dict = get_metadata(dist) + requires_python = pkg_info_dict.get('Requires-Python') + try: + if not check_requires_python(requires_python): + raise exceptions.UnsupportedPythonVersion( + "%s requires Python '%s' but the running Python is %s" % ( + dist.project_name, + requires_python, + '.'.join(map(str, sys.version_info[:3])),) + ) + except specifiers.InvalidSpecifier as e: + logger.warning( + "Package %s has an invalid Requires-Python entry %s - %s", + dist.project_name, requires_python, e, + ) + return + + +def get_installer(dist): + # type: (Distribution) -> str + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..03973e9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# Shim to wrap setup.py invocation with setuptools +SETUPTOOLS_SHIM = ( + "import setuptools, tokenize;__file__=%r;" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..2c81ad5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,155 @@ +from __future__ import absolute_import + +import errno +import itertools +import logging +import os.path +import tempfile + +from pip._internal.utils.misc import rmtree + +logger = logging.getLogger(__name__) + + +class TempDirectory(object): + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory or None + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + create() + Creates a temporary directory and stores its path in the path + attribute. + cleanup() + Deletes the temporary directory and sets path attribute to None + + When used as a context manager, a temporary directory is created on + entering the context and, if the delete attribute is True, on exiting the + context the created directory is deleted. + """ + + def __init__(self, path=None, delete=None, kind="temp"): + super(TempDirectory, self).__init__() + + if path is None and delete is None: + # If we were not given an explicit directory, and we were not given + # an explicit delete option, then we'll default to deleting. + delete = True + + self.path = path + self.delete = delete + self.kind = kind + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + self.create() + return self + + def __exit__(self, exc, value, tb): + if self.delete: + self.cleanup() + + def create(self): + """Create a temporary directory and store its path in self.path + """ + if self.path is not None: + logger.debug( + "Skipped creation of temporary directory: {}".format(self.path) + ) + return + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) + + def cleanup(self): + """Remove the temporary directory created and reset state + """ + if self.path is not None and os.path.exists(self.path): + rmtree(self.path) + self.path = None + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original, delete=None): + super(AdjacentTempDirectory, self).__init__(delete=delete) + self.original = original.rstrip('/\\') + + @classmethod + def _generate_names(cls, name): + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1): + new_name = '~' + ''.join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i): + new_name = '~' + ''.join(candidate) + name + if new_name != name: + yield new_name + + def create(self): + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + self.path = os.path.realpath(path) + break + + if not self.path: + # Final fallback on the default behavior. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 0000000..10170ce --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,29 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py new file mode 100644 index 0000000..0902ce7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/utils/ui.py @@ -0,0 +1,424 @@ +from __future__ import absolute_import, division + +import contextlib +import itertools +import logging +import sys +import time +from signal import SIGINT, default_int_handler, signal + +from pip._vendor import six +from pip._vendor.progress import HIDE_CURSOR, SHOW_CURSOR +from pip._vendor.progress.bar import Bar, FillingCirclesBar, IncrementalBar +from pip._vendor.progress.spinner import Spinner + +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.logging import get_indentation +from pip._internal.utils.misc import format_size +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Iterator, IO + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +logger = logging.getLogger(__name__) + + +def _select_progress_class(preferred, fallback): + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any + + +class InterruptibleMixin(object): + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args, **kwargs): + """ + Save the original SIGINT handler for later. + """ + super(InterruptibleMixin, self).__init__(*args, **kwargs) + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self): + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class SilentBar(Bar): + + def update(self): + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + super(DownloadProgressMixin, self).__init__(*args, **kwargs) + self.message = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self): + return format_size(self.index) + + @property + def download_speed(self): + # Avoid zero division errors... + if self.avg == 0.0: + return "..." + return format_size(1 / self.avg) + "/s" + + @property + def pretty_eta(self): + if self.eta: + return "eta %s" % self.eta_td + return "" + + def iter(self, it, n=1): + for x in it: + yield x + self.next(n) + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call needs to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: + self.hide_cursor = False + + super(WindowsMixin, self).__init__(*args, **kwargs) + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + +# NOTE: The "type: ignore" comments on the following classes are there to +# work around https://github.com/python/typing/issues/241 + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, + _BaseBar): + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore + pass + + +class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore + IncrementalBar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = ''.join([ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ]) + + self.writeln(line) + + +BAR_TYPES = { + "off": (DownloadSilentBar, DownloadSilentBar), + "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), + "ascii": (DownloadIncrementalBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) +} + + +def DownloadProgressProvider(progress_bar, max=None): + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter + else: + return BAR_TYPES[progress_bar][0](max=max).iter + + +################################################################ +# Generic "something is happening" spinners +# +# We don't even try using progress.spinner.Spinner here because it's actually +# simpler to reimplement from scratch than to coerce their code into doing +# what we need. +################################################################ + +@contextlib.contextmanager +def hidden_cursor(file): + # type: (IO) -> Iterator[None] + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + # type: (float) -> None + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 # type: float + + def ready(self): + # type: () -> bool + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + # type: () -> None + self._last_update = time.time() + + +class SpinnerInterface(object): + def spin(self): + # type: () -> None + raise NotImplementedError() + + def finish(self, final_status): + # type: (str) -> None + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(SpinnerInterface): + def __init__(self, message, min_update_interval_seconds=60): + # type: (str, float) -> None + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # type: (str) -> Iterator[SpinnerInterface] + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) # type: SpinnerInterface + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..6fca079 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,604 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import errno +import logging +import os +import shutil +import sys + +from pip._vendor import pkg_resources +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import ( + ask_path_exists, backup_dir, call_subprocess, display_path, rmtree, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( + Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type + ) + from pip._internal.utils.ui import SpinnerInterface + + AuthInfo = Tuple[Optional[str], Optional[str]] + +__all__ = ['vcs'] + + +logger = logging.getLogger(__name__) + + +def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +class RemoteNotFoundError(Exception): + pass + + +class RevOptions(object): + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__( + self, + vc_class, # type: Type[VersionControl] + rev=None, # type: Optional[str] + extra_args=None, # type: Optional[List[str]] + ): + # type: (...) -> None + """ + Args: + vc_class: a VersionControl subclass. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vc_class = vc_class + + def __repr__(self): + return '<RevOptions {}: rev={!r}>'.format(self.vc_class.name, self.rev) + + @property + def arg_rev(self): + # type: () -> Optional[str] + if self.rev is None: + return self.vc_class.default_arg_rev + + return self.rev + + def to_args(self): + # type: () -> List[str] + """ + Return the VCS-specific command arguments. + """ + args = [] # type: List[str] + rev = self.arg_rev + if rev is not None: + args += self.vc_class.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + # type: () -> str + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + # type: (str) -> RevOptions + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vc_class.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, Type[VersionControl]] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # type: () -> None + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + return self._registry.__iter__() + + @property + def backends(self): + # type: () -> List[Type[VersionControl]] + return list(self._registry.values()) + + @property + def dirnames(self): + # type: () -> List[str] + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + # type: () -> List[str] + schemes = [] # type: List[str] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + # type: (Type[VersionControl]) -> None + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, cls=None, name=None): + # type: (Optional[Type[VersionControl]], Optional[str]) -> None + if name in self._registry: + del self._registry[name] + elif cls in self._registry.values(): + del self._registry[cls.name] + else: + logger.warning('Cannot unregister because no class or name given') + + def get_backend_type(self, location): + # type: (str) -> Optional[Type[VersionControl]] + """ + Return the type of the version control backend if found at given + location, e.g. vcs.get_backend_type('/path/to/vcs/checkout') + """ + for vc_type in self._registry.values(): + if vc_type.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vc_type.name) + return vc_type + return None + + def get_backend(self, name): + # type: (str) -> Optional[Type[VersionControl]] + name = name.lower() + if name in self._registry: + return self._registry[name] + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + repo_name = '' + # List of supported schemes for this Version Control + schemes = () # type: Tuple[str, ...] + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ = () # type: Tuple[str, ...] + default_arg_rev = None # type: Optional[str] + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + """ + Return whether the vcs prefix (e.g. "git+") should be added to a + repository's remote url when used in a requirement. + """ + return not remote_url.lower().startswith('{}:'.format(cls.name)) + + @classmethod + def get_subdirectory(cls, repo_dir): + """ + Return the path to setup.py, relative to the repo root. + """ + return None + + @classmethod + def get_requirement_revision(cls, repo_dir): + """ + Return the revision string that should be used in a requirement. + """ + return cls.get_revision(repo_dir) + + @classmethod + def get_src_requirement(cls, repo_dir, project_name): + """ + Return the requirement string to use to redownload the files + currently at the given repository directory. + + Args: + project_name: the (unescaped) project name. + + The return value has a form similar to the following: + + {repository_url}@{revision}#egg={project_name} + """ + repo_url = cls.get_remote_url(repo_dir) + if repo_url is None: + return None + + if cls.should_add_vcs_url_prefix(repo_url): + repo_url = '{}+{}'.format(cls.name, repo_url) + + revision = cls.get_requirement_revision(repo_dir) + subdir = cls.get_subdirectory(repo_dir) + req = make_vcs_requirement_url(repo_url, revision, project_name, + subdir=subdir) + + return req + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + @staticmethod + def get_base_rev_args(rev): + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + @classmethod + def make_rev_options(cls, rev=None, extra_args=None): + # type: (Optional[str], Optional[List[str]]) -> RevOptions + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(cls, rev, extra_args=extra_args) + + @classmethod + def _is_local_repository(cls, repo): + # type: (str) -> bool + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or bool(drive) + + def export(self, location): + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + """ + raise NotImplementedError + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + @classmethod + def get_url_rev_and_auth(cls, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + if '+' not in scheme: + raise ValueError( + "Sorry, {!r} is a malformed VCS url. " + "The format is <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = cls.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + # type: (str) -> Tuple[str, RevOptions] + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + url, rev, user_pass = self.get_url_rev_and_auth(url) + username, password = user_pass + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return url, rev_options + + @staticmethod + def normalize_url(url): + # type: (str) -> str + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + @classmethod + def compare_urls(cls, url1, url2): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (cls.normalize_url(url1) == cls.normalize_url(url2)) + + @classmethod + def fetch_new(cls, dest, url, rev_options): + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, url, rev_options): + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + @classmethod + def is_commit_id_equal(cls, dest, name): + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def obtain(self, dest): + # type: (str) -> None + """ + Install or update in editable mode the package represented by this + VersionControl object. + + Args: + dest: the repository directory in which to install or update. + """ + url, rev_options = self.get_url_rev_options(self.url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_url(dest) + if self.compare_urls(existing_url, url): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, url, rev_options) + else: + logger.info('Skipping because already up-to-date.') + return + + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore + ('i', 'w', 'b')) + + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? %s' % prompt[0], prompt[1]) + + if response == 'a': + sys.exit(-1) + + if response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options) + return + + if response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options) + return + + # Do nothing if the response is "i". + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + + def unpack(self, location): + # type: (str) -> None + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + @classmethod + def get_remote_url(cls, location): + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location): + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd, # type: List[str] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + spinner=None # type: Optional[SpinnerInterface] + ): + # type: (...) -> Optional[Text] + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = [cls.name] + cmd + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.unset_environ, + spinner=spinner) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command %r - do you have ' + '%r installed and in your ' + 'PATH?' % (cls.name, cls.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + # type: (str) -> bool + """ + Return whether a directory path is a repository directory. + """ + logger.debug('Checking in %s for %s (%s)...', + path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def controls_location(cls, location): + # type: (str) -> bool + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For example, + the Git override checks that Git is actually available. + """ + return cls.is_repository_directory(location) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2439d165a7ac2d80666bbd300b7f95c03dfb34d3 GIT binary patch literal 17040 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76769b7e645c1030fc506a87cff5cf7f72491ce3 GIT binary patch literal 3441 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 I{Pn;702}#M_y7O^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f38907a34385d0f9fbe108703c9ce40c78ebbe9 GIT binary patch literal 9085 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d2f26ceb6d83fbfc052fe29386693b40f4ccf84 GIT binary patch literal 3703 zcmbVOOOxBi5ys#_fY0TwR;!JrR1l}+gmFkJj-1#oIaVx7_QBaCk}Hx~l|n(7A&C`U zni-P22sfA2F)IHB?lHIgfc%oV`jo$rQ@RJc+=p~BP#833dIr;9f8Eocx7!T^uK$GZ z{OxAjFuuo+v&#nIK0M+TG}NFZF;X%j1Z6WZN2Y#TBMaVEVyDi?(PMT}OWl#HWhe2{ z`lznuTGB|Hqo$VKq?NWu?X)xM5QCYk4c0v&qs=c3>e2cugVtI5*cxrI&gvT5I>CRM zPmEsUzpxXdN7P36T;$12vLH^2oXb7vYejiBjweOP1>^ADEJ8UAWFE|Tg2OZxMG_tc z*bU$9Z&+G<5px#FoFDc~)%h#qBF?i1c_w+DC~F>x2>*9>Ss>hpM=YUX#)wb@Fd$&R zIkKrWa;QD3F_${D_R2UWBagb&du5F3tU>Fvq5GP&Nn6m@qHWrNcN@kwXjhMQK;EQV zTHXNp8r{}%7v$@7N6VY^2H>!(>VITBn(;VHlsTQ0)?hkOPL$*s>p2`<TDsH8`%@{4 z(mNGISp!LkY1zTI3}qbkQ6nOtj~Bl2c>s^7L9;X_1b#>M{)M1hoXvR)x^?rvVp#Ba z9!fTxhkQ8B6AJhZQ$BpY9|RwX53}FR>D?$O<{#XV<Bul$Jo)wb!;e26elslMq913l zgCyx66xrf8(SC`Y`U&DpGM<IW5bz(SXJ!tHL$x_!GI$;e7Qjw|kWa)8?$m_FFw2{3 zNCt1{MOp{c(1&$+w2AjXkictdz9!%O;>cVYE3!2AP2}6s*te*)BomX`*hih$7BQY0 zwDuR{vGEMv0E}CH_V57t=gTScznb`*6}gC!P<~i-0{MKI>v772j5B~e&-^5hw4iEC zF97h`FXD_UH{{VYp0h{5$flU)i$F-4&!n=V1>Nh}9Q~qdv#bcC7s^I5t0tdiL6oOy zn9-i4Y{8PT^47obBrrXoF+X=6@4za&3(Y(52oD;=Y>}2}ld^k`W3{&k69HcMYZo33 z-eVA!*2*|Bj%-O*5C}_iX-k0Yn4H)M;L4^ZwGcjl(a}K+Au=&xmUCj<FpeAm*<LzJ zLTj&0ObZC<UU~fi@HoyU{&eEs7PkfBcU$l#{IG2F`&m9KDA2An`!4|qE%ylDhT&dK zH6Y+mBVE;!d@^BN*>N_`xdRIP1~keA9b^xvTTvpEjh;~!xC)>IX5|I?NK_wZi+NE> z^{gu>s`{A8Xc}Z}@iSOlY(Zm~9<hn3?}oWex}>~zj_O)}4J<MegH{9kZxE!h50Ea2 zW+6GT0Ad?KJ8};1EuB?uX={!;D;FVNnkT?b=`C$)ADiEGk7}S(U)E3u7;99FeQIRC zwGG*j_I`70zG(1&65|N6bh#y4t2TAOO)jp3GboJw!+mCaYh*rhox0j>9ql#`cD1qe zz-`{zZS_56PbWN54l+_Gm$Gp<OQa%;a`+&hCDhMy>5D}SSov!#E(VPD@+au&n}7g% z_spwZW#)ootSfszk26?3h76H1Zed^dNjPSZwITWcStoyGa~4u%2_}`D7c5iGg2$36 z_fJnAa-MV5*~_0m;s-D5Z~kLk$6bURdB=YOUz#bsI^RY4r`WuU4Z0Y4QREPC_(xSc zeK)IjFpd+ZEOrp_+c;sJFLlVNT7|$J7!tU&LAHnoJZX>)X^~yB1H8Fq0bedeVKrq< z7UVHTq$bN<5WpQeiGhm<wX{nh^0dQ<c9@MCOM5+vapr)-idm9ez**zoGqvR!12{_F zV*cCg(o^rlUi7hnMqM_ciqcD27|qZod~nGG%(>KlZLMJIIwPCFZo+>FiN!o7&|~6A zWk3V-V+DKJ*1Q{>(hjmGzXt18S;4Nt-Vu_=h1w2c5nysm;21ee*BlY;S=`4-Kf*@4 z`-=BEc(8Dm=1_P*ws;770#yvin>FxY1AJNTuGy{6p>y@On|}+YpL_6%`B?Ng<<o|L zdOc=x#xs4IobSD_jq#&tm`xaP9)fBfV<qEfv-CORzw$%jhnbHDE2P80dNt)jvBWYd z%5J}pheQHt_0zw@^rOoFo^s+-*y=@$R2NDRTma8w{l}|xZ&iR*gL^Q&I%=E>u5#xp zRF&cn25P!C?E+BexWp9p8js`Z==G<em{!>McklE;jfWAG9_uxx>>#8piqkOhkviFA zJ;d*WE#>A#)Uuqi9{^i`ySNJ5ZUx)R8I-5#MSP#FA*`K3`0iB*-<%X-mc$F+>-r7} zPqDf)%lH0}EW$(Jh!C@sX?D%4T3Glr&weibG=#MMNN@9u0GJb%t+VizDA|Je!fGUz zK}-Yoauy~LC|7lwRo*(^@tcZ!y)ESh0WKQ^su2WfPG<?qtsuaasu7N%$NRX2x=zN} zty~dJ0WYCiRdt&(In62GKwYeLR5MDz#?$Wiu=^8i@Vw!lVe>gQUtseHn{&goq>Cmz zt8p=bl@lKG`Zim(S8uhwuIIGstwyWKQLnd+CX8ngv|s|qB2>9pl;A1zK75U?L)kkB z<}9N*ABgy1kmhqHs&j2ekDZmn1DY?gBoC=hRciP0;7rDe7^Ja?be*Gay={112Vx<o zHZQ9{wau}(<5&!;Ixz5ST|MzHu@etSZIbdho5TX*<Zb9E?_TAw-y_ci)?_WHg*>x` N)g|0rvtf0={Xcbzxc~qF literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72dd9c43b4b27e7345c8ed68534e5c06a2ecec86 GIT binary patch literal 6732 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..3587b3d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,103 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path, rmtree +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + schemes = ( + 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', + 'bzr+lp', + ) + + def __init__(self, url=None, *args, **kwargs): + super(Bazaar, self).__init__(url, *args, **kwargs) + # This is only needed for python <2.7.5 + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(['lp']) + + @staticmethod + def get_base_rev_args(rev): + return ['-r', rev] + + def export(self, location): + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + url, rev_options = self.get_url_rev_options(self.url) + self.run_command( + ['export', location, url] + rev_options.to_args(), + show_stdout=False, + ) + + @classmethod + def fetch_new(cls, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] + cls.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + self.run_command(['switch', url], cwd=dest) + + def update(self, dest, url, rev_options): + cmd_args = ['pull', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_url_rev_and_auth(cls, url): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location): + urls = cls.run_command(['info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if cls._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + @classmethod + def get_revision(cls, location): + revision = cls.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 0000000..35ea930 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,362 @@ +from __future__ import absolute_import + +import logging +import os.path +import re + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.compat import samefile +from pip._internal.utils.misc import display_path, redact_password_from_url +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import RemoteNotFoundError, VersionControl, vcs + +urlsplit = urllib_parse.urlsplit +urlunsplit = urllib_parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +HASH_REGEX = re.compile('[a-fA-F0-9]{40}') + + +def looks_like_hash(sha): + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') + default_arg_rev = 'HEAD' + + def __init__(self, url=None, *args, **kwargs): + + # Works around an apparent Git bug + # (see https://article.gmane.org/gmane.comp.version-control.git/146500) + if url: + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + super(Git, self).__init__(url, *args, **kwargs) + + @staticmethod + def get_base_rev_args(rev): + return [rev] + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version because + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + @classmethod + def get_current_branch(cls, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ['symbolic-ref', '-q', 'HEAD'] + output = cls.run_command( + args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + ref = output.strip() + + if ref.startswith('refs/heads/'): + return ref[len('refs/heads/'):] + + return None + + def export(self, location): + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir.path + ) + + @classmethod + def get_revision_sha(cls, dest, rev): + """ + Return (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = cls.run_command(['show-ref', rev], cwd=dest, + show_stdout=False, on_returncode='ignore') + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + @classmethod + def resolve_revision(cls, dest, url, rev_options): + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + sha, is_branch = cls.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + + if not rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + cls.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = cls.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + return rev_options + + @classmethod + def is_commit_id_equal(cls, dest, name): + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return cls.get_revision(dest) == name + + @classmethod + def fetch_new(cls, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning %s%s to %s', redact_password_from_url(url), + rev_display, display_path(dest), + ) + cls.run_command(['clone', '-q', url, dest]) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = cls.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, 'branch_name', None) + if branch_name is None: + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not cls.is_commit_id_equal(dest, rev_options.rev): + cmd_args = ['checkout', '-q'] + rev_options.to_args() + cls.run_command(cmd_args, cwd=dest) + elif cls.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = 'origin/{}'.format(branch_name) + cmd_args = [ + 'checkout', '-b', branch_name, '--track', track_branch, + ] + cls.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + cls.update_submodules(dest) + + def switch(self, dest, url, rev_options): + self.run_command(['config', 'remote.origin.url', url], cwd=dest) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, url, rev_options): + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.resolve_revision(dest, url, rev_options) + cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location): + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + @classmethod + def get_revision(cls, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = cls.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + @classmethod + def get_subdirectory(cls, location): + # find the repo root + git_dir = cls.run_command(['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + root_dir = os.path.join(git_dir, '..') + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + # relative path of setup.py to repo root + if samefile(root_dir, location): + return None + return os.path.relpath(location, root_dir) + + @classmethod + def get_url_rev_and_auth(cls, url): + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don't + work with a ssh:// scheme (e.g. GitHub). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + if '://' not in url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, cls).get_url_rev_and_auth(url) + + return url, rev, user_pass + + @classmethod + def update_submodules(cls, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + cls.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls.run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore') + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..81edc4a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,105 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + + @staticmethod + def get_base_rev_args(rev): + return [rev] + + def export(self, location): + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir.path + ) + + @classmethod + def fetch_new(cls, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cls.run_command(['clone', '--noupdate', '-q', url, dest]) + cmd_args = ['update', '-q'] + rev_options.to_args() + cls.run_command(cmd_args, cwd=dest) + + def switch(self, dest, url, rev_options): + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.SafeConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, url, rev_options): + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location): + url = cls.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location): + """ + Return the repository-local changeset revision number, as an integer. + """ + current_revision = cls.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + @classmethod + def get_requirement_revision(cls, location): + """ + Return the changeset identification hash, as a 40-character + hexadecimal string + """ + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Mercurial) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..01bb161 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,234 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, rmtree, split_auth_from_netloc, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') + + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + @classmethod + def should_add_vcs_url_prefix(cls, remote_url): + return True + + @staticmethod + def get_base_rev_args(rev): + return ['-r', rev] + + def get_vcs_version(self): + # type: () -> Optional[Tuple[int, ...]] + """Return the version of the currently installed Subversion client. + + :return: A tuple containing the parts of the version information or + ``None`` if the version returned from ``svn`` could not be parsed. + :raises: BadCommand: If ``svn`` is not installed. + """ + # Example versions: + # svn, version 1.10.3 (r1842928) + # compiled Feb 25 2019, 14:20:39 on x86_64-apple-darwin17.0.0 + # svn, version 1.7.14 (r1542130) + # compiled Mar 28 2018, 08:49:13 on x86_64-pc-linux-gnu + version_prefix = 'svn, version ' + version = self.run_command(['--version'], show_stdout=False) + if not version.startswith(version_prefix): + return None + + version = version[len(version_prefix):].split()[0] + version_list = version.split('.') + try: + parsed_version = tuple(map(int, version_list)) + except ValueError: + return None + + if not parsed_version: + return None + + return parsed_version + + def export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(self.url) + + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = ['export'] + rev_options.to_args() + [url, location] + self.run_command(cmd_args, show_stdout=False) + + @classmethod + def fetch_new(cls, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] + cls.run_command(cmd_args) + + def switch(self, dest, url, rev_options): + cmd_args = ['switch'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + cmd_args = ['update'] + rev_options.to_args() + [dest] + self.run_command(cmd_args) + + @classmethod + def get_revision(cls, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._get_svn_url_rev(base) + + if base == location: + base = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + @classmethod + def get_netloc_and_auth(cls, netloc, scheme): + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == 'ssh': + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super(Subversion, cls).get_netloc_and_auth(netloc, scheme) + + return split_auth_from_netloc(netloc) + + @classmethod + def get_url_rev_and_auth(cls, url): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, cls).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + @staticmethod + def make_rev_args(username, password): + extra_args = [] + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + @classmethod + def get_remote_url(cls, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return cls._get_svn_url_rev(location)[0] + + @classmethod + def _get_svn_url_rev(cls, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('<?xml'): + match = _svn_xml_url_re.search(data) + if not match: + raise ValueError('Badly formatted data: %r' % data) + url = match.group(1) # get repository URL + revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] + else: + try: + # subversion >= 1.7 + xml = cls.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + @classmethod + def is_commit_id_equal(cls, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Subversion) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/wheel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/wheel.py new file mode 100644 index 0000000..1bdbe93 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_internal/wheel.py @@ -0,0 +1,1098 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import absolute_import + +import collections +import compileall +import csv +import hashlib +import logging +import os.path +import re +import shutil +import stat +import sys +import warnings +from base64 import urlsafe_b64encode +from email.parser import Parser + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.six import StringIO + +from pip._internal import pep425tags +from pip._internal.download import path_to_url, unpack_url +from pip._internal.exceptions import ( + InstallationError, InvalidWheelFilename, UnsupportedWheel, +) +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, distutils_scheme, +) +from pip._internal.models.link import Link +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + LOG_DIVIDER, call_subprocess, captured_stdout, ensure_dir, + format_command_args, read_chunks, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import ( + Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, Iterable + ) + from pip._vendor.packaging.requirements import Requirement + from pip._internal.req.req_install import InstallRequirement + from pip._internal.download import PipSession + from pip._internal.index import FormatControl, PackageFinder + from pip._internal.operations.prepare import ( + RequirementPreparer + ) + from pip._internal.cache import WheelCache + from pip._internal.pep425tags import Pep425Tag + + InstalledCSVRow = Tuple[str, ...] + + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + +def rehash(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[str, str] + """Return (hash, length) for path using hashlib.sha256()""" + h = hashlib.sha256() + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + # unicode/str python2 issues + return (digest, str(length)) # type: ignore + + +def open_for_csv(name, mode): + # type: (str, Text) -> IO + if sys.version_info[0] < 3: + nl = {} # type: Dict[str, Any] + bin = 'b' + else: + nl = {'newline': ''} # type: Dict[str, Any] + bin = '' + return open(name, mode + bin, **nl) + + +def replace_python_tag(wheelname, new_tag): + # type: (str, str) -> str + """Replace the Python tag in a wheel file name with a new value. + """ + parts = wheelname.split('-') + parts[-3] = new_tag + return '-'.join(parts) + + +def fix_script(path): + # type: (str) -> Optional[bool] + """Replace #!python with #!/path/to/python + Return True if file was changed.""" + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + return None + + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + # type: (str, str) -> bool + """ + Return True if the extracted wheel in wheeldir should go into purelib. + """ + name_folded = name.replace("-", "_") + for item in os.listdir(wheeldir): + match = dist_info_re.match(item) + if match and match.group('name') == name_folded: + with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: + for line in wheel: + line = line.lower().rstrip() + if line == "root-is-purelib: true": + return True + return False + + +def get_entrypoints(filename): + # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + # get the entry points and then the script names + entry_points = pkg_resources.EntryPoint.parse_map(data) + console = entry_points.get('console_scripts', {}) + gui = entry_points.get('gui_scripts', {}) + + def _split_ep(s): + """get the string representation of EntryPoint, remove space and split + on '='""" + return str(s).replace(" ", "").split("=") + + # convert the EntryPoint objects into strings with module:function + console = dict(_split_ep(v) for v in console.values()) + gui = dict(_split_ep(v) for v in gui.values()) + return console, gui + + +def message_about_scripts_not_on_PATH(scripts): + # type: (Sequence[str]) -> Optional[str] + """Determine if any scripts are not on PATH and format a warning. + + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir = collections.defaultdict(set) # type: Dict[str, set] + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i).rstrip(os.sep) for i in + os.environ.get("PATH", "").split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for = { + parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, scripts in warn_for.items(): + sorted_scripts = sorted(scripts) # type: List[str] + if len(sorted_scripts) == 1: + start_text = "script {} is".format(sorted_scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH." + .format(start_text, parent_dir) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def sorted_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] + """ + Return the given rows of a RECORD file in sorted order. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: Iterable[List[str]] + installed, # type: Dict[str, str] + changed, # type: set + generated, # type: List[str] + lib_dir, # type: str +): + # type: (...) -> List[InstalledCSVRow] + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows = [] # type: List[InstalledCSVRow] + for row in old_csv_rows: + if len(row) > 3: + logger.warning( + 'RECORD line has more than three elements: {}'.format(row) + ) + # Make a copy because we are mutating the row. + row = list(row) + old_path = row[0] + new_path = installed.pop(old_path, old_path) + row[0] = new_path + if new_path in changed: + digest, length = rehash(new_path) + row[1] = digest + row[2] = length + installed_rows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + installed_rows.append((normpath(f, lib_dir), digest, str(length))) + for f in installed: + installed_rows.append((installed[f], '', '')) + return installed_rows + + +def move_wheel_files( + name, # type: str + req, # type: Requirement + wheeldir, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + pycompile=True, # type: bool + scheme=None, # type: Optional[Mapping[str, str]] + isolated=False, # type: bool + prefix=None, # type: Optional[str] + warn_script_location=True # type: bool +): + # type: (...) -> None + """Install a wheel""" + # TODO: Investigate and break this up. + # TODO: Look into moving this into a dedicated class for representing an + # installation. + + if not scheme: + scheme = distutils_scheme( + name, user=user, home=home, root=root, isolated=isolated, + prefix=prefix, + ) + + if root_is_purelib(name, wheeldir): + lib_dir = scheme['purelib'] + else: + lib_dir = scheme['platlib'] + + info_dir = [] # type: List[str] + data_dirs = [] + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} # type: Dict[str, str] + changed = set() + generated = [] # type: List[str] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def record_installed(srcfile, destfile, modified=False): + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber(source, dest, is_base, fixer=None, filter=None): + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): + continue + for s in subdirs: + destsubdir = os.path.join(dest, basedir, s) + if is_base and basedir == '' and destsubdir.endswith('.data'): + data_dirs.append(s) + continue + elif (is_base and + s.endswith('.dist-info') and + canonicalize_name(s).startswith( + canonicalize_name(req.name))): + assert not info_dir, ('Multiple .dist-info directories: ' + + destsubdir + ', ' + + ', '.join(info_dir)) + info_dir.append(destsubdir) + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # copyfile (called below) truncates the destination if it + # exists and then writes the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(destfile): + os.unlink(destfile) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + assert info_dir, "%s .dist-info directory not found" % req + + # Get the defined entry points + ep_file = os.path.join(info_dir[0], 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = scheme[subdir] + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = ScriptMaker(None, scheme['scripts']) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {''} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Simplify the script and fix the fact that the default script swallows + # every single stack trace. + # See https://bitbucket.org/pypa/distlib/issue/34/ + # See https://bitbucket.org/pypa/distlib/issue/33/ + def _get_script_text(entry): + if entry.suffix is None: + raise InstallationError( + "Invalid script entry point: %s for req: %s - A callable " + "suffix is required. Cf https://packaging.python.org/en/" + "latest/distributing.html#console-scripts for more " + "information." % (entry, req) + ) + return maker.script_template % { + "module": entry.prefix, + "import_name": entry.suffix.split(".")[0], + "func": entry.suffix, + } + # ignore type, because mypy disallows assigning to a method, + # see https://github.com/python/mypy/issues/2427 + maker._get_script_text = _get_script_text # type: ignore + maker.script_template = r"""# -*- coding: utf-8 -*- +import re +import sys + +from %(module)s import %(import_name)s + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +""" + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'pip = ' + pip_script + generated.extend(maker.make(spec)) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + spec = 'pip%s = %s' % (sys.version[:1], pip_script) + generated.extend(maker.make(spec)) + + spec = 'pip%s = %s' % (sys.version[:3], pip_script) + generated.extend(maker.make(spec)) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'easy_install = ' + easy_install_script + generated.extend(maker.make(spec)) + + spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) + generated.extend(maker.make(spec)) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console and GUI entry points specified in the wheel + if len(console) > 0: + generated_console_scripts = maker.make_multiple( + ['%s = %s' % kv for kv in console.items()] + ) + generated.extend(generated_console_scripts) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warning(msg) + + if len(gui) > 0: + generated.extend( + maker.make_multiple( + ['%s = %s' % kv for kv in gui.items()], + {'gui': True} + ) + ) + + # Record pip as the installer + installer = os.path.join(info_dir[0], 'INSTALLER') + temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(info_dir[0], 'RECORD') + temp_record = os.path.join(info_dir[0], 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + outrows = get_csv_rows_for_installed( + reader, installed=installed, changed=changed, + generated=generated, lib_dir=lib_dir, + ) + writer = csv.writer(record_out) + # Sort to simplify testing. + for row in sorted_outrows(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def wheel_version(source_dir): + # type: (Optional[str]) -> Optional[Tuple[int, ...]] + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return None if we couldn't parse / extract it. + """ + try: + dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] + + wheel_data = dist.get_metadata('WHEEL') + wheel_data = Parser().parsestr(wheel_data) + + version = wheel_data['Wheel-Version'].strip() + version = tuple(map(int, version.split('.'))) + return version + except Exception: + return None + + +def check_compatibility(version, name): + # type: (Optional[Tuple[int, ...]], str) -> None + """ + Raises errors or warns if called with an incompatible Wheel-Version. + + Pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if not version: + raise UnsupportedWheel( + "%s is in an unsupported or invalid wheel" % name + ) + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) + + +class Wheel(object): + """A wheel file""" + + # TODO: Maybe move the class into the models sub-package + # TODO: Maybe move the install code into this class + + wheel_file_re = re.compile( + r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) + ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + # type: (str) -> None + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "%s is not a valid wheel filename." % filename + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.build_tag = wheel_info.group('build') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = { + (x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def support_index_min(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> Optional[int] + """ + Return the lowest index that one of the wheel's file_tag combinations + achieves in the supported_tags list e.g. if there are 8 supported tags, + and one of the file tags is first in the list, then return 0. Returns + None is the wheel is not supported. + """ + if tags is None: # for mock + tags = pep425tags.get_supported() + indexes = [tags.index(c) for c in self.file_tags if c in tags] + return min(indexes) if indexes else None + + def supported(self, tags=None): + # type: (Optional[List[Pep425Tag]]) -> bool + """Is this wheel supported on this system?""" + if tags is None: # for mock + tags = pep425tags.get_supported() + return bool(set(tags).intersection(self.file_tags)) + + +def _contains_egg_info( + s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def should_use_ephemeral_cache( + req, # type: InstallRequirement + format_control, # type: FormatControl + autobuilding, # type: bool + cache_available # type: bool +): + # type: (...) -> Optional[bool] + """ + Return whether to build an InstallRequirement object using the + ephemeral cache. + + :param cache_available: whether a cache directory is available for the + autobuilding=True case. + + :return: True or False to build the requirement with ephem_cache=True + or False, respectively; or None not to build the requirement. + """ + if req.constraint: + return None + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return None + if not autobuilding: + return False + + if req.editable or not req.source_dir: + return None + + if req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + return True + + if "binary" not in format_control.get_allowed_formats( + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name, + ) + return None + + link = req.link + base, ext = link.splitext() + if cache_available and _contains_egg_info(base): + return False + + # Otherwise, build the wheel just for this run using the ephemeral + # cache since we are either in the case of e.g. a local directory, or + # no cache directory is available to use. + return True + + +def format_command_result( + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> str + """ + Format command information for logging. + """ + command_desc = format_command_args(command_args) + text = 'Command arguments: {}\n'.format(command_desc) + + if not command_output: + text += 'Command output: None' + elif logger.getEffectiveLevel() > logging.DEBUG: + text += 'Command output: [use --verbose to show]' + else: + if not command_output.endswith('\n'): + command_output += '\n' + text += 'Command output:\n{}{}'.format(command_output, LOG_DIVIDER) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + req, # type: InstallRequirement + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> Optional[str] + """ + Return the path to the wheel in the temporary build directory. + """ + # Sort for determinism. + names = sorted(names) + if not names: + msg = ( + 'Legacy build of wheel for {!r} created no files.\n' + ).format(req.name) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + 'Legacy build of wheel for {!r} created more than one file.\n' + 'Filenames (choosing first): {}\n' + ).format(req.name, names) + msg += format_command_result(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__( + self, + finder, # type: PackageFinder + preparer, # type: RequirementPreparer + wheel_cache, # type: WheelCache + build_options=None, # type: Optional[List[str]] + global_options=None, # type: Optional[List[str]] + no_clean=False # type: bool + ): + # type: (...) -> None + self.finder = finder + self.preparer = preparer + self.wheel_cache = wheel_cache + + self._wheel_dir = preparer.wheel_download_dir + + self.build_options = build_options or [] + self.global_options = global_options or [] + self.no_clean = no_clean + + def _build_one(self, req, output_dir, python_tag=None): + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return self._build_one_inside_env(req, output_dir, + python_tag=python_tag) + + def _build_one_inside_env(self, req, output_dir, python_tag=None): + with TempDirectory(kind="wheel") as temp_dir: + if req.use_pep517: + builder = self._build_one_pep517 + else: + builder = self._build_one_legacy + wheel_path = builder(req, temp_dir.path, python_tag=python_tag) + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + shutil.move(wheel_path, dest_path) + logger.info('Stored in directory: %s', output_dir) + return dest_path + except Exception: + pass + # Ignore return, we can't do anything else useful. + self._clean_one(req) + return None + + def _base_setup_args(self, req): + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + return [ + sys.executable, '-u', '-c', + SETUPTOOLS_SHIM % req.setup_py + ] + list(self.global_options) + + def _build_one_pep517(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert req.metadata_directory is not None + if self.build_options: + # PEP 517 does not support --build-options + logger.error('Cannot build wheel for %s using PEP 517 when ' + '--build-options is present' % (req.name,)) + return None + try: + req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) + logger.debug('Destination directory: %s', tempd) + wheel_name = req.pep517_backend.build_wheel( + tempd, + metadata_directory=req.metadata_directory + ) + if python_tag: + # General PEP 517 backends don't necessarily support + # a "--python-tag" option, so we rename the wheel + # file directly. + new_name = replace_python_tag(wheel_name, python_tag) + os.rename( + os.path.join(tempd, wheel_name), + os.path.join(tempd, new_name) + ) + # Reassign to simplify the return at the end of function + wheel_name = new_name + except Exception: + logger.error('Failed building wheel for %s', req.name) + return None + return os.path.join(tempd, wheel_name) + + def _build_one_legacy(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + base_args = self._base_setup_args(req) + + spin_message = 'Building wheel for %s (setup.py)' % (req.name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ + + self.build_options + + if python_tag is not None: + wheel_args += ["--python-tag", python_tag] + + try: + output = call_subprocess(wheel_args, cwd=req.setup_py_dir, + spinner=spinner) + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return None + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + req=req, + command_args=wheel_args, + command_output=output, + ) + return wheel_path + + def _clean_one(self, req): + base_args = self._base_setup_args(req) + + logger.info('Running setup.py clean for %s', req.name) + clean_args = base_args + ['clean', '--all'] + try: + call_subprocess(clean_args, cwd=req.source_dir) + return True + except Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build( + self, + requirements, # type: Iterable[InstallRequirement] + session, # type: PipSession + autobuilding=False # type: bool + ): + # type: (...) -> List[InstallRequirement] + """Build wheels. + + :param unpack: If True, replace the sdist we built from with the + newly built wheel, in preparation for installation. + :return: True if all the wheels built correctly. + """ + buildset = [] + format_control = self.finder.format_control + # Whether a cache directory is available for autobuilding=True. + cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) + + for req in requirements: + ephem_cache = should_use_ephemeral_cache( + req, format_control=format_control, autobuilding=autobuilding, + cache_available=cache_available, + ) + if ephem_cache is None: + continue + + buildset.append((req, ephem_cache)) + + if not buildset: + return [] + + # Is any wheel build not using the ephemeral cache? + if any(not ephem_cache for _, ephem_cache in buildset): + have_directory_for_build = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert have_directory_for_build + + # TODO by @pradyunsg + # Should break up this method into 2 separate methods. + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join([req.name for (req, _) in buildset]), + ) + _cache = self.wheel_cache # shorter name + with indent_log(): + build_success, build_failure = [], [] + for req, ephem in buildset: + python_tag = None + if autobuilding: + python_tag = pep425tags.implementation_tag + if ephem: + output_dir = _cache.get_ephem_path_for_link(req.link) + else: + output_dir = _cache.get_path_for_link(req.link) + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning("Building wheel for %s failed: %s", + req.name, e) + build_failure.append(req) + continue + else: + output_dir = self._wheel_dir + wheel_file = self._build_one( + req, output_dir, + python_tag=python_tag, + ) + if wheel_file: + build_success.append(req) + if autobuilding: + # XXX: This is mildly duplicative with prepare_files, + # but not close enough to pull out to a single common + # method. + # The code below assumes temporary source dirs - + # prevent it doing bad things. + if req.source_dir and not os.path.exists(os.path.join( + req.source_dir, PIP_DELETE_MARKER_FILENAME)): + raise AssertionError( + "bad source dir - missing marker") + # Delete the source we built the wheel from + req.remove_temporary_source() + # set the build directory again - name is known from + # the work prepare_files did. + req.source_dir = req.build_location( + self.preparer.build_dir + ) + # Update the link for this. + req.link = Link(path_to_url(wheel_file)) + assert req.link.is_wheel + # extract the wheel into the dir + unpack_url( + req.link, req.source_dir, None, False, + session=session, + ) + else: + build_failure.append(req) + + # notify success/failure + if build_success: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_success]), + ) + if build_failure: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failure]), + ) + # Return a list of requirements that failed to build + return build_failure diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py new file mode 100644 index 0000000..c1d9508 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,109 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("lockfile") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pep517") + vendored("pkg_resources") + vendored("progress") + vendored("pytoml") + vendored("retrying") + vendored("requests") + vendored("requests.exceptions") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") + vendored("urllib3") diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32a0714503019387c135bf0a4e82d26a527f9c89 GIT binary patch literal 2867 zcmbuAO>f&a7{~QyNp|BlZPS-@Yp1?9?J74-v!+8a3|&&JK+(fq(9PH&$Rcekp+t?O z-B?Xd*^UGD5t8G+!#)YI+fKdiu)|J$C^KHMB2KYM5PuZ;*CX<I9+Hom&4vNjZ}GYB z!xM(_hkDt+T&R2s5C6+F3}mzoWFm{0nbo#TRkw-VwktaAT1B_*BB$-)+Pc46ugV5K zvS;p@?HN=<?vF;hiM?M;_9wP??W+GMo<ZK8wP#{?-9KZf64}W9$$DtuCh~VoQ?ahu z&^)3!quJCvs(DOvR`a;#3C)w5bDF0#PivmhJgYgcc~0{^&G$9WYhKX&Kr_(1sCh~A zvgQ@dtD4s|uWR1WT+qC!c}w#{&D)xxW=r#q=A!0Z%_Yryn#-CWY2H^v_Ls)OO8I-E zNQ*EU;v7*Hq&(;X#&2of3lJ`#2j@wOc|f}Xhyy``f??2zAjcRf*|@neRtGc>IL)x= zt1i4LFw0{SHX4sp0#?$TrwD6flRxu59S{_BaFEbSz%UBZEE|ZpLvRr1D9{p`lM(0| zg960@L@=BoW;}(@f-a+3FetcSIL^YxE0yaDraTsRI3)vtqckfh6VDzekn`2$K<UHt z89aOl1u}OHVQv|F*0wo1E37R;*gJ-Bb_`@8`)9{Ao*Vg`V~E;DgRPi`y1zB@kH0a5 zyY6in^JAJ1jV*K6M-Hm(S>IXP*0wF`mBN}gw(NcFjt!A8AQJAg(tCMlJAApg&D7Xn z)HMQ5CejRFRSga4LTs{FNI#15IKxpS8<Cz7)V&^|otSXx5}GI;c~VVwjWNok%|~2% z8ASt#fpi%!NGhbqv519W3yy4z`;=kX947!q)qkYZi8+=|AIIodgU!L{{!Uv3ONZe9 z)-YzRE+q&;(8^e=vmQk&d^x{AME8=Y7~Z`jx+}ePMi#rv4<59>YC)>ph7=GnA-6Y+ z{KZnTUaH3G(RtW{Y2~SiqOcfAe}6FNRfuMxFw7atGS8Yv>#j9x&YJ8rw3W4+;fp?z zGfABEF(i>-lt@3Jgt9n`rH4{3NZOIEsxT`3zR1Y3YVpBg8(m0F@KU;2)}aV9I>fx3 zom9gCBcLr$|GOnDVg}x+7jd!?_aNiT<CAKr6SJKAr->IhNxLbyOS%OvmKX2KX0g$W z80K`q5(ti8FxrDxB^U{s!7LaSYy`Gd?S}#8f|n=vYa!lDa3NIwm&YfK;~&Bl=HF`4 zQ&}pn9oQ8{;5UMkvDGUF>%h<XSXSP67ga$iDKAb{3I=Yzd8j1J1%dnqbGHuH79$G# z80Vy%GM6{}7#wU8LProUFHKVrTu?5iX(r)m9c*V`6H*4N3l<|v6EQ7llMhrDFTaCf za7Y9jO45(|FkZFv%eDXXS*W%lf-^W1VwE%H)hT8mW?7uaJ<O(Mf;KSCiLgcr$a-8} zIQVY^k&<#@dVlyv7Ef6d%2c>Ntm}uEoQ!Qs!fAuBw9Ctfm{XCO7W&GRNHa_aQ}eFU z!B!@{@qV_na7=npglIB8O}YayU~sZ93$|40s3S#sl*1+``qHAD&8YVJ>e{2PpRGP! zTa`}L<G}$tuAmeSdpJVij8Z!)Sgk+*d~NM%wEE<WYM++QI!*KH6nUdKrOf&d$7j$d j9=ve|g#$aiZ^B)3+&R}j=h|27>Rq+{zk6)=EgP=^7bl2> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4242291e2d1730226c38d6873801a61dc63c6d01 GIT binary patch literal 20617 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c197c1bbdd923417a56d034e43ad6b8793a3a75f GIT binary patch literal 36330 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 Y!^K0z1LOP0f0R=HHVfI}lcn_k1^ZsEH2?qr literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa6b8fa45084296974d83ea0f7c734fe66c873b0 GIT binary patch literal 66460 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 M4!w8yLqiYzf9eiP%>V!Z literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ebe17f28c4b25ce59e54e278535aa10682d1708 GIT binary patch literal 221818 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[q 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 v_}FSu^yO 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b11b0eb04489d99e71b9236ba8f52391e09179d2 GIT binary patch literal 8098 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7908f7f929f9582e3123ca5e8eea130b03886970 GIT binary patch literal 26422 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py new file mode 100644 index 0000000..2bd3911 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/appdirs.py @@ -0,0 +1,604 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..8fdee66 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = "Eric Larson" +__email__ = "eric@ionrock.org" +__version__ = "0.12.5" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a39334a624e7672144f53e06605739d96fddac0a GIT binary patch literal 558 zcmYjN&2AGh5ccM8lWi)HxN+KR4qdl}h*YXjOT_^RxWH*8WVyCCb?QIOIvcug)OX-X z_R5J@;KXcbrHnP>?;Cl>-^_>O<BXvF;;(-c2_e6G@@xYHSLpQ$gCr%9Ntwt&IgrD0 zC`WQ^Ms{3|6M}eRCN?e8Jx<Nk&dM3$={K^NwYN81+^HMyB6yQ)8$87PlZy%}E>w|a zU--Ssb<7p7AM)s*pH$#&F8W&WRJ+sh&TnIGyj$mvTU7__P#0Ny^bxekKXa(PYhNlP zSK2%9;=b^(ZYQV3*?F=2gCmkf(#;PQA%AtquO$zt4bv|U(?-G9Mb@Q^NiP`dGRF88 z<pAOtW6E-E5FRnsD5&vsB<T)#2nwKIWtZ~*onhFs>}e?M3nNTC5}4z)4}TjPKsP)p z+HjziHxheN3-orw*s5N-ca3~2SZK~qW3^guz?@afiwpXl1|3ect0On&<Y#cZH)7NF p$-SdACq2-^rBcSU(~+?vJap4b>*dy{_r0RJ*E34?XE0CZ$v?@4s!IR> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f426ee962698e48ac08031224ad4b2301ae9355 GIT binary patch literal 1561 zcmZ`(%Z}SN6eabxEPLFvDAJ%v-NzzcWYkyCBq)L=lOS0HM$wsU1QdcQa%{PJm86}- za8{FT{=u{CKlDqu?W(`fRqv%V(;z?ykUYG6=-zYB)q~L}B+&lKuKjx867n}LE}9MC zC+PA842&>Zk_2a~q?MIe6tP{}m6JFIJEdEBiD$4|`c;qw27Be83X>49&w|$^8L|Nj zVUF04MKF)pgpJtvHBH9+fF1m93B|`}1kTfAGW*~k_&S--s15}GW6h<KfImFS@+CiN zY9*TTKFeCg1(*j9i(Hv4Sa@Z#SQzv8zF4d)UaOxoA-Tx$MQjv0MtKBXegT6bd#bFJ zeNHJ+*4{ZMuh8c12wE5cf9QPX380GTKyvkzZ+NMF{8CXbwEOVUgJ+NR=vWD!RZp^- zm0ajBW30#EmcQ)Ge-bf*XZ{s&D~e5~c)ZC(eA<+Z3mI1;{%w_}x8<$+hYkBaPutD6 zU#rvGi<Kz9IlXn~PJ9x#MSHWTrOL|k=8Lv|{$0M>qS5qp!)w-vI7g!Lj;J`zD|Xnv z)FW_x-KM?U5r*%<Kxjk*Dh>c$a%8~*_Y6n(04Sp98RQ1C4_bKR07KT^2Bzqa?j2?W zSD+1pogR~wyQ8VM!+g5)lbNlD#;ugAY$0_BIVrNT*aBCBC0~m|sv_U|OQqVoal8!> zNI)}RV7i2Z13IStV=iUU)Y`3@b**&RM~bvhx^Mh%nOWM;I<06&!bOvSZW!Zh!v$9< zZorFIz#!2|s6{7M0MtY<ici3DNe&7KoiXHm3P6!Fkj##(C=g^Z`wdb-_SQK{$C+z; zEz0fHlO>-%`{n6WHB%*CPC*Y-<147cS@N=-*#aro5eO&EdhP14MfKtuE5I`=@ooqK zhJZ(|!vlR%Jvyf1Gg#;7FE(WH((e;kbbe!EO&TqT0E*z1r5r589bLJ5Z)dH1=s}lW zunf?0PQ?=yGI|CDQU`!6M5a{i`PM%|`LWNpqj{scAldZpjoHxnW60DtxGb)L6GnLA zV?cV`<xX(fHnrs1?`vP%B75HNvh>2}LIu?dWaVJw;wrx2;N5rGajLASzk+Q!fq_tu zdUj-c_7!_fLrdJii$R*=sWin>pNIf$L#V35zM_oqlIdHPL*s0(v%_9tMybj5_Z~BM zjFOWt-+!p9TTpZV%Ypd1yrVukzEF@In-}iaS;f=zt=REDBaFg>AFGC~OMVZPAd%|8 UiY$;eh&!?aFNgv!{3xLR0TEA*JOBUy literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70654acae50c7e7028a5367e2a49c10850ee874f GIT binary patch literal 3044 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 VAz1+ZFjoQn00M2+hK!|c{TIm86T|=j literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ea47feb5e47e2209513c144f315f2f039e0d553 GIT binary patch literal 1774 zcma)7&2G~`5Z<*N$1zPCK!8Aid;p|KG~ri(givWgs1l0!sRW9IR<3u`I(2Nb>jWC* z1ikka%8_^ANqptRD{x|FT_+(zz*;-|H{SVX<{NvxUUvz!Z~ldMS4~2`<DzU9OxB>Q zJ0Lje5>B}h(Sgx5D0xP>$*lvzEn$8(yB4e~+=jI+ELc}~^)+ca<860qS9pORfK0ag zBFMbQFE+hiBE4{sMq(i1ER1&w4b}2cn~R=5j504&p6_M5Quy3eeouH|ygCqrMDBY$ z46-nZeYxLqe*iktq`CDx3HAb9l+A$28gz9XgdklCP8jIK0qL3r{H|5NM!?*GeVf++ zxSQA3eI+&!cYxPm!;wPYfUYoX8Tm{;!KLs5?Er$)og~{Vy%PMXl!<H_xurzZ%gsHp z|CPupy!TVJQyGr@OteS7Z1<9g3#r-z+1~Cmc3<6%?~VAKfTg2bH?rRSoxY52_U=A- z(B5jNVY(W|D)Xag^<x@;xE=JzxT!lEiI^v{t-~E8aVC?fShUjp+}sfvqE^};I<8MW zY{5xj!Vxwc|K_DcS~N{rfkE0J^2*4MhC+K*2nTmfC9*n9{$LJH{yV6JIb&vS(T>eU zBr?&MGu4=RRvZTC5H=jA&Y>g6$<voMX<-FZH0MYqh!Q1E!)EEq%Ito9)@fFAhq2fn z2*z@ku|dLz5zdzwdq4D};zZW);u9#AP+)ZCywPScbP`j56NSPt91|bC8^Ff2q1qaB z)dDf4x62J~9#9}SP#Xwsahq3RtZ;|dG{GtG^+aBK0yU%w-uW#V$c_!X^(+Wv_=GSz zq3LpnGoxg?DN!-EA}G4t;(q2gizMZ>Fb*?@6*}jfrUb-DpRx0JKZc)BhmKE8k+e#M z-w>gqMzjo*3F(s~z{ANGqo_MWVs3PBk0EGUE*RJ6mq4*hVtr<Hk^Yz`ZSdN$!Nao@ z4bvlILMKK@zfelv0C!%JSLAKUA*hK{2n5mO_ArH*i1|8^SbU49kPRO6Sv2NwE!N2t z7k<w$5Qi557e!=yw!B;-{5Lu?P13)`3h8+TQDJ>!j$Ar!%;HrP6@K%o5_2L~P+$eh zGbk2#KC7o0#ZQ9XIq1g}cP*f}C2_aYwDT%sJPDwFYQ^Ut{tyM-?BXAyYe8$z#dCUj T?mR3C@DVac`(V)}v$66EF*8`j literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..539fd94ad0e8025a91db0ac2fd47959bdfeffaac GIT binary patch literal 765 zcmZ`#-D(su6i()+JKfH%i&sT@;gzsLXR2+ng(4yddQ*xnr~w(KnQWciOcImqwCgkY zB0hmP;)BeUAPByKSDyLlx)scjlaurP%*lB=81xaWuj!q4UmS#f)R*fOK=K5(`3Ye; z%20+mDlowqy+-1$hnO?(>phI>uR+}weT#(i1}#IVIou;Yuy;B(S+O1N6Tf5D-Y(xL zdZc&5`_qc;@}Nc66dvC!`lNqD@olB>_*RQ{ihzY=0G(_@CqwA_d&^|E$e?9p&MP$b zf5BVP7+1Z8<};a#Q^>>TlgZgjW|S0$)%V;aQ<YFI4a>%(Dg-Xi&m)y;!!(Q$Ra-9# zCAEE~wbWGrc!O0vdY02UXVr#kP7<kHMM=p-CUvCQhXpg%fDxUi7tBPh@jf8!&$SEY zWM^IUFNNG+NB?iRusPRWZMVHHxVEcd7=p;D%viN)*_BP~QbBr}7OZ`jYpni^^bky% z@Y}{p=VfYHT&6mnN}e%o;zGygvm`k(hvHG09neIT5BKc!=whb%gX!V%aXg8kh22~j zn{vK;rNrevoqeo}&F<zC)0DnvR0^vlkEtwFY9qC*f|EjK3(g*6XvExu;NTG+;@hr+ PLpX<icX$5Q1E~K2+Hlc7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5c65142c6fed109257966359ba0a6b6a9ccfd7a GIT binary patch literal 7644 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 NX!sK~*KFOY{U2+T7<&K! literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a28d1b311a1c1eb0503f6519d4d436ec579605a GIT binary patch literal 2162 zcmZ`)&2Aev5GJ`RX)VjH`<FUKkg_>NKw`CNgC;;)I8KwI7x&-*X$2Gnwd7hWuXeZO zO0o>~WIu>~>^t;H_FD9iSLmrTT*-EVEd>s_oZ;~MhBMUu#zvb!`%CWp_Rkt2f8)oh z`7qgoZaD}=6ivvO_9-Pl62+8vPL!wFnb-G}e@MEGw_ruOv~2Cq3vGY;ImGW(^I)<E z-R^_Xq)!#;Geu#q^VIj1uNvp1-%w4}g0ZOrwFYBLeW2D==bZKfwV^g)Wlgo=w5{^v z7cxl(GCY12C;E+%d9IC|QbO7s+Tj?qd{!-UX|hSGxa3jJv%yG*1)mM$aL8vdSQT1x zJ=JDj4CC~O8!Z)&(<0;2xf)EONSg;-f`{2qr@R=-f=6&Fk1Y?A%xbU)kLXLE=x|bK zI4WGigY{wvd$e;FW@(|*!tyMt{8Zj|+fMr&JjkLj@c?{SfUS9MvXdAN065@-0}XAG zIpTB(DmKgQuZIqhw3bgS>>um#KpR^jkX&Vx0f2TcY?y)b`$BYi0({Y5Zgdo%a0|Sx zLz89&9xKBzR)87!%()#(mCYa)*En}8VtB*YaAeS5K)2f<3UWpkM9>8V$rcQxrwH63 zJ?Q!dP0QP&<}!tV*p%D#swgk-)@xRA?|P+gbrO{fY=hP6pTuCo|2yyHCZ5Vd_omYH zqAY>1+TPgo1|uP!*vIL&Q}s<K^68^5i|EPG$RuAykDos6z3%04{xD80hU4K$p3c4w zN2j>xx|r%zWu_O(aH#RFO_ucVqL!Jso6pNYh&YW4A+|6=O%Q|zv`J6z)C6I7WgKFl zuwi_$yZC+rlLfhe+PtKHu!2H#=^2CAvIElqU6++xLLBMhDyxJjTg&gRXIfxW`l%di z6TsBPrV{I@S-;vV#HX-e@kt<SZF>57J=UdXAwnob*KkDF4(<;ynRgasL`Luc90!NQ zCj~oh8%_!SekCdUh0FtI;azFJzo}K!(R&5CgA5(+a`XABYF-+XnX*}xWtTdJ@6+0Z zpjr{-qO$q|+}Mvm5XxwWZPF%VG{Dh6y;slk=Jt1}Vt^b~4iltdZsGmFj9#!yatW`e z!fF6nRe)zO0}Spf0|?(#CKLTXxSJK=M_{|mn<m|Ao$l0PbleW=)8@ev+yxXRCJw-3 z7v6#)Jb>$85_2EM#wFaz0@DdfwdulL`uIFna2qod7rMMxUxznCWH5PF>E_9CQTj?2 z^1XX8x4`N<B<KE<Xa{})T*T>i9YMrV&u$M~VCb*dQALlL;R~i%H6Eh=ea6q;VeB2e z#fq~iHrgxpZDD1k#Z?T<XP`Ft%H5=BZsWoZ3S@F!Q05MNzJzW!K@i}#<@s#M@@^f= z>+|pq+W2^2wL%rQg&1dQlHj}}#P1WCEHy15R2B+hI&g-;SLPa_i?M@o1DXSg1#j?S v!Blkkg0|0sM$id94A$F$)4_{fvN)?=?Pm4o;}mt?%HUar5bAds$&U9Q4>=ga literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e75252c6c62e2a33c9e94c893f59bc5873e654a5 GIT binary patch literal 4682 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebca1d2bf1470085b56215427e27e32786d42374 GIT binary patch literal 4246 zcmb_f&2t<_74Pnuotgd6YAp-JR=`=3lv8VB$sclXQi=(-2{?cVk;@KSxQ5a8tUS_w zxo1|kme~t3RUAkTxj<1ltcnX<I8ixq;KU!%2QHj^=H?6hUeE68BML<kW~<-y^ylk- zzxR7@Z_dmV7@ofbiw`cm$k;#VWAfOjyn_<=AS9E##p>Cc*SYx?bz$CC-NIY6>~^l6 z<21%<Ic>M@qHfDv%WLQB`F5dRXcy~6v^mm!%IYQQ$voaO-(|8Oi%*#>hUGo0J}db; ztCgN%SGHE;+HJ?1y`Zs;>giiS9Ny`~VJD7~XeYcKHIio><7$>Jeedqw_df{ZUKjn^ z=|zq0R;cqy_$2X@-Co$BarDqThjI%gu0SMg#8WmBlJDb(y~Uc&1#u&au&lFzE#Fwt z`HeSLWZ39RtQ~gf4So2=ADNoL63-tm_f)hKB;oQ-pq886mJC(A+*ZpQTfToizSjBX zj$CQ@y`3wUlIHczE!Dc*y!Pgs%XgQ1QSV~ZiIbq!y7;8md3?38HK0aQ{GG5PyK1=+ zG#+B}PNKT4<v3JP(254(Qg2tE@}ZcYY36V2CShEna|sB>)hy(ZgIj1Y2QQ<Nu$1lb z5vPM^$F}>>t|rVp?PROcIb(CmOwdd{dwAP8QFM=!O;4lVK$$+Y={qR#8brtlJwVQ! z6w-RifgNB3IIzdK$c=H~WT>dSvLt8F@5!>9#XB!6@)X_$gOk&`us*pDwbmfe(vu$- zbJoA(17{Ume2)+96ky%<)CGLQ<WhXZhgM>Z(7w-8;pe24T8Wb>MRP{(KD&*3+C%S_ zhmubUkVW%dLTyGmpSlqr<|3Bnq`S(bo7&rs`deyC_beNgrMJ(A&Xb#|bDKSQYv^LW zi+i8lXG1sT*rAfTlI@G3mwM1GuRg;F54z%;Ry@m6torCz_nFL(PRT+tw{;rrMOpet zYzkw$nYDLer}7vFgp{z8Xits(VTu7V1>I3h<z<MJJy`sy81kXO4dIM*PkX#6?!iwU z!M%YC4lh(L#=;%M(k0EeHQzY~i0Ap$&9D<b>8Tr6X=%cr%?7U=*k(!g+r4;cwbg9| zt@y^$bbQU#_C{CkYWHCnklSbn-jMWT?e5?!>UOlF!XTzMkOr4mU%~3yhNta5=db^h z9QyT`PSt3<y>b`#Q0m8_zY%qe<JaaDomzd>Ou|Z1i>RyJo8&BaexxnG+0(Yfx;hsn zVLMh|qv7XB(5cl+B&sCLzPY&9iZGUR>1k^-Otih#jXH|XtaIj=wY;|Du+`MA3Lo`D z3|*l4pjf6W6QlT(^V%{<0$s*=qEJp-ovd4zvbVnzwEE$(Ygfxyk(Q2^AQ&$QkC#fN zg5dO<7dE%Khf>OUc$ayBmmsNL5rfKc<22}==%KsxP>lEd7L`=QK;}BzolnIGp+Jg# z0n}JSai4Y0*ev1O1+~I~8PK~mw0^=m;zLHBChcE}vrOi;E%iZarQ!uPgxe3{V_3(b zb&QV)<0IDYLSm(aa^sDAB8AWGiFGKH<gmjh;~k*Mhs<EJu%=#te#&5a41r6}=o~Q# z0K&lI?PveOqv%Y7g5T-}GWK_VKCC(F8)(vndvv$oQL3xdDQa+G)gVcfcA8z)4ia7d zHol^bev*x<+3FI;smmk?@Y(`aj~Pej%tr5_J0|ckGKUSbkRj{}8OB<$1YZzk>xePT zw5c&j>8UX^J|r#$mnR}n254qpTI=k|m4mhsC&GGg&KSrB!C*8@VeJdhlBLem_($jO z!>G~*Jy|jbddeks_AMQl%LOSqse@e*qhX@Lwot#ow?$^+EOjPhSJ`ek$&H+p)^Gua zS79m_ruu7Us;qD1$s)zpp_>6C$u~i1#Ot4mY^C3bk0}I|2S2+9HgE1$yM0w92d|Eu zqzWrE9#(^ntb*O(Q2j<y4XSYGR<*BMt!U$Fp*nsJX9Csk##Y!!mZqJWUr=AiEv_B7 zq@f0I92s(ODp5fvZiecj3G-2BQv(l;hyBiWC{3Ju7Xi|E@@!9qWGjEnx3z-0h$Yko z5{7Q9UbmOA&v|Nl4MOMdA{)uDR-{JCMQYvwp0s14y;Rp|bk4ZF_J|>U6+AZUn(dFH ztpaU&feQTzzdXeJm}rbS6##FM&v8$b#T>7ICrUy9hGlm_3|>6M1IO2xqL93ai1rqW z;o5O%Fj~~C1NF@<9@i~D@wrRCruoE_%pS}i+ITu(y5kWNB5woIC{shg8(KixJdh@U zw3iQ)0`fQuqyemFfy-77W~y(Ic#Fgxh|hVidY8H=k;{Zhai%(7{sbMdNt8jVxHRsF z6Lr6QM0ZL-%x!&!%I+fRo(O0M{YQ3|YnpQ`61gQ}%W2YSCM0SoE^*<vM4#4KBp{Re zDoea^dXn|RV@LUEk}__?sKR{T(+BodhIQO1Sd{IQw&RU`zX;`9bVuawyxxXPDL zBu-;J;N=Bc_6&)$B#z#_T14CLQL;RO4_-R~DOXO&B{J`zfPJ!}6eW@IoIjlLfPg6H zs%Du_2ZZ$b?B~B$`VR+68<we+kQ^X&F$mQ506e7&l%=)dX>n|#jRB_4A$}nIP{yum zBn*qt#{Uauul$Y_p=)Ho>>^^0W1T_G;pas5Ua(HY@Rccs|4$x&^-rY9fAILL(;bg^ z{0gS+&LwOM9&gfgq#K94{`?nuy|p&T;cv{v>qrE>35UbwNrf**1S@~0qfCfk?u&_F zg>vSi_I$q+v_s$51>bLXWxqxBlJ7t22d%8fBygEl#7ycv65l8BK8YWbSSNAdAf`qP zrRE{1n18XJD6DwryjMNP^SpTvc>#KA6-6|pO!WBy)qV(}i}-)JH2!aC?xp_Hp_Zj_ z&KfUeVYUyXnjnVA1l$IR30WDjy0oUjEFo1pS+q5KpQN((R<nD!L9ryBgP>#-KT+Z( KF>iUcXa5^X=d5-B literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..792502c77323933cab19874ce185c1312798f407 GIT binary patch literal 666 zcmYjP%Z}496t$D)(H9i4L3{vG7K3?>W(FYyQ`X%ut4b*H#O^eelUUbo2dZ=hTfPBU z@(+B8x2*UDR$QkuqSv}d=RR_Ce3SF>ctFs8@rNJ21%&+e!L21o-k_UD2!aTzNJZzA zdLF2t3g;p6L_{L~LgzgZz9(7whhlR^-Tf&qmU7zE78><daBU@Ey8o^$Y*(6H6e+fP z>!W)<MK|XNE!C+dpUIB4v7T7Ei`%%RZP12ouZ`M7(68|>ZOQjQ1a0~wprqsBEk_}} zSr)lr;YH-q@+;#8MncI|xs~AhOSy*9*s^ewVy{t2$P2}dare5X_@$D0CGD~iW}7Un z)h`*_rk)sNSqLF21zZ|&QPr$#oAq7KNE{G#1EA;Yk%!oWU#A=M{VMja0)K0l+~j@| zxP$TEHPcXTxRq?ffh`&(Bp6l!yIke@sX4AsHsVE*>&>$#c5!;O0`+upe0Ihzm@f5E zSsTlhI{K*V>*vL4>yw@58(E76SSRl0((D?z))F4;Pi{0l_+nnRd4NEM1Dev{;H1Hb zjsloqElXw>GjCZ0V~o3Pz|ga9Ilia6(*fMYoJ(I-jaV!B+W#%ax8cl)(EsNju{5Ti literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +import logging + +from pip._vendor import requests + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), cache_etags=True, serializer=None, heuristic=None + ) + sess = requests.Session() + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument("url", help="The URL to try and cache") + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print("Cached!") + else: + print("Not cached :(") + + +if __name__ == "__main__": + main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..780eb28 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +import types +import functools +import zlib + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = {"PUT", "DELETE"} + + def __init__( + self, + cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, + **kw + ): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = cache or DictCache() + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ("GET",) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, cache_etags=cache_etags, serializer=serializer + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update(self.controller.conditional_headers(request)) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response( + self, request, response, from_cache=False, cacheable_methods=None + ): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, request, response + ), + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + + response._update_chunk_length = types.MethodType( + _update_chunk_length, response + ) + + resp = super(CacheControlAdapter, self).build_response(request, response) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplementedError() + + def set(self, key, value): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c776728b0b16510c54557c3829fc1948d0382603 GIT binary patch literal 302 zcmXv}OG*SW5KX!Vaa!jB;sts!#^2x!h=_tq7mm0XkPwr!rb#CuiSYv-$UAtF-n#M% zuB^0LP*v|!6jf)FNrfOj*w*b0^v_KGqX2LU8MdJaB(O#uUSXVZp^L6um4M47sz+ZK zMrz!TFO-(&j6X;q)s++~4D7NV^;H8N<=OOkb-&@W|EH9oyd%E`Z7APw#Cerilq4}v z8moo$fpnhSwUo}o%p4_g$f-;FyRn(yw_fixv&Dj36Q|r%nGl)Q(`RR%4tV>T#UW{u mMp#dVJGeE`Tm4G{p;Q?aDcx}|{rYid#iN!d`LmGk-NZlL%~S>e literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52cc3f9b44e647dd8672080427b244d891f4f1ac GIT binary patch literal 3236 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 YPUP<a@u&x{vnn(OqZ-s3uTkIo1`H+llK=n! literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75b6a5b9d634ae153a2207577644a39bc2888279 GIT binary patch literal 1558 zcmaJ>&5qkP5GF-Q);f0LqCwL3kg`B71`?}(K{h~;7D<7&7a#hA76t-B5$RoRWlAAw z@5WGo0NDpwANvk{5?y=hEA-SE%I><0pae*cI2?WR%@3arhkXL$kL;u8zcNDp#E;zw zLHHV`J%mLPNlUVzGfGho%3u-90xz?YEy7ty$+tv?GCC(RQsG-Ri)8#G8TbAIYci&7 zB8ydFi%NSrbIKJ91@ghu%&KQueyno5xf|e3hyDZvMP^izSs<wl&dH2PCPUamd0ob` zcTNE-kq2-R%f7q@druDJ5cWhy;KPl!|AUf+?NEX(1nxMW!L%5LhBib1JFuWr@GQ(L zt;azdT2;<X3^#r!CV}nmH)(B(6>vybnMvnWDV4G5!lW-wggCSh^uv|>G8gsg^H1IU z@aV*ppUodUdX)Z@)<u24(AH&TdH<}|r(fhJYdrK*tdy3ONpl~KN;^}P-G@yL5)fW9 zsb95;5QQ$B5C`bJr$pE9U$UI+^!Ywr463I)0HGl#<bpPILp#EOr`WP1<;H>O!Ht&v zre1l*-GW%=8Z2nO1HHZn3Z~N>>jnqz7&H&~7=(t|n>)}Z*g*B@yA5-}1>2Ah$ZO_x zVMATiu#0#@-cq>5u*NzEds_#sat4{S@zUkGI&C93QD-eHv}=d1g5V0PAbHY`Lr=t@ z!)>(6%B5<1>Z~q|vR8=>;m!@17E?@UNJqhduJ`Ey%)7%m0)rj1jqi~Egfy0_1P`}S z_0C)czX^Z11#=hG_x7UNS?3hgI543YTOZfEAe`Olus7rz@_h6fsu&U*U}7nGIrs%S z7rY79-+!mdS{XjC49`oInL;0Ns6+0K6^BGyUTB_inYru*wB&^UY!yE(+;N|8N1iPm zH1H?WG3!zhqM1S8|A$)}d9)AVmi4v4Msz*e<LA}?(nFd!Jw3d?b^j}G!IxH9j*Y2u z^o7?|RRWQFTvuExCAq7BT?MWqt;>s(sSo*>b_IbszAS2V5llXY!!7~A6$e3yZ^8lg zoz50Yh_)}pqLRxJ<$(|{ms#0q48A44O$?Tl50Amzn%lTsB74dAR0IlaIE!_f1PM!6 zzXxk<P%|CJh&Erkr2#a91>hTCb_ZUL$@bNl<a@71_hB%6{ul2;ZIj0xfhQPli>*3< IiXX6l04h~lTL1t6 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..1ba0080 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = (IOError, OSError) + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + + def __init__( + self, + directory, + forever=False, + filemode=0o0600, + dirmode=0o0700, + use_dir_lock=None, + lock_class=None, + ): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + try: + from pip._vendor.lockfile import LockFile + from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile + except ImportError: + notice = dedent( + """ + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + """ + ) + raise ImportError(notice) + + else: + if use_dir_lock: + lock_class = MkdirLockFile + + elif lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +from __future__ import division + +from datetime import datetime +from pip._vendor.cachecontrol.cache import BaseCache + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, int(expires.total_seconds()), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..33b5aed --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,29 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +# Handle the case where the requests module has been patched to not have +# urllib3 bundled as part of its source. +try: + from pip._vendor.requests.packages.urllib3.response import HTTPResponse +except ImportError: + from pip._vendor.urllib3.response import HTTPResponse + +try: + from pip._vendor.requests.packages.urllib3.util import is_fp_closed +except ImportError: + from pip._vendor.urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = unicode +except NameError: + text_type = str diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..1b2b943 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,367 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + + def __init__( + self, cache=None, cache_etags=True, serializer=None, status_codes=None + ): + self.cache = cache or DictCache() + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + "max-age": (int, True), + "max-stale": (int, False), + "min-fresh": (int, True), + "no-cache": (None, False), + "no-store": (None, False), + "no-transform": (None, False), + "only-if-cached": (None, False), + "must-revalidate": (None, False), + "public": (None, False), + "private": (None, False), + "proxy-revalidate": (None, False), + "s-maxage": (int, True), + } + + cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) + + retval = {} + + for cc_directive in cc_headers.split(","): + if not cc_directive.strip(): + continue + + parts = cc_directive.split("=", 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug("Ignoring unknown cache-control directive: %s", directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug( + "Missing value for cache-control " "directive: %s", + directive, + ) + except ValueError: + logger.debug( + "Invalid value for cache-control directive " "%s, must be %s", + directive, + typ.__name__, + ) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if "no-cache" in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if "max-age" in cc and cc["max-age"] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning("Cache entry deserialization failed, entry ignored") + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ( + 'Returning cached "301 Moved Permanently" response ' + "(ignoring date and etag information)" + ) + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or "date" not in headers: + if "etag" not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug("Purging cached response: no date or etag") + self.cache.delete(cache_url) + logger.debug("Ignoring cached response: no date") + return False + + now = time.time() + date = calendar.timegm(parsedate_tz(headers["date"])) + current_age = max(0, now - date) + logger.debug("Current age based on date: %i", current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if "max-age" in resp_cc: + freshness_lifetime = resp_cc["max-age"] + logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif "expires" in headers: + expires = parsedate_tz(headers["expires"]) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if "max-age" in cc: + freshness_lifetime = cc["max-age"] + logger.debug( + "Freshness lifetime from request max-age: %i", freshness_lifetime + ) + + if "min-fresh" in cc: + min_fresh = cc["min-fresh"] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug("Adjusted current age from min-fresh: %i", current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug("%i > %i", freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if "etag" not in headers: + logger.debug('The cached response is "stale" with no etag, purging') + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if "etag" in headers: + new_headers["If-None-Match"] = headers["ETag"] + + if "last-modified" in headers: + new_headers["If-Modified-Since"] = headers["Last-Modified"] + + return new_headers + + def cache_response(self, request, response, body=None, status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + "Status code %s not in %s", response.status, cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if ( + body is not None + and "content-length" in response_headers + and response_headers["content-length"].isdigit() + and int(response_headers["content-length"]) != len(body) + ): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if "no-store" in cc: + no_store = True + logger.debug('Response header has "no-store"') + if "no-store" in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + if no_store: + return + + # If we've been given an etag, then keep the response + if self.cache_etags and "etag" in response_headers: + logger.debug("Caching due to etag") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug("Caching permanant redirect") + self.cache.set(cache_url, self.serializer.dumps(request, response)) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif "date" in response_headers: + # cache when there is a max-age > 0 + if "max-age" in cc and cc["max-age"] > 0: + logger.debug("Caching b/c date exists and max-age > 0") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif "expires" in response_headers: + if response_headers["expires"]: + logger.debug("Caching b/c of expires header") + self.cache.set( + cache_url, self.serializer.dumps(request, response, body=body) + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = ["content-length"] + + cached_response.headers.update( + dict( + (k, v) + for k, v in response.headers.items() + if k.lower() not in excluded_headers + ) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set(cache_url, self.serializer.dumps(request, cached_response)) + + return cached_response diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__("_CallbackFileWrapper__fp") + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + + except AttributeError: + pass + + try: + return self.__fp.closed + + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b"\r\n": + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +import calendar +import time + +from email.utils import formatdate, parsedate, parsedate_tz + +from datetime import datetime, timedelta + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta, date=None): + date = date or datetime.utcnow() + return date + delta + + +def datetime_to_header(dt): + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic(object): + + def warning(self, response): + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response): + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response): + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({"Warning": warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + + def update_headers(self, response): + headers = {} + + if "expires" not in response.headers: + date = parsedate(response.headers["date"]) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) + headers["expires"] = datetime_to_header(expires) + headers["cache-control"] = "public" + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw): + self.delta = timedelta(**kw) + + def update_headers(self, response): + expires = expire_after(self.delta) + return {"expires": datetime_to_header(expires), "cache-control": "public"} + + def warning(self, response): + tmpl = "110 - Automatically cached for %s. Response might be stale" + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + cacheable_by_default_statuses = { + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + } + + def update_headers(self, resp): + headers = resp.headers + + if "expires" in headers: + return {} + + if "cache-control" in headers and headers["cache-control"] != "public": + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if "date" not in headers or "last-modified" not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers["date"])) + last_modified = parsedate(headers["last-modified"]) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..ec43ff2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,186 @@ +import base64 +import io +import json +import zlib + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + } + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u"vary"].split(",") + for header in varied_headers: + header = text_type(header).strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{}".format(ver))(request, data) + + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + if headers.get("transfer-encoding", "") == "chunked": + headers.pop("transfer-encoding") + + cached["response"]["headers"] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode("utf8")) + + return HTTPResponse(body=body, preload_content=False, **cached["response"]) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, encoding="utf-8") + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..265bfc8 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl( + sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None, + controller_class=None, + adapter_class=None, + cacheable_methods=None, +): + + cache = cache or DictCache() + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods, + ) + sess.mount("http://", adapter) + sess.mount("https://", adapter) + + return sess diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..632db8e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2019.03.09" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0677bd81ffebe8f418bd41701ce35edd4b6956c GIT binary patch literal 265 zcmXv|OHRWu5Vg}*LWS;Faf2)xr$5n12q6x@23D2OD8vppa%?j;F7!s+fs<s*iYu_f zuEa?1&CHw8%)6b<rX<E!eet-C`8zfLk;URB!ktIrgi}R&x}%ivY?txTJ;}#EG>&pQ zO!hAV#bLTE7gbTNin6-PN5i-=C@`HFP62{ICyfU9BshuMk$zv9MHy-@Sg4V;M)A1D zdSp)>z}9W_W#H=uY*?1Q-9C4y7VW00*aNfD&ZTy~R%-rk^?ucKha?^mziDoeH3GeC bB?FLJdVs=y3@2B;;crS@C-W}ZJInq6o#{uK literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fd4d139ad71a0a959931c7f559c4cd19fdc5e04 GIT binary patch literal 268 zcmXv|K~BRk5VTW8LWrKY^#?gLhC)OuA%u7U7dRmy%Z)eS$Z^ctxWKiq;SandS5AC^ z6Pv1xw7WCA($3sWr-zL2rDl&6&F@kCBO`K66=u{l)7-L-KXA?<1HNTjVmiBH#pH+X ztl&ewc?N{rVlo_i<4c*q=^o1(Fq+2T_;1KP8W%qq=A?G*_eIbysR$w|6ish6U=SUO zbt~mERPG|_^IH0}IEl^jsYQF*RI8P^7vwTGE<|PR{LQ<~S>1k&%U$j5#ok^>*(u|s WEdBd%aM|_x)xs606k!Z@#Qy+4oJp(z literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b406cdafb5d1bb02bb914cb264fd9a46c40b936 GIT binary patch literal 477 zcmYjOyH3L}6t$C74N<$JPFXXw=2g*32qD<JP?k!_3b8{RC9&nWDOAA3htQFK;7hzR z@e54YDX$})<Lhhb`rLcZ`~3hIyv2iSZO(Ul`GI4CGsAk<2muQ~AaM$~fW#%<Ggvsp zxdc&XeHA2BDweX5xDTFw5d`y$)nUoWvY?@)YALHaR2dCfRjartV#RnB7ChMoJPniB zRvHOfj)D*KDVQZzEuf)icwtx%j3|)97e~1p__&R|2V-z!EjhDw@K-A8XouI@6S2y4 zmoQnyCDlI0DJv+(+RHhsBB){d3Z!o;f0jr{*2IdUCYC7W1);J=r9?M5#*=zn9XI4C z!J;|XQ|aV3m&JZMo=(vm2_}Z$-3{+VwK`1lwN19f4Xp^5=zCfy;gXt>>CP&nlJ;z4 qwnG4Wj<j2eT;0W(@C0LNchM$WhyP^9JZS%9JLOYrzb)cH-~9q@OMyoK literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..84636dd --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4658 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL +BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ +SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n +a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 +NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT +CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u +Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO +dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI +VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV +9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY +2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY +vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt +bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb +x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ +l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK +TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj +Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw +DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG +7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk +MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr +gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk +GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS +3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm +Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ +l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c +JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP +L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa +LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG +mpv0 +-----END CERTIFICATE----- diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..7271acf --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d41eb74d85f42c8d82b48944f19574b500b5727 GIT binary patch literal 852 zcmYjQ&2AGh5Vkj)-R(kA0tXN$ABjY}r9Wy~A%uWPa4CouBqE`WyLQrzcGp|48=8__ z2oKVT6Ys#2_{xb_;KbNTfRSc2W6wA9*&aVzUk?$;4|@OOT@Rt3CRm9B&Qs8;4Td3x zGnC^l&YiA<P3&Z~-0iy7uVwYz>w3B0^&xgy{VVDQ%sWOc{}%>$%h9zrAGVFzX<^-b zSEM5@E1JFFiYH1)NVpNlW-S#(9Bco5=k4*U*GGv#8!>F^pwB_8mtYi{Acbd6wPigA zya%er@U^Sz6EwqfJi}jb5h!e;DN^1HP4NU@`x7+B7=ahe5ioSFzJ&y2L4~L@PI!?B zmKFmd`ZgW_+k%{q6(^OFu(26h$YDt(&Fw}E8;7P0Ie`L;RDON|l{is?@JpJf1>ao2 z)VN&a{6mpm&w#34j|jO8sFZZv>sidzZs)RutKy7^(;+yP+p11wKn8Ci56M8NL-KiR z+FH|LTBSv$C=k(We^YebcGGJoP@*HHklO1DnNy`*!%n(z#oFz2&U8J=M8)BS0)sJ> zb-<SI_8rM4Wd1&nN|}zR;?ao8s4p@GPZ{MhIvvJwyV@)EM{GBV%hC3h>bD0&nLX<7 z9UMd_QJIz-mSC1`T$aVBon&}r7OlcW6imn{IinI<Msb`Lsfy#xa;&`thkIrq8eotg z;t+fImJ@&tvAhFoM{omPBJz?dX+}ua!06`1YW`N|Se(~i4xluXCgDRMTf`pmKXcpE V2p;ExU1a=;X;Ycp2EK_KwLf73@OA(I literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b49c631161656c2704d4b21b2fc285b016e501b GIT binary patch literal 27187 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40b51be844f29e577751eb5c0a7f56599f516ae2 GIT binary patch literal 1128 zcmah|%Wl&^6rJ%aZj`jpiiZ#@SVf{Wk4Cf-LXZ?yNTeWzl_fNCJd@Pb*fBGcK%(wa zslQQ{`~zQNi4`k;ffe`K4GkNZXl9P@jql^!<4&_#C$PRncRqag2>F2z%jE!g0b3uy z!3n35q%@=yu_dk44($@#(n;OWEwLlLv=-JVIV9ZW-WlPZpbI<nd96=c{!a>_TC}*? zn@E#%W=3?6Bh?q?of;2>0?%f5%#&=?H<1y&C_YXy0oL1{WYj)Lv{A`mVv=$8GK=I) zCmMXs&g;WA>-Sji?ZK-zF(ml2>`SC~0SFROPD1OP3@NAFI`czYINavW8ClTK1zc7P z*gGc<39;f@QODF(c`;Ux3vY~#TR(uq5JOMN!n&}&fYaE<S->-Mjkh3h*G|cWj~-4S zCOvAc6|SD-LMh;!6h31~mKeqq22?KE*5Z-}rc;G;C~okT?pcKG&xI;nCA2WWf}@2T z!o9{=EF-NM`$~T4AXmv0m<*<o3Wj6Jh0;N)g24%6d%B%Ho$}q7<<rLx&2VpYqU57t zdw)N8ALL2Con+cXQf`0FvrkXrlQ|m8&88ybV->_OJ1$Hx0EY5%fIIn2`B3hC*ct($ z>$FaNI^VjYac9}?Uwk5`U3?AO<rH|bjtU3gQtM!8QPqH}#MQ9@k3|D(00vkVrJ@BE zZNWjT`K^_FtN;0b&RQ2mr^Ub0`ZCH!lV~KiS5mIFxb(MtoGuo}SW#yz9rKAq++ghE zB$Ab<<gD<4L(qhosp}9`ZNX7AFUJ`RDM25|#Imj?VkDsy(LDef)#THL*KkT3>TDw& zT()0LNFhJPW~DBeuMuhWm6h5nu9Y)gky@ob529$0B1*FieN{<?%3=7=s`j4W#bR*$ I4O;%}-$DQt0ssI2 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aff1f5b1158203413b509bae99aed2881cd94ae3 GIT binary patch literal 6314 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 Zi2V_99{u|^uC;$gdLca~e-r7c{{m995Z(X) literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76947b4c7563a7edfac25c03e6faded108a45a65 GIT binary patch literal 2235 zcmb_dPj4GV6rb6hU9TNGEg}6wsYHs3z!j}2q-rZcTWD#;0T;C?l`N`};~6h@H*05R z9a48AAvID@+&FMdj$HZ)_y&A~y&+CLap%PE%{obeaAWQF_RX8wnfK@S-h9?*)EJ&$ zx~CrfI?veeG}wCtgc~6HKA2*PCv1&(I49Xlyfwe$b9RR*Ux{s|g!Z5L9if8ztQo%K z_@v2;`d4POI!NRDSvS)dH*S90HTQK!YHfO0wExg)^w@h~nsvBh9Z$_aXML_b<!@Iz zzLRmncGM9%P@$@9vuC^$LXK3`$rV*obK9&Fsk&<5U4703>(pS=kz!$X_#HEvj7tmJ zJ<lD=7`^=&+4mr1EaN$Q<_*1^EB*ty?d44RF#{Khc%T?I_S<l5F6pMR><^Mmo0qg@ zGb{o-8Ea$6u_BUkkPb2_i#gftWrGbZ)5%&<8M{E(VnMEIo5^^ht(B#+=@r82q;CS+ zju%xadr245@@Mwv)7IDwHW1X-M%T3ZqeN+ATWhAZI+XH?y_8<wP|H0z-uUo?tbZjQ zn&e{t($%Z2mDYGLK0iop)=iT0o8$Dmk9xx?DILiTovM*(^^hi|GxxSSiz#BIRTsuj zOaz0@fGi1&FYpk*>6`x!?}a_DdxQsiD9jWP3bk#6?S*;A+hqtbLN5Ky3ppE#TkO%< zEuM38I_I-lq(TNcHW>QKzl_bKzkd25@QANMmkiN1A$DCc4uBO?!Jy1QU^F~2RZ<Y< zi?GatnZuyznYz=>LeEWu)}bPpIYR6x*t;N00^{>=xXuNS@Lu54lZUwOj@$Q}%pu=z zg6t9)JY@D{&UQHYU5>~Dl7=2&#oJBa*;dTQI+MLo+8-#L_H<FF?7$b9cGpl;&hpaK z1A7;7#6>#GmA4l<O9h|4b%>>}Zufr}Y+lE~MMM=b>Bj$M;V~?_dWeOG!Dw%*{c0r$ z5xH=F4`FkY0td*XTVC$jh4m=+hTNW__YPpQ%eVa8x92eSGk+)^d*((?^$a)-Lxi2Q z6=)+s(35~6Ko%+Q3V|%bnn?MNxrt~MzN(gAtw#?jVfel&+P59%9Q>L!2Ql*+EGtA` zYh@_;MRfb_gZ3@?#Y&mj09BajB5dDXkzao9pjm{{DVw4MWVHGu(@+_+fDOz^VlK-E zsXh+fryzS4j5%0(fThQ404Q;)PU7?65omhi5D<`&`^l${LzUyg`x68>$*2}HKJ*Zz zMa2;^8u=K#t$<hMZ+Wf`#pX9y9Uv9=T*$AjFX#R+v|mG8*@=|EsJiQMM*5xFF542b znSf?MbGg_Rs0l9@kC|D{1ybrG=wf}@g<IGkm5=kOO2T&h;?8f=#TS2EkDo4*xP3i_ z!S0zh-my#RC|fEkeR>Q-{0~ZL=@X2b^)jrKA#;M*8^owBypqK*8O5<SMWFQRBsNrE z4(En&+ziShr1TV3*U9M+m$O1R@gGT}5_tf!=fIdtkU(k#er0E&6dpzTB7Pi1b0PTj z%ps}!dwZb9F-P|ebqCxxH7VCdYLbv#mvVj5P0AV9#$978BD6hRRoRo$FLKEctjbDm z%r2guP7)~(;D^@Zx}<B6RE<j@OMNur^I^SKkLpph=(=ya85DuWjc3b3Xv}&}*=`Np b25#NK=A}ei7tzP11J_Q|{&Y~C*Zsc$Econx literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4506323f6bcded8fbc7d89c1b76529515a954d07 GIT binary patch literal 3445 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b50231bd13595040b93995840fb0fb497824160f GIT binary patch literal 2892 zcma)8%W@k<6z!RjWLcI)NT5gvk7h$fMPda)DvzQdPuLJc*)A5UqNdu@EosDPM(J+J zv2j+(H?U5Y`~zPyTUPl6R-D_Tkt|!JXjS)2zs|jV&b>W)u({b_D1V6$f339``<pst zso>=vs=0zjGU+9(%cL)Z#2fit-(x>8S&`M3OjcF!BIs76x69hKH(1TK-*{--Ufz5n zqCuRhT`R1LXsRp$UhbiqM`#r5dXja0>2(7#@sa_~fp@F2CfCrf$+}#}b4@nn2A*}b zE}L@mC41p@8?pt{@8stnW-?Cu&e+Vb_ygx?aFqMpkQ01Vc*JeSr%K1YLoWFKAtsD^ zI#Fq)crVi!8w+jYXp#ucG3tP~`1hH1U<x3`E;~?MDjd#YmsXLAr^;OAvE>JGlJK5V zlG}l>v(*__unL=z#X^U*?3S2{I1&4ay2`Uu6}zxoa2t=*7T<%p<qgq5q<v*z(VT$W z7Y2s2l!p0Ot7)7~%xtGf$)y=K94)<e=vr}sdSihF=oI#st-2%8!mNjBtF$tfC>2;b zvDvkflDiEDw7YkIXRm;`i!;Q)G|q<t6&vxQi8DLE!HNGw^+mF*jDsRA=jBSg1yTf` ziX@gCDk(nB;7{9$2x>HlR+<ll;rmK~4yjTb_hKct3eTQAF5Q~>mC86moRE9qop@S4 z`2qoUmjdUsdkz5SG-DOPWJLTB9=T<dr5M4iR3`4H5X*&~lSbIHP+*u=ry0+Hp>a%O zVuZ;&IQhXKMo>mjAj(oJAetqj$;H!fWvG+lSmGiT&Lv79GMtF<XryFJ`2s^R#VVvV z2QUmbPs7onO2KEeKHk~+X{Thi5c~wOZ{rjiB@69Oo8rr9>L^~M=i)T0j&c?&MU0&~ zTS3|a@==-FjwJOgN+t+0V)iUtxr_I7HX;=af<?mu^3V-IIAlz^<+esXZaymX3{W4U zn(Jtey<-;Q#zpJ7)|U+Lfvvo%+S+RxUpr>6>aUrHn;BQ1zpdScyPns=5t1OuTVXWO zIwbK!C|LF>^uk1?`9?ACLOWkevVI>IXTIK7_D8%co!7%K6(bdfd5vZ<Qbmp{+xGK{ zQAscN&FD|2&%xb)e(#KRJVmf{rb2gmS%OoW&PaFmhhccz+)Qsx<=0U-o_=-R_HOrw zI{C79^Uj^lUS}MSuf-|6NRn&M#_7S0Xm~_}u7*>U%1n32X@pm&xP+a{vrBwyd`OPQ zX>7yr7SY#4!@Sz;*Yu7qpZz9ml{+FLjS4+U1*ZT(ST-b<!8_RXw%dUwf%2-m$8;U< zZBOHiSrFh@(C<=r6U}$1#)<14U0h+_@i<qXzO!@n2k0ELA+*1QD7eI)`{;Sr9|phq z`np6ftho6A^FAsItF*$6RW7mjF!}*|9=LuL^Ry08bj&JjSdq0`IHp6OZ}r-Cz7ZwD zn9$M($AwVdDnq0g%$voE9`4ah=Npdw*?Kx+yQZsnI7%Ex`T})p)U45b#nF^|QQmOD z=-~2(i%thtkVkRk7|a`~dS*j6^#FtBJQ^0Xye2d~=eMZ!THeveD~Mg}TvC?Qb;^=g z#7v>7S2(y*$NT~^!KDa37a>uCr1=@!OI<%-VSdGyB|qj7Mt{1TLQvRcZ(gBXLr4*q zt0ODF=-}P|kb<3XmIS*e-1_3b+*+~k|N2%>@CRce`fvA7e+oB#nY-ezOuQ0lyS<?| zur_ambYD#px@VeU_;ezY*{!n{hBAx7P?P>Ht@LGj`-qxPXm5S2v$4|l(3w6FM)O$G zlv|&n8cNmr`xUQVuLt!OYT)MDRlQD7Rh3RgrpWPHwm-zbIXAxwG_QYCxcn`-V#q|@ HZwCJYQ!WlI literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad92571df77537faab768f9de353512e45f8528b GIT binary patch literal 363 zcmXwy!A`?442ILR-MVSJAjE+uV22UdnAjwQ5C@J3iCw6KqO5VDrAwkDD=TlrJMbjA za@s3!A|1k(Kij{h-?zhIANlxV$Il`{=(}D11N-5|mubNf4=R)*KxM%38`38{Ofiqr z5F&_koOU2iyW-F**k3|OAlj=@+U3C`8pS*Bg6>Cn7y7OPkLBH{=R(sMH>g3ILJC@l zT)Ob#Y0_fqk5;?xMiiOk;F1+HKwGJ2VQZ;v6u5ZRSTLVR4_ez6Kawb2)XV~@nI^fc zxOXROO;#nPb2Af{HNVKHswZbQpTCs4I?rc|1z8eRsBs~TWmPraD)Bze%8ypu7p*~X psY&+AGzUvExmL`cs>UT(YsohiTp#)O=D;Hf`$6P02|D<%{{s7OV(kC` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8ff12bf6aa498c6ab3917723baa4a5c434c8c04 GIT binary patch literal 1135 zcmah|OK%e~5VrS~ZAn`w4*}u?rwH2R(TYYwJepP<N=rrIvJ$d3Yp31HyIE`}kf^s* z>fb0w{sX^cublV`oS5;pkY2!%?awponejJY*5~GC35@T_?T;@Sg#5t6`S1X|gsC@R z;e=C3avD>L*pW`|#;(P#^m0G;E%s!PH{u2*uL<{ga7=h0{D~Wfys<}G;ZF*oTC}>g z`JuD*ZX?r1W!-_v`o*gvkt3aHa4vTGJS+D1Ok%`#k{)D*0PBtIfi&6r$cWBCqV|N@ zRsF6|;F<62wpZG0Z<}qu-PnASLW)1bJwtj0fFLpDBz8_nk8;YL<1luG$6f9nlL?J| zz_w<<!3pt5j5Rl^OE!L;F2x7nz#W6*)DK`W#Ly!$aZa7D;54rBCU9oH2_^*g#t}IU z(ZdM@r8}*e%GZNZC>6lvDr77xGQ*g{fXYYPOlo;xI#&*!uk$IsSb~I&g{pidv@pPf zr-kgnKEqfl6RjEhMt+&7RM`-ijE0GddVR@-(owFW?jd7qdbM~u<SQvFhmRkc-rD}5 zl8<_;?RNA&DzkDaE3`?ZT>4TLpP!_MV>H^yhN9qo6{XM%E=-h`(1Ox-WVsxv5bC`L zQzIaBp3b@<9bcOwa{2th7Z^oWJ9rPZ$0;!7>{PzJrsl!aqN)j-#r3iP$Et~C012!} za&aFl8VMuL_~vxR>5u-OHQ4Gakre+*8_J~EA0+!Cno4=$k>?+@LhLYB$5=JXSl;IY ziMYwwr$HiXkEN{&fkx1U8L2A}R$YaqnmcQ0Dx?IBAQk6@%^^k>tdQ;k(5R@8Hp8Z8 zZK$=&woz01sU@{oOAMN9L|*^ZtN^Qpyn9Ah-Bg7QsRFQSkR!^|hW=Ygjchl<XZ7=* N-@#%~0ZnRu?r)C96i5I7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83076966852ae30c4eedd26cf0f4f554c9a46453 GIT binary patch literal 2626 zcmbVOS#R4$5T-7QqU{{+TU($D^gsn9Qkynt;s%9v&<<mnGDNy)1QZm_T}gB(QrV^C zT0ozYKhuBEhyD`2_DO%C_smMN<Jd8hQkc=s?r?W@j&E4s*w7Vte)Hb{@n=<0en(;T z<YBN4B!<AK(p7d9nxWa33eB?2i(EGga*pOf&PzE5a)GKKt5VK`T%;Pvnv@G5m#7Z1 zE@c(uHM$P+x|EA_!&b^SW?Zj@A&L7W88Tu-laYXtmk^ILG7*e|#N)|e7*7(Z;txGe zSwhC1|I8b(imq>YlVlk4Ez<NNQV+dIs*umA7gdf{;`U(V1!2XHM`hiI8=gHG7;OWI z4}meIn}NG$X{MW_*>0ZZx&@l=s<Z&Ms;O>9<4IyCUczR!PT+BdfglX5CY+5q6D&&5 zenx1}?=ub}5vVSRM<!7)Wn6e60sEPs#GLqG@ew0IRFS*Q!31TF7R|H3ta35cTsQJY z%ym=Ubw@Fsgg9Pz-RBc8T&@&dm&QJ-92|BGw`Mm?Gc6f*V>Nti?ml+wPaWeIg|EZL zlKl}?$2^#Van-5EtNl2nU|n^@t4GJK`#{`}zM0ameRn*)_eIiwFgWJnm;L(>A6A{} zI2hjzBDh!>-u-DDoqXjV&u~(bJ7p1#d3716Dtbp$#-|+br2z?KS}vc#pPaoA5WM*| zsyzbs=74mIRPAcC*e$U<E7X;)&UB{M6;_1t8r2|RrSwM2iv|-&lbs+;7@r-#ZO|ZX z<a?wqUlino$zXZoad=9Sn0RuhUhi-f)aEj#z1||0JO}1;tg5+Wc<K2qWFG;u%ImxU z{~XFt;YDPqkZv{}o0ef4u5Iogw9FmTXr}M2=A2HgX*y=xs<l$>N$sG9nyI?i?ie*I zEn02MZ9LgabG240EiPY5b1-!t^u=fc&$|KaHjvl^rsWsmSaB^Q*DnO-T`Fb$fX7Ec zG+5Ni?%TTktX9VGI=fUK9CPE`u}~jZI<eF=9HZfw)^4ipv=6POYdWcFwH<fgxY89L zz_tYFVrJs(|98N?=MRI3EgWFIvje0j$Y`<2>p1b2ekj;Zt>dHxqtj`3Qq^?qH#q=P zvV6$_ID5eXn9|#*b_dvXrO7m^(&9_yMW$O?mg1((o=;fhvsUnog~2e6>FkH=-4dQ@ zVt?=mB8ulj9TNbnFg}6&l2{ACI}PHAAaMl!0Acwx2hGuNAM+O<{6}g439L<;0kFu< zwzfD+COi^b0PBnZY+(w*$*<Vq16&Sb9sr;RkvtsXt-^1@HZrx!nKb8z;*~VRVoNs% zEO9~8J>TG4JRTET$<02!?3~KwH>|RLWxi{cv0HP@?~PPDv|8q#(R!My%YW^lZ3AY& z+L|AFLW~&nO3FWjV_&gRHU)_aAH%{uAc0dWkOox9a$NC&&K~sPHjwxP*mc>k0BZ2D zmfmixV%S)C@^tp=^+|BvNY7nI&fpn3A`1oN1DCt>dNw3Q$m*vF!;=I{5QrG>^$2wC z^9;i9B{6(FV7Anv(*$aDKtd+u*GEJeZOiGjTLikhA4ej9)(D>>9%v+xf6H$DFWh_n z53;|J{e|pLU{<+wWt>U?MaB-`do$Hr@aNV6xc5@ke!5?8x6(q>+y$U2F3-L)JXm-& zphbAp6<k9f#TBcpE!v10A05LNhHS19$T@-;$AXq|l-gGvkZO+>9~s|acao>%bGJ&j IZUO=S57n}R%>V!Z literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c0f5e5696e375c89f69216282ff668a38c07960 GIT binary patch literal 2613 zcma)7Pj4GV6rb5$uh;h4NlhBkLe(XljA&f~6)i&0(ztEf#);xU(Mr|e?2H||>$Nkp zNfXOCrJ@($#F0aK<kC;jPqH_}sVDB7cyHEr8&V-=HE-U|d-LbL_j_-?DHiht+RNto zN6`!+f8x)iS-{+YuD%Dt38x|HQJ+%ejnL?szNvXLw0apo)3bfMm-VxH&I+Ag&d>Go ze!f@m3q99&DY-*<hTBgGw*@^i{UXmcNX2<YVfzYAinq3#vLWJi+20ZpCd#+^yc4w> zaWfXH&0xC|iHez&9yFu&ZnG_Jcfwf6#6|syTH=ls^`eTE6z=-0vC3B0mTM1^@=9ZE z>B`d5t@`P?d+Vp??r%)z0=VO}p<}SA?|=y6Q%-z?Q{Ut>&q#}MlUq-7zNL9I*zq&M z=2`AMB}dfH0-xh~%{#on-KWIQ@ggt5n14nr;upXzv&n2t1t(lGe3|#4ZEkmzcS7Lp zDxtilw;1%f@KmrZdScOQ4hFIhZu44w>2VQ@AO<&iA_6U7)W>?aC)+}btpiUqRVO^~ zqzL-$s55MCg~AgmXbyx2%hh(L6?;nT?80(9OA1g8JA!-t$cy`Ws}2`Y+-V(n@wQN~ zdUDWZEv*NJb{Zi#q6<yv>KI5&Vmcy6M%NfoPJaf3waJJub40pUoax#(h+GEVJkG{W zoI9e=L1X%#pZ=q60d#+u%G?vOBFIKlSt*rqJZVPLSxwJqS{{+(cb*f(G6ch@0~`w> z0FSja>MC<dM(qxSlm)nd;xN{UIx%BOE_E(bJ?Vl(qMZQbyDRltqsAI5tLqO|Zm-mq z6C1)KA}-MhGK<7PRp;K#^_!?GbNFlDU)!kNtV>MNWTpub+!L@j3;MfJoSb24SOsSR z<c<<?Qhq&!*Tp<ZY^E@Ul8l6~#1$j4ln7h;eqdIPu^?<J#n|uUZ&@A4&K@XN_nNZW z>W5rNRqe^@R+q7B>T2})9{((0gT19IaqC*UE5lD(SFc~MZdM1K!KF?F2ZiCK{Xz8P z)1W)VN!{5VnA(?Byd_+@3cvzvLY7}19LN&b_7QaTJ`h67)TS<-g%2rqd;AU0{W~Kr zPy8NW4Z()kLYHc6)q$B{>)60(?k{5em&v1rLpq|$+nMJuGHXOr`Of@95@%572oT9^ zjfJeH&KL=sm7FZX#yawH0XZm~5UMmfi5ZGW&f)Y~B=bNjhCGKn>Q$&bkNkT`&|<yC z7r>}85JF2}vqcT<1sCXW{*=`^j#HD-bnLgFD;o%0A3;k2wE7M(=;QT~({mGdj2RX+ zd!mMmb%Gkh3#SfzQ}h3wtIdA<xy}TbD{q{6I<yn5x1Wc;LOW%i(*`_8(9veI-hOfC zkKx>lzrJpRhHn4ug;HC@kWNtxt5+aaVTpDk0oPl`@Zu?7oYbEdwG1r8uA}f9F#Erb zC;;uJLu3C(yeaUbLvv)x^2qE`wYUT0u`x29(?e@y#b(!fY)B4pG#Nn8BHau(t^uAI z!ZE|m$5j3j+uba{(t(*=gTM~BE)VO<ASq~xdF(#Nl2(LMN-)k$bRUu(`yu)aR#vR~ zZHbt91s&cRjZAp~_#_{R{WvWc62X*YY8xAC8!4jEz{IYvZL-yxd{;};(qgY{HefDs zZm)e?UuG+t$wKNUd}-3%STB9T)3oqlahe+$4bH^bI*6gP#WJBmno#bflw$Ep^W`;o zt(FkH0h_2rAcW>2Yx0madH8I|p*(fqLyEm*49}hlB<_Go;$r#69DwqjXRO!fyCL!} zV>`Rea4g9(#`^(dx?Jg;O&q9U@C3vM@*-N}A^8BwB_K(0Tvr1ThOlg!e3Js8b01%i z51}h8f=<RVO0#akwOq@wb$zK<N=b2?eQCv%n50R0{Dz}zCVs_|mt;h=+f(}4kr=IU q4225dMVdY{`f<^ZN?OIHmwR2766ed*6JOy)6+TWb_;`*kSpNWPz<6E& literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ebcb69d8e745133866892fa3ff50dd054c094ae GIT binary patch literal 7074 zcmeHL+iuf95Vdo0?&*ydgiwWm2Z9t_0*E3Z)C&=zSCr(*60%HoQ(8GrWTyf8E&Krg zz=xoH<;lOm6Ehpzag5W-sA{B=Si9c2dS*O(vhr4;kQLzfL%aQ<SQ3O^NVvZmEH+?R zKjVTx1S0A}M^r>nATcFI#gjOU1i{%q637i1N#KPISC{)BoFb@~AQGRGB<XO6vIK#P zOGY#5`(yCd?KMRrDJ4Z?;7y__k|r6F{U#}Cl2bBh#p6d$o=srQp8~w|?qPWad7k|+ z`hZ8Cv7ZN7^Zfn13G2UXFVKs(H<T>ND><4W1)8NfQgo`4Cv!>xtS_z#R?Exif_1PG zlW5Q1@cp}9L+dr{4mWf6?s;%+oxA%)zx*N_)OB@uZ?tPlk<2S|v_KYUk<O7tvc!97 zp4?CtKs&r@{%88vZcM?urxTtxW;9+OCr8%~{f+f<`=PQ3dtiw!Ku0aoC9+Ibc-%M0 z&4y6AWs9)KOCrnfYpqYm25t1UK7A+v*F=d8LofjWrZ-_2(~V%N>0kGU+X?sm+DTa1 zF_+~1H=CS|I4i_e7sBQ{k9Q|;ObHsZB%O~$XW5!ke!Eq!JbhAOsci&Qi<TsoYw4P0 zseSFEPFa3Pw6#{hYqFe$i0g=otxuY%>eO)PgrRjPOY53(bgCUWxQv0EAI6nPF9(-X zQ%}ajpDU@_HGp&8f3rz2XEm5c4N93v8`aJL!kp#aH4e*_wMwPDeK0)TUJi<mTHqfy zb`%t~!@x3(_m8neGD~~F?E$Dg;sspIqcZ-BMtXJET6xqtv(+?U<UdF6Qa1YTvhi!7 z4@!65v-FPE)9{dcnV=c~kLY9+P&Fq4sE2FOD|Ja0GsKMehcScF8I<BFV@iGC!^Yh@ zlXkl%)r^DEGD}k9v}2k0ZHq}YMcv+Ouw<jTS#PprwO&62<#)}7x?g2UkT#lZ0hMZ- zb#<?Lpf)$R_Npw0l6`gm@J)4(72rIJ$Jy-z?khhc!T8pQ3iwzYN&a%R^M1?~kUm!^ z91q8Jg?hoLcI#uVfb_XSVYn;Qb6kBF%t!blar$k@J@a?~UrFSFX3FiZPN-?g9aH{z zqN?lGbK}K;JZq`FL1nGqUOzf9^(XD;FJH<{xp&+v9~<z6Mc2z;ddBCct&=lk@}Ul> zLAs`l-&_do%hYOFoyWbeEd8p}C8s)leFvUyeSs+-PuyP>?~1G93S9T%iC9c@ue2jW W>0R*-j0Y3sC`Fw~8mk~3xBUYdX^sH^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f90bd22119844c42423525d4ed5047287aab849a GIT binary patch literal 2421 zcmai0OK%%D5GMDfl`PAS^Rk1YaDk?PiY7|iq)mXJXkxp0AeIeVLD2;QcD<zJRd!bj zmvU`EIoU<7{R!5ghu-=F`b&7|rKeo_1A1v^xRN0keXLA!X84%l$9eeS{CtJL_e*%~ z#g8>YenV#ZIY4{~E&moePB=|SN&}i&fklzG5<7JQ$Iy1-re5F~+DS^OANYoLlX6-K zDu(uwxwINoDS1SAiTfvn`@%W4gLz)wCH2Z%3To<>u5QcTUYvDyRj7onZidl*oC(9# zslKu~NL2jrNQt%mQ0@watA&J_rL`WPZkucZ>B`3QwWr(bajs;%H&Agedys|6Q6A?o zdC5$!^)e+6)r`Dm<ZO47ZEme^Jd41vv(KJT`8E)O1eBA&dPCZjQ*NF3fo*7;J3u?a z<u3P5$T1B(pv|p;F7Yz2oRGlhbG!;;`3-SMPyrO?^_<aN+$usy@WT-mW6N(tr--5> za%`PiW0+L7a*ly#uJVovj3wopu{<KD6<omy98R0{Iql|yzL2sEhiIR%IExiy(gjxf zC@V(>MwX}2L;f<K!H$Ip-VpYeaBeXwpgR+5SBhLHfY!-H(uT3jSd@f$&e%`n57p?) z_yC@@aS+NzyO(ew^F}HgdtJuv=6ABs5BTkf^$$L|rP_BpU738`zH{$hqt)og{Tp$X zt1wA!9QL#CK8?CV6q?2kM8<ov5rIc=p&DWkb^Cqe7dQJyat=(r4lOsXPHVJ6efSNF z*DsL1IYr{1A%6$9pND)zx^@Bn6k12(`36|IfE2_NU@jMn;R1@5u)ByIuJ{OAj!{Oy zsNsc~hrelHJZB5Kz}j>Jr|_IsbLhdI8&9{*xf4}|jx$BNim1Swuq;f)Ej+-2j#$Ix zS$(sM{#UK`pN9P~gO~m<#eNcIok7?U=&w_y=P;ixh>S(B3cU~=%iQxbxbfld26cK2 zzjgBB*Vh){Zk^gAI<i*Cn7+10;QC$nr6rp%<DHf`ghAJbRvuYn$W5x!or8d=Zj)Cv zvvwZVa*)=}Nf$s05;%KtOkO)9i(4T1c?2=N0s+;%!0r1uE}dRPZsd$12Lg3zmIn>R z3b2mb%LMzY<a<0}cKyH1zN&pqK%X<wXBmB$!O|-)tskhoWzN1jCIx-EJVyO1FCFBk z_W{Xe@C>&(eD8X`3V%futnSBZ6@s=WS3|YB2gwuW-U84>qFcTF6TbR22wr$Gq3uLu zvI=rt$sjK>h&m-CrXKBX?CfmqXfNq?Iznofi@iZdUc!T}V22N>z2;VnZEk3<*r~lI ztzG2(ueP2y*V&Vnc6VD3c3S#k2i!6mNGUQH!A(K2t}sX!1#2QmJ8dDjoHy!?DZ0GA z(b`yRJ!wAD3!R=~BI^x0`;3Pw)HQQvFKfqKWRcKIyN|baT5Hc+to3+j1DI#)b=SnC z_7MoMQED1Pm`u{1sX9Jd!w?4(NN3R`KL9iCLNiI2&?RfpWRn`?6UR{4V}7a8MVMWt z9$lstt7g?`6(qhjT$~L%yxLi~A;Q><_rD7Sye2uN;E(9jmZ2<VeE--g(z#<Gk{`n2 z0wFsM59@YuKe&=9Yz)S>u1@l};r@OtJm4E>Ii`GKt}whdYv_4Yp^QN3z=XmWJQz!R ze2^erW$e`;Oo|zkcuk_yKKLP29d$J0D+r~rT+dHxL?n^~YS9_wkkL%mGzk+6*89+M z^h}>tOH~Jd{(C0lHtRL*ifoYP#s>>;T}byPd94ToiMduU6)$aEDJ}lFFy#-b8P<=P wYF89MuiK9@by!q9501>CG-9bNQvI2=h23bY_U{*ne1Ubt7`zD2Kl#~z0Wfz?=Kufz literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eee52d70dfd98d0cdf5959450c000374c7e281ca GIT binary patch literal 12071 zcmXxq1(+7(w#D(GyCg+Hx?xBG1*8Q*8Uq879Gam+EKsmTr3~zDK)PGHM7ot1R6sg} z`~K$M>+|?OYwx}G+VA%b9?nr4X3Lg2A^x$jOTouZR!>Mcs`&puQbkce{y8{jM7M-a z3Efh4O4TiOr_|ljv`;9TwrA|dKMK@Os+=hyp$vp<u@Rnw5fMp4(nTDOIZ1QUN6dw0 z$}Xv+We3YVy%n)cdc&YR%#XeBpy^Nn3zWT-1^6CI8!;0W+C4{oXK<dnE?|+tVpsx8 zVVJ1luuQoeRz!qXCHE81)NWBJ1F4lPS*Q~cArIdwy$dX>sh`qBj1am;R3gg+y^Abs zS=K?i*bA3Ue^pKsS{rU*{*GENU<k`zy^1hW@;C8mp@qS$7#iNBHb~hBn_#nDKc%GB z*537D`ol`t!m<^%!D^P=P}#?N*4lOfb*Sob5Jpp<+TCGeC;SGxAj#l&Dw*0%?SZ|p z4_-CcPaS}Ra0m{=5qQW89`ebLDv!Z&_#+}b>;-R{ehj6UCqf(elkWrs_*rkZZ+w-z zC-ojzo{B1*74?_i-|!DyGCfVzwsD5~Q_5NDUpNQnp{*C3<}2n0aJ#%Au?#n;3(*pO zqFxe^o%t~st*q(LMV8zwm*kB$y-eLrU7?1G{})F2nI}?L4aPXM-tI4=uIa5dtqIqa zUpQ0={!`w7Im|a$a>7l$gbWdL4N_65Aq}L3bTHcS^i&4OYqz+KF$Pb;IOSOCODBgw zExn93I{QSKsLYTBvO+c}%AB3b0Xd<w-CWdo>Q^WCNO{_gTMWu6pSL>{a_c?8Tuk`_ zl}B%kGB1@6o)Pety!^@n(1rO{svz73w?iQ)4EMNp2i4AQQ7EEJ6#o^>lTuW#7}RBX z*0md^#r5X1l%PsNDJTtPpe$6dwhc;KdopDM%9+kHC{K+ut*BfN74)8S?RMq!)EVkU zyQRFoqjG_AOUi>FHH>4fD4<eADDBr(L4)xIJ?ti$4yN8WsH|M2d`D;=z1-AxC;~V2 zYP;4ws_=-=D%K`g`yTSKbYgzNq0gwhY^*bVQEviNwN?%G8r%yBd=pJ?6F*XXb(Z~7 z-eP&lw1(cDP!lS|K^V@whHs&i!Bj2N%drfbO=~Ofg4;cE5#Ly$ck5-aQHQ$Q;3<~6 z%6f1Q3}7y6@Fz9HMty@RR0FCZEM(cmQWYLnHZo`o6U5hnCd#I8FEoSZP}1~1ss*%! z`=J%IhJrCUJmF*2bG(h-Mc3-uZL3^NwWD74g7#DgxLdguUiNjq0<S_=0UcRhQ$9dF z2oFK^ln)bCh!^8uTkdu;cm$TX_9*oj%hN3R-FRH@is|b@JDV0WZ6oh(cwW>Ke0Ni? z!C1S^po@*T5PxS^UX4*<l=2?Fv;tl+_!^#+a?Q2r26dpTUN<S-taVrRfUcq{>rJ%L z4N^f*(~;uG3%#z_OD`!R47O3(ptoLKH~LV&*yu~WYI;EVh7VnbdQ$IA<;+-yj#9E3 z{A+Lr^^&OO%6?M%!vIL_1p}!;kPL%i2n>w~h2^af@Up0VQtng^V;K&U94}|EH0FiJ zY>Y4%3IDmV3`QwC@m=!LiqRMDg4s5n6rWA<XudHK;dz5nc1xQsFg+ol2E66&BI;?V z$M=-ou`rzZX{smn4E2MQXQ?}FJV%u@eV!T@5z06@+53i3v#3JUH#UaDGg6MkweY>c zcxz3lm%QM2)3-hCHRcy2-!NDXH{m%ad&FtjZS4WRmknxCFWQ&@6X7Ljm|}@4w6gJv z-XnUiQl;&_M!gPiz?<-kL$AbX*kY}{r%f_=3*LrzV1<D0Fj-l^+6eLQ_#BgArRfxE z3d>ZO2GikPNQl!g*`XT(rZT^0@IHJ1GvGt`2tI~$4&5XE6Xi5(xs{(P2bq3G_3-+| z$}*;9VHJFCI@UCpJ_>8#8JI3_KlPVamE}vN_p045?50+pWJyD<Hu%!uEBG3|i3lZp zwx?rCI7Xd~QQ;D`TJpDieWiTv#&^o^A#Dr|WBIo5orFfw7bfU^$eatlwOilucRgb_ z-wy(Qgzd2mRc*XL9i>`W%g;9o9#9sLvR3?=XbDr`L*}*y$<V`%bZ$ItBTp>Dc)nNo ziiqk3<(aFoq_I&Ys_+_17QLUm>Svf45#pZ-p{HpXyK`U)T!m3K4#=BjV>bK(b6~vb zTxuT7hXt?@7Da@=BrjIJ=iy7JrO?3ZmzvfQ-&<6Ac+H#dcf2RHjJYby8s&233RnrN zU^T3PwXhBz5YWp;dUsDszE8@prt6_{?1h6~kRe*alTn3?ut@JE8{2GT6tKa@`_#s$ zLN1nv<Bf2Y`ogum%9F|j$w#6JU6e%)$|=84ZW6GL+AMSnv~Z{~)Pg*Yw-cH}*)V>N z@QaQ52D1!4@Rk{nL+`xaR#7u;jD&5<?XUxOLVCW3Y}`dHf!_>@>+PauQ%4}l_xF43 zg?k<U&^5o^C-s3JVYiLCuI-`rGQY*Vk19&dGTm=_K<~cT3x^C2D(fnjC@1s1?m<sU zK4c@U7xacy1~0H2HaG%D;TRl;Kj2R|0e)#GorEUVPEmis-|$aFnCWhB)7J51h<_&} zepl2*>NMXOI1B&6>)x`?#yMpsU&%1feGFbVXvFdcoM*WJ7vUr3H&`wy2iUkwU5N<) zIr*lw%zRf3K8`9(GU&_P6&k=#zKv@vYi(@Sn?x-UKi70N<covQLBKfWA?Oo*VMgqQ zeX!c}3jx>Vofl9I%E|l03kI>Qv$mY7C*>4NI+p*e-GG~r5dRuVDsPaAN)2fsEu@PG zcT0IQ284lBdV>*Okbzng<HH*UNA<G!HZmIIa`!8}b5th1rBr4r3tTqMN@aszJ@OfO zU&Xv|L1<r3%Wj$jJ`nJ!8#$G^B0^c_Q_Qz0-&bB&_LEo3jVV-KXspa_cPEvH$_rVA z=A-h%XUYQ9=hUrK!H7^(a?7|I8d6`F=J2Y<UV0nfuhi|-QYSCK5SBuEh2ah;0!1O4 zlwwqIC;=s*o!wGYX($6_p<G0m?*-+R72?S-OIbl#5h}6t(_8OBnSI{JA<?v}<S*TA zVtP>d7WDzu#dG^9D>FB-R)wkx)gZgwui$H_uGfL@ZEF{$Y@liwe8Z9h-qG6#cN)}$ zoCf{%zNKc{9iXgbS{s@wzcc+Fet^3S?lriZssnYQ9^3=<p#e06M$j0VKnaJMQuo3p zQJbNp!H;gd<BJ%m*Nmk(+y^b7C2aAb7eOu?hwT1D&7l5*`}tZyYiI*)p<P7C=V$bh zL+$kvsSeb$R7YyPl#Fhqf(P^_$5(~scAHUuQn%Px&iu0%e8l`9^GxMKQH7~|gM6Zg z4LZRi@F@IkH`#QSjltAo29HB$cp@TXkuuD+mNvTRP1oDvEtRO*0-m(dl%*bQ^`NaR zy;-_i>qLDkY7;bMxf7;1{)ApPDczx<!8QS7tli>94})K*E2cG|r{4EeFKQx{6jf*z z*TQ#pdmC&JKLh$G=Sb;GZFjtiK|f`G7ytud5F|q*$%CmOFcgNta5!Z;f*J{<U^L8i z=zY^M%BNr~JPpslJeFsp3i(q$Dsv$Zdd{>pwOj9b<*UkZ)OdIS()$Q6QWIc4^F-<; zXkz1K>J=EIe3iPx530G{OVpzVuNhR-`%=p5%J!!7J@O6Zn-L+imrhc4=ljy`TgvUx z9Qv9r)4M-T!)>t)-$Gl13^6{mq0&pfmG5!L=x#Q76_rh?sd{fq{#cn;`HpfjEbyv5 z23KK<-c*<d(_taYyVPOV-lN`!%x+YYx58iu^?|_*_z<QFz0Y6+%SU=2!zVD!V3GL6 z(39m;gU{e|_yWF!B`jZ2U&A->Eqn*x!w>Ky`~*M4Ojv4nhikKxv*8z*19M>>%!dV# z+r~m_QAAkl%U-P9??VrTCCa6+*Qc!Q^_gIq-f~z0nN0t%QG!~jw+dFnGKca+gc@#? zjFvEw>Jy_v%c#N!$~DY+nU}*(d9T1_C-YHj#joXSpqvkv;HJR|_>Os}FJd~Z5VbCD zgmw=7?9fnycVQ#*uk!Not*6S$+dyrEyM%6{Hp7;PaEp}X(HAyRTMdd?D*?kKZ_~TU z^0B*J`8p{-r49<+&a%?oRS_X>#ox*e9+Xnp(^`ny!Pk=78C57R?;Ga))?QZbQvSxb z3pPs0AmDdpCc6zC|DA8Q-aV#!q6+Wm?bR#bE&Hhbuvp4(aW}lka=(p7Jgo*CU^zw| zr23n_9yh{2%>O7?%R3aOp^@HUzS1_1P)A{-@)&i1`rg`m)N#Gc9{vaQC!ByxrhzKt zeJ80?@E80I|3rkQPIi!&DCM-l88{37vgD1HP>b)s7#fCBKZ-xcavoYJcStGY+Wo$b zxA|_jkwi^odC!eqaE|YS_ywjHrQ|bM<J-8T>|o<E%RMalh5kWZF}(`6GG7x_Fsjhq zv`ES`;2#0k_^!i$@S?$us6t8R%0jb872<yUm1xkK`b20#rifZnQc<ZP4Wxy1u-4u9 z5251!j*TiQy<P^$7!l%X{IwAoiboX+z;V4yEOX+Guubm)z0C1xAqSPyBindE7QG@Y z_ZvKDuo5y0NaJZ)s0-8>$g0d15!&0>DPS7)lf2tKavl5%>mj?19I%09gI-Q$F1Q79 zLmtQr8(H#E`6I$JF+S9W#tx<Pi~_#c?RsD9{jR)&Dqy1;HIwfTCvO#15N?CfDKDim zvaE$d%EE95e5F@}+7#asUYB=GF9ZDG8!BqrM>$ownJ+=P#p_#n&^c=lyS7!Yn2q94 z0!l(DC=F%cF;Qiya!?*BKt-qoFT0UQZ4<iP-Fgn?kB7qNQH8@w|6V~-6?o4JKC!mj zt6nmFRPRIAs<ONv2T9ea9YS|Pb!82>6Na<Yq~_YKMLjRH8WghewZT4RZPUA;Wh_Hh zuQ~wlIevE>gcDR9mS?TyvGxX)4t|rj3$nQTq3I!m-}UNRyW;it>D5!-1NC7yOM|Gw zziu?tYXps9k7*NXm4I~unkw&wX3!jtr96XWuZ<t6ebnicyDTlBu-<-Xsk|RrK`y@L z9^P8n1`hDGrP@Jz_>`{$b<ngU^#D8w55XSa!NXK1cmy7W$KZ&7U*K_NXLtg-z#*Y` zz>~_Z&<(o7t&;!tQF|zRLPt@X^hTH#vD?ew1La|5lCpP1xaliS%Y4vBtxlDS2)`K| zVLl2);r(a{rwtY|w}+8Jv%)c!<4_E;>HR?!hdxgJN%f`rL4Pm!QQi`F&&nG}wS{Ru zM<u-h%pIc&pE0+Vd_vSf1OMHeG>A%u!7#$w5Ne^Qq0}%K4yjEO#Fwx;LT`r9k<?Lx zC#;Q9j)pPtR7BYC1!I*@!!z(KJO|IiI2a!hRxmem?YEd07Al_=zY9t_KGJlYYX!Yv zfWZp_RvNrWO@N8;61)trz$E5Zsn_6jcmv)t@Y_q$o63_8eJFlX$`sOgP<;>jhVL}I zZE&x*yh9z;I}X|HR<*Iy#wmG!@lA)x%u`@0OoLX|rc+tH<rtiSWj6N8d)M?mcppB1 z84)4bjSrQ7OBu!7KdSJF!C#Iq6V=AxBfjE%A5*1F+Zue55}@p7`l+%jHOKBgme2G` zvwThs_p~plFC)Sp*UFgowN@X_v;3oX8p^^MC<kBJ{TjZ3Z{fIW-%;Pg5AY*Q6ZMg2 z{G@!F@2r%cl`~-$G~@dgW-EVzLd<ih+XQ?JbCvU8KKv_c0ksg4y?zmugZYz)(7*>= ztoL)AhK<V2e4nx`iG%QzUIo`)G?)Z;DHnK9VdZNP;a$FL25F$V=~Bt9s4IL`gf7#2 zF!sXvxDobRd&kCAm<uo1IOp}tnafivsFe|+ijCj-o)mhVd6nrPYBg2C#v1Bc^o7MX zx-(y3Ipw*X^|DLp25Xtu!LP6$Ho(S+@B;IBp;di^&r_n5&)MC?@)65s8(Uy2Y=cxR z+o_8-c2GOvT`3jyepCLgyrkTfQo?T71AAd#N>AQ?>Hr*sLvR?5z;&PUD7D{nk5R`X z!maU<VS|^}bnOp=Gt{5d?aU{r04L!T`~`o*KM`S#fTeC+wz~r^D&I`$#g7nHI#hx0 zUe7%sIVaygET={NM?G$OMtK%0`S}03G0tvJmd{wuneJ1br!K%n_)PK@YnPO_xp7dh z5OlWjk$}slSKumq9D8Ao8@)_>@#VBJ8m_U7p{|?Gi=p8PbG4M7>3?towmJEyfSbyM z_;+iPQbmMEZKO8%n&nf-u1w962GT-0NDmnxV?>x|H<L0mWPz-Z(Sxq~ypu%vcUY5p zrzBHJ)O42WUV1B)!yqT*f?FUr<bi8`TGw35tIP-ap#WSrz0<T?ycYhZ5*@$Qv>@bm zaw@#YGJxeaga7#2dB)Z__0PBCUt3iCmJ&iK<?YcI`Y8J=M@3KAsw}8H>;wKQxsbdY z@(NQwNcolTA-<ai-T3Z+_D;TS_bKWQ8&4S|#QzhPw8vL6)?ks|A?j(^WKe{;D6~=* zqZaec^R&4suVOv|yWA+w@~-JJ)4|qC=#_+05ut}cV=1@UsKQd(^fSF&qRJ@i8<e&2 zc-#m-z$&|w`O2}Zr^-_mpdwU)M7S?y>PBT{6{rf!^*T5-o~4>zb*KS%Mugx{O=Sbm zsAS_4YCasbTg$XIr1DJ`W4TLtH=O0GL)C?Pkecu3ln414-J`dFuRfK=v;ox+(i$|P z8bcFk3irZ$rV~VUrXHc188nB__0r0Fg6abI89c{#i`RcZeNMG7XbJa2tBCNWkKbDP z3SW|d!c<`!=_I!?Z42!pT9r++r%02Ijaszp+~MIi%^Njn*|~A^_8r<aZ`iRz^VY38 zw`&mpV^7Zib2Mn!vPtLm%{w*OQ{aC)jhZ!xi>*61ZP%o2=hp2SH);1(LUOwJ!%4x_ z<ivr=NyEAf>7F>OOLAh50e!o5Pad4uFFEna-km$w8eF4)&0*cDckMiISk=lyderLK zJGpO_9yMy$PVA64Flk`Lr2d14bm`l-;)sF$hga*`dz5C%pPh$w@84}ea$?tBU6Q+X sAClO8XxBc;J(9Z*sx)xqo{V++4d^zsZ})m-<9Fd7Q6!{Ioi^?N0BLqto&W#< literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a6cefda6f6815f7dc0bf845c6f6e231ef758b28 GIT binary patch literal 1136 zcmah|&2G~`5Z<*N$1O=)Re%6-f>R`d`DsNfAp}h;4kZOOaIu6|j(3x~tevpC2_)(* zmHHax$UE>DoP6cPD{x|F-9UPQwRZR08GCl-o6kG-`Z9s>Exz^syHCguJj{m&;5kga z3kxTlN|MotQpApQGB<K9cBPk9qKd_y^s{PIrQ{{y74DxB?h86|qkvaCq!Ik25UN3o z>+O*=>CVK6)={iF!n{#~u2A4vZw+{w_d6ywq8%qkX)eHebMIYi|8O_eMy1`6NeB6h zJeCukYH+StC+oCX`}OYLs|2q2Gu#WLHvk9{QBES~jPxj{+&K**S9sjz-YJ>Ur~=sL z4A?&-9*HpLYH`KJFEdQA035huaGd%cEQT0*LT1jn^97v7HQo%)tYZ8bfxUV{&I9yt z0zv6PW2va<(NHJ_w38xWEX`BHn8JXng0`i^Qo(eluocBMzED4lk$|aCMMViM4DjG- zA$zbdF_y?!YsS8kUnU%?bPQyM<5-2gf#gEzFjHaon6WLrnLioxjf4%yj~<xbR{vPZ zhrP}1?eJ|lOoz=h*Cv*-`FWUsdYl|j(P$?di<}Qsm_YluFrgSFAJot`@&0h40?79+ zOpSoh6}n6VI=#9;<o$WUml#D>TlgIo%qcMC987)qths-vR>0Pvss@|I<+2LLqK0_@ z3oMT_(Ey8fU?I-*#^RNWFa7u0!rvb#5$FH9Hjr`NAH{vqT)6U5mGc)G0k#;kW2{(a zEF18VL|kL+<0zJ;$MRMLz#|C5Ow<~LRqL=6^^2Y+LP`(`QZY}gju=_6O1c9;qoe{_ z^J|{9q1aZl?nU`!mlP6Itd|mlCL58Jf14Fxv1S{)ptn+jK19)=N7Sbc{Wp^m*=__+ Q%krMx#$-?eHEJLCHwl9l#Q*>R literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9eada427b5f2008fe738883ec7bd3c4814a7e7cb GIT binary patch literal 27191 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 a_w3zqV2@5^^Mpt0AAY3KV#SOV^M3$tRMq7G literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5a33bbc226a742750155c4fa2b9d71177b68fb7 GIT binary patch literal 1136 zcmah|&2G~`5Z<*N$1O=)Re%6-ffJEv%}*;@2_a}&aUlgMK}eR+%JFVeS8FHiZc-BU zmP&n%a^xL&3vRx0;uSbCvu+^0z*@We?TkG;^UdeIdVQI|_!i&!_}wSu2Oj3b1Mm{2 z-iL(~P9@1`L@8oNI++`}7Q52RDpAE^Px@Iks#5Zr@Cx_O2=@h@xlzEYZPEySQV7+c z#m&}8nsjesMDr+CZDHQ2L02g7tTzWd&HHT=8_|lBqcj&_y?yY$+4-=aYNOKb$fSe( zRUXTUPBl1Jtdq4{to3&P;7tNo{2A^g(pvxoi6|$Lb544cQ|_Dvkt;mza_@}HXjB1g za|Z066OTlgbG5i;<ChsGSO5;(F*r{B5EerWJtZ^e!ubMD;~H-UXI3%(jKE$!B^LpD zIDw$_u(4EB^k^uQ0@_ItFqY=2VN78_RYBWQVyR#{Q`m~)24AS3#Yn(ZsG_2T76y3m zw2(d6ml#WAtTkg_$uAQQRXPST!*Q&_-avApbeO5Id(7C5-p-$m`BuV)<0p?yZ>N8( z<m2A<?rzu#hv{%5&9#Z8-1t1qPo5^nQ#9Ji#v<nf6(-O=E=(v!i8&eCCT<QVDu8_N z!_)`}U7^b~pwsIML~hOtzQQQ7+Qjd$U`~N4=Wy!7XB(XlY6WZ!s%o%VTrR6{ENYks zu)y*-6A!?m9axAny|sAd;!FR%w(vV~dJ^aVx;Bt;-XFz%fdZIcd8Nwv3ylC<jM*_( zEHjo3_(&qIG4^Q`%hF?cD+1sVgkdIX4Z^B*Sc>{(PZJ>}hy<yaCss#{ELbJo1E5h- z0j>Ep&)QIIt6BH5{IW|52`bi0i9wT%$jZOX3b0tSja|@NDM25iXwW0-(}w<=Nr`MX Sg6Cy<FYaP8D1jQakMkQ692YYH literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe6a9a1b989debc870dbfa1799c0815afd399a8a GIT binary patch literal 19115 zcmXxq1+<pc)&*c1B%}nTySoGoy1PY`&O?`Ux0Ij)N`p!W0)m1;BOobdfFLRI(gsK< z{`)!Ozl_1Ud#yF+TyyRB{l0UqS|vq_q;bNZt?e_mzR@U7oXe8`{fQe6mBQZvsY2)! zr&XLzaa+ah6t7jhPVt+@DUhJ+k;DGntQfQ5={Rxn3o(-ug>Wlg2p=R2;iacSXqGaB z^ST+OjisyLCZ`Bte3&2e8}N--2JYbGAuLJ~LixamE`;$hPjJr%OEK$l_rwpO72FqU zXNmSp9KzgWA&eLPA^!^bp}O&eg+x2!_6bYH9CR84@+e&hW6-7x`*}GQOJgV*_w}5r zXe0n>9OR>itUZ7`!Bt}p{u6FXt7D{-c42aEf)Emsx^Hd<keg{j*vr*o;7)4!tu+)R zk!fE#71n*$9sFf@QjO|xokJt~l8rgB`)V}7xM|QPdLz)9*z!Mv);e9J63?lna2vO~ zJ*pF!z-~tJg)kba#SMDVdj`!T8eg~+>nfb07d4JquovZ@(R!j?R67FvmM|-Hqj|tt zrJZ$a!L9c^7Bc>=(^wALaL^-l2+vE;0p}!8gTVK?tGPeQ{og_xt6tKWDqZF7PX{m2 zX^e`lq@5XWXyj(H1o`i&{GqWIH~TXoG?(76ObNBKhA&{PD{fDQer7y@J)SamAxKR# z&QdPvat;aobnlVME^UPS1zbIip9tJ=_nVD;PIstA)?h8#!uWpvzGb7n?g2J>nDHKN zY2XieNy))h8(lEyeQ7!uF%6`W&<^cWp-g~8-;h6u+W>9}2W6$D%=nB-Z?$Y{Z<tn- z)4bewQ0oR)+?Bj<!TL-#Ape}&RU?z4z3TL>JuVX69?~dGj1#jXY!uyd`Z{!@yiP~p z8dJ&QRMsAC(7IXwM_~;Ib&Pyh+K9=oK^~fR3ZuWqCsh8^U5=4adY!f3gl1e7iCs&h zFx(rsY3*@M_l_-dYa|4jOY|j-DsZVZa+_PhwLeYtC%7T3)dP72BaLgimNtamz*$}P zZ%)m)x@tx%q6<Op=pHwGI2&nkANzv(Qf+-uj-GQ(sSSG54OKK~iTf+A(Sg*9VQy4S zdYZ`u0UYg<?m(+*WYbuhQ}fsr$dAzNigCm6c}`n2t{PM~EEwISl2keo_k<Ou!sTJS zjPMZ$+ucS+;V-zJuH<tgyP1}ez;mXZ0;w2k(Z7^4g}G67r{-vj10&ii-AHsUFP~B= zNaZEd-s5yDy}#5lg;VqhBeB|LDz}6Kz~f9ippk=AOSRQ%GswTIww<fSM7z>^%Wjtl z>=t%_{LVptv~8r;x`SgF{cy)&%-1+ibeI`?G^XR0vT8>De!w`R@g;#&aPOeCmUc9J zn2~9n5*S(5C4S>wYpapa%QZo*s*x)|@_Jv|Yt&L3L9ZvLNljaT_Og*%fT!|T8@Lh3 zIp80C#78-mgKKB_ecZv^&oJ$nZZiT4IQ@e0{UEb(7ogpsyi;SUk%`o1tBnn`=%V#s zllBXG(Q;`#knhasN_2TJ6phfR%Gzj+cQJnApn*`EwY`3Zjy1Q8+AP-cle&vm%&8W= zx*ADc-Lg=N;#fKnfk$xV;da5*7RJXm)JE9y&oDRI&dWJ>`jfR52Z1O|3?Fg0l)?ub z?6B`U<l6+PXjJTOXqmWQLV1s6X1TDJF<PoEFsKyTJx*);D)>t+HN8op7X3qNr&U*} z{UDSQ`iBsW);$(%M87!oF)bN^10Z(|8gA9+)M6N_%HN3qj&fks!Z;PIMc+#AqAjsy z7m)Bb*tL0LjS@j1dQI)JJw}kPMl`({d2BStl?())NO=v&69Nx4vP(C39z_{i9~e>i z$s4XI2t-4jQlT{?@VT%d_CdLvQ&f@=$YtM8fj=|6j$8Xvt+(1<@@Y()!caD}pNUpb zt0Ls|`rHy0X|#8{H*FMgRo}?E^p4R>E`3FJgW;Dw#(P2z%Ke>ca9YUeE~iO^WNLrm z4)GXkk*dS)zEF!!NspU0PAC~{M0M3}U^Jne+gjPA<w?yYI#Bq@T92Im&^W=>_yCR; z5%^O#Bhk&)+9yqI?krMoTR)F53imXXcENZw7xxm{akR}&`OpTTrH@q+Zn=mr-P#Bt zjaMZfZZbCJfb=F>P<Ii54H&=qfYpd~<*O=>-4=#ZQ~-CB#s?tDaX0Zd$78IcmKXR} zr!4Lzhf_7vPQVQ|Bcr*mQ66pD({`Ked0c|a;FM3;CHxkqMLo>ThW0n`Q%-Zq-wh$! zt-H^ihRX;vGqSpu)10mnx&^0E72URecid`jMTSz+>lzD@o?|y3YZIwV*Z9Jn&h)W= zB28oXXJ|K_ro>LuSQq=qLL(|;P;1Nli<S)TH}X%=o|8TfwCE1p9Cv>hu7rJ;=@y{Z zUYd%bgA83D@Id25jm#LQaod7iu<w$PMvaLU<LV8MXRokE=x+FH8h_!ABs!C5BHerD z-q!t*{4*LeO<RxF7^4l`cvn|5c2&cNIUTp^72vVJErf=o4iZhHdmrvi+;24ItMyWQ zL;BFj=Lwu8>PtJOh>^LaPtZ1yYQoiFw2>Gooce<F$7t=1*v@1%SCR@X5tT`luL={T zF&NL_K23CsbO9R~$d`cYt$PYM5>os28L06pTusBD82Psu#hgY2Tr|+#7q|XIHr~Ye zhG=RkTcxj4KCZh5?T+DtG>(8gQrjTyi1wk7-pK8oPDUH$xm8BX3AYg~Cqp^B+2z9K zQB^j|sl^B0=hU6REH_kwzolqB2~;5e3+0rowRW0jt<Aur!k}m;y?VUlN1NtdJH$a< zp_7r%21qmrt{TX8;YacZggnxp*tqJ+oD_bO77l}=@ZAx<RN+p-P2k{t)5c4?hbxJS zfD~o?jvML~JDf^f>GrTf^e0FkE2N_QBJfkX4}eeGs1v<PE~34qlfl&&N?5g?wJNbu z68KZJ!NN-5foP4r2T4JSk^hojcHLvTqny6xU^4d)KvsJwGi_81?Wh@lnby|aT;z|t zgNEEcq|y+sW>AhMsohuWLG(3x4Kex{^cBdDAVtWh4I%nO8prU@$>$)o#2wtTQEllF z-P5jarFUaE(f&lo!4;+4%~$vmCX;J4BcIJFVE{+LPxy+oc|9ZBOE;oDz^D{X(G0a^ z<PVtpzzVmF+y&B1tr*eI(c*Bmm;6m$l38_(P@mHqLJV+Ev~wV-)UJ^l?o<vp7pd)P zQ$WrdS>9zYXQQcF6JdV1muN75??_w0-E%5#Ms-qMV}og%bsvO#i9$0xC^ufu=@@^v zy$pTHZ*?1cE!Y${0~?E3duX>)8dped@=z)Pe+^e#T2J>y!yB^E595;VR-ph$Mo;Di zBWnn=tXf8>Bke@FGJ*XV{&`_c0S>B@suyt4t30p9ST4*m=q5-n@(an|)VS(&NcfrZ ze##wP#9E9dR$a?|4&Zqp8>HKW$6;=C)S&!uJ2B1>XdSvyZH*alfAIIGxmT%l=J_p7 z(@Cd;%nl=?`53!34pV98^cQe^{?54jX&fZ7$3~a<nj7B%SJjOCXpJ-q3rp=WlB<S> z=abfxz7G75$^*45!b*e25J*R_72GdQ6MQrVFqscz0;%Rs%MJg@3cI{@`_vk^l5iQ} zyTq?Y^XTm{ZHpOeh}H)_j{7V54{Y?6^p13LST*{Az!7N-fnN>p8tVY~Q{l8U5ihqv zk_Lh3qd<!q;TCsc19W5H9(X)`rR#;>lru9v(>47e9gXq2+5&bzcAA8{PMU-9ZXrYu z%s6O9FOdAWd2y4nQPpnGqE&Gl1)RzlIn8Ndm=?W>o5{W#2t34i&Wt}vodKx;@~@G% zthLd|4Qk0TrUbp{fOI(b4b1(8{BuUebM4j1mkN4OR@^$kxx79fn${6+8Tl{GO+qwx zI7PSN%CNBzWQcptY`4~C{AtEfjUGWI`W^U|?kNJ_Ypil=M05!o>7C-^Cf4oG)j>ZT z>Y;rq48!Q8F~PL=fpa<i>+MX!%eNq}d3~C4@QhkFkf)_JG5#a}g^<$Rk3p6aXzn@- zar(2TFf>4-52S;Q%t_!&;1;+gG4j$ICLG2%Dr}L~u}mZBG2t8cH_01umfkjL9*tI% zbK9*C&&{0b`UsV9T4%=BMz-_tTG(v?Tv`H4K{|yr`ikgg=_ZY@IW2^?3HV2~%4*YH z#BI14q<-ggoNjK7&p_Vfsx59QTfR<UDwEekExH^AMZcLg8?6J{7?3U=^4}UeD1T3R zl85)Xi>NH^O(mPKEI^_mq}E~7!1x!gA>3<*FXQD}kdN|%tTH1GLn(A~>6Y~|Ey?Z> zv@{HLiM?#$J6D&3zvqSFA&riZdWXQP1ZD<-D7@$4^QKmajZa7|WpbC=YPjr_uL$$h zPMQ0_jHje^F*@u1>0(z2^9^r?n_FXx&(Q?oIWxLhCNbJm(k4D?bDcgCa+3du$|A30 zEB><6YpeDiYn5E=KJRXODv9acwq+_KO95|iojs%l%<azUN?x+6B{QhA(`=3O7?r8C zamC-LjVADlEpM3duUa=R;R_nWgaX0@jS;vXbG6&FtkU;MCC4Zy?H)!(KU?NJT2>DJ ziM7l4B7;&$hoRjS`m#GzccsmLq*BtUk2|P_@iLX0VPsU4@*-DP9;7{57vUX{f=+FT zPQ-m0x1ee7*)1N%Wp}WiwXZN1npQ+e39?0ZB<^bIdvK@G_Nx`7Hw|Q9m=P`DWuV6M zp%(R%9^_!Rk>knVcDm&Bz5AO<swqfzQj?tCa&<XOE5P{E!cggKqKAoQa6@sJ?2h&! z+DfNAa4k5fZN@uJ?+RTRkM9}9Gq;{^nqNRZqcTz2m$hoTpF2(0_)3^TK9BGL`DHxU z7Z$>;r!tM_+}`J3Fir}a&8^N=PA^Dvr(J5Dc}XiBVUM#;jVY%k^^wy~@{f5*hOyb8 zIcOz>ooeTVeZq>M66JO;+1*uZqNS~xSNbo=2DM>opOe3$){d(`tu@%7rIbfY6AEdC zLuv)QTzQ=Gs(nE87`=691xc;qZ?Q%>r;=`?g4d!cZepjyaN99TaFEMsjcfW_BQE*x zte=ak)UITQ+E!9O5sgd!1V#;d&l1RjTNt>43oFD`a@_=Q8x3j|8c`{i(=Vt*A3J>y zlAFLZ0%HtnVbCp7FKWDF+ERuZxV1yLy>RRL_IZW!QjG0k!RRfGGNe8x^;J-bny8hg za+bB)x*6<I%_W|5+C%vV)BZs_47bqfF87ZtGaW6lkVjgVp%I3sqA~|}rDfg>wdivr zuLnr<j#GL5CWG|0)(YwGq;8l|gj6YmN=o~}r3$-6VNUo5U_`fBbri;j?0zEbw9y|N z9LA`syGD3TcfHdm^v;9a=J{)Dm5O~vrd=V>)8=u_XlIWhx)DPsh<>K_5I7ge6pVj$ zKc-haq|qfN|25++;THn+fY+iuVWY8qf7WdxOi`=IWPW<R)ZP}_v3tmSS_<Sj*8XGT zS!rI~O+qFPo+dwlay7U$q>3BfLFmF?C6G1JFQs>UDXd~G1IEjgx4M#SL|+PN^u1;7 zn6}2|w}1~ypEojt@QX(=fbz}Q+Yqi(X=;VT2Cc+BLA0D1t(?BK?+W2F;I*V4QMqQ{ zhr%<`&A@wgFF0K$npyV?wFcyO+h`({gdp{ZPIaoI@h-+Go>xmd;HI)~SBz(MZ*uh- z#urZS5`9Kk#Q3vLqkuo9JdeuT!e!w3AYG{3la6)Dh>=F)Q=*CN(T+fA-IsBvflL-o z3q4(8MU6K(?Wnd5Ba_qH1V(Gb5dB-@V^R~1{MIrb2^-w~6ty{UgK?+w{I)O!Ef2_O zkdLLEjBMj33xWKOb{uWHZmUp>)_4VKNNaog+X)N|X|zh?*B}rTb2>yS5#@Pa!l6zD zF$U1fD-^=bpnJ@|1&BW5d3>sSk-#S$Jm4icfpP9{EnH_^{}?CcPWliU^W0i3iF<j< z4YgG(tCrer6c3H4BWrJvj|~3@xSruXVlRTfuZ%n=oy6MG0FH8@rSzkBv05qu6F9v_ zbgAxs-HK@Ef<UxFEeU_~i1yY<?eq=z*KIW0pr<tM+HDdq2iUD8{ZM$-poPL48smYl zxr2q$`yh4Del)0U?9$S_Hvbs-FQ+828=1Q^wgJ*gEl)_JX`H@CZvegDO=}95S(=V$ zYM}+sf1_P9Ewb-c;9rCirsWID(Rq4n2-LuM-L%v^k5K#6pjUuzc_=@qjR<!dO-5@< z;1#F+a0Sgx@6?2sp1_T8b8+ywjZz9l%;@KKH+q(5!jp*tD|~(lO!S~i3-6$9W_Pze z){%PR)Sk)~Dv!8IWw*(GyjLQ6kV;Fm7*9Ws@5#N=UG&O<l+q~7<U@^-^fo%})A%)< zqD~AAG4d}P9mUP%^qy;aUgNB5I!mu8SLt}3OrSEUgBnNB`a7KgewVc-rgg%&ZT+km zg+Lyw9TmQ1ZGqZwmpGhCE#W^7GHINXUS(sK@Giy?QXL7zhf9IG!nE`5>LZQ9z%zUX zYcuq{T1Un+u=XG0Gn_u6H&gdz;O%O4j4bL@7_I`Tgld_cR+~`|qqET3ZnGGA%b==g z_t72$e+yF3!+Vjx6l&{@%r0yo)fZ$Q?sd<12a`?Q{Q-^g^p?4Zu^_3{{&PCww9V!f zonA2GzS}s2@w;h_&B({g0PZh34F-Nq*hlm$jUwESkrvRH2X{R*qWa#ATU0J;JYe@r zr`91vBXyq#u4Jtgq!Q^i$5;ovUH5&pV!B(^mg^2MZ7sWR>W+u&A*~qeo?c;)m#ta? zq`ulB-G!v)VieP83eqX;8|`6euUa3q=jru;djn%4?mZ5s_z1lco?A2=BP+-dH~9+g zVGrPl`%C9uZfH#9c?f|v8fOA7nvVOL8HEflD}4d(ES2VPbItw0v&>=cVuMzx{lH&Q zAJ|%+TQj@u5ndJ6cn>aWJV!nbMkU;wyj1lcLk*ypSl2g7OmdK#;liR0Y>a24EXXKc zikjA(UL3Caky?g!!D*W<#{v%r*{Aj>+(GmisaHuA<8-3uag*M1CM)wYh4M*|f@m*j zl=FeeM|7`g@4K}JXh)@4IIZl|)~Pt$E#0xWdq|Deh@m%Et*+Xi1}!1=Ht;~Ff>hSH z-48KNfy@GqK=x^T4!7B=S6t3j8!gtYhViTw_DkcKRsnaj^bcVWNL(sOZGMG(K2PRh zphYc6ZFVpFsQjvX2yH3PJxImJeU^jQy;7OOjA#?u7SrDJ66OF&rh6eUqJp~3P1{E0 zu7@&)`~u2}oQApG#Tc*i*9CZ$bPA~xR?W=IHzAE~(HmphL3eeQz$OA4>77x#&0l6x zRd6$!n*?K>?tP+*Y&o32@Hc!Uao-IyqVJ@6L7o_S+w0Q;?Fgy0K{Uz<lEaL{oc^sb z!L+@??`ZkeUY71K{2tt|vB9A7ZZb20pKV#%m9!5pO|+l#kJ2J=je|<`w%S76HE2JP z@5R-xHh%|hqV%q`D#%9RV~w)HNNGQVs`-?amfmucZ%}?t?KHcG37l|EgY26Cce{(N zp?gi^4UP63EOJA&q<!ceR7(oill!{Bm8DPI!H=ZQONZ%}w)xl69B8$KIkBI{P>Zf} zRR$!n&rx^WA6#NPqI0Fw-9{CV7sxk^y+7fwS}v>Z4$DLnNPUFXDb)NH6@JULWq!)< zQOPTOPP7eNFZ*^?tIky>TlV4fGWq<tH7%W+Kqa;KaJ6wWs(lSo*_CADB}+I(?ZVus zrQvZ|D+_V~xR|xxG9$O}*kk-1?IUS7D&s7;LSr)84PKhFo73=Sp&MnPd<o<Uy%QL{ zLN^+xaTzU#MqH;OoE{?|7w#h}*`?!&);DsF8E0MCL;_cJXLvFtrTx%;Q(Iz2d9{_& zi^ALCa-t<_vn`n3+#4FjgiFG`5Td&v>45t>RRV5l?%x>QL4tbt#`GxK2p!DzuT^7? zxS`(mNFWRfj3~Us;s2db`30_zL4Cq0+NF_AI!O549UMX{?sQhIyzrfi$j!lRchE)J z)RP`2O=s@Y7}Yd}GkM8{wG1Kp&y0A6|G`=dj8eF-0w=&dgZrIRWnYm$;7;XlG45jB zM~wG#YEESl@CyvZr(BZB?oOZRCgLEW({PXl(sfQXj9hK_a<?`~EfeLqPCo|uXsnTE zFgg;A@lH0;ebMk99!fWmTOjF4o#bT!@T<~>-nAjp|Ew?!xRs?}A~1+l1`BTFASv7g zr#rf}iB9qp=Tm8E%JqHdE;0TCr{_tnCD6gNc^c`3<>n@5cQ)K(>(BHot4jA9beP^) z-zEE~G$b&|$a1FbSNjg*9Fs-ST5BXB)k4~lz)9Wp9NblVR;`xW3O1T?a2#!??oy4( zHmU%ZLia0!W*c4#E@5yG&2&vSgFsZ+X*s(Ggf75ud$f;n({SID=VlzdqEXAKC~!XD z3Vy5aYxqfFr|vSioOYXz`vq5ZoK~w{^#Fbs23et`@IJji`AY{pgg`u}l4{@JcE!z3 zzO?WO$Zxu{t-6}tPKMrs8?H8tz*L*>by}hJxoLYq9;tont~Sw&CyX=b7pICKDaoG- zYehR;(>RPe8f&Q>z`cyIlkzIva^cpZ@c|sI$Ea?2_h2o0UHTPnIka*Z*}Oy9g^VFY zV?a{UYbPvnofUZLVAZA`MHUa`XxK8^3cQH?8ShJa%G<189BsGS9PS@WtDEtu+6Bs; zG*(dlNB6#3iLg;Lo9M50+iqm<@L7l|shuQ$-?T%x%|OzFObts%=Rgh`-Z)4_XQWj< z&}C|q&8;iEXj%_p7rk4gjv4OzHD(t^TdrPrlby+@RU0f^lYR%Bz%uVh>l4_4Q52)U z%V|$Jp~ik;jo0EP<4Z6;a_uV#EF<*<q^tA`w4F@m16~fdlyX8VJgfGBRh!u@o9~E~ zJeMZW2lqViEH+viG?eFsYD3_%!2Pa!jG;8-n}-m!q4xs$nGDTAyJ6&iYVpx>y0Bbk z{Gj`@ZZb|s>wZY|d#3}!JtG@9HFp~`aR0&R8}y>!Ea(|tL}P~;A6sjo#w4^C3_8rq z({LH!elX*R?sdzo62_`c3DcsfxUY~(fm;);9)U@?W9?fLcQ6NifbZJlEh^d2>cjO9 z8%1+;=X)N>b$2*5rgzz?wxt^wnFlU~du|CA*Mjk#cF`+q<T;_e#skB*;ie1zqQ|&1 zxz9&A2CW;&I*^gPG~jP2`HC6?h4+Pr<g3B`!_ZvZ_ZYfQ^j!<~bo$p*7-RTYrv#=Y z4rz2qw=;n{9?t;XlB5cfAL{;2s?B$QkJy;Z&>2$64Zo<-PnbgG00(8HBiS7QlG_jU zwQ7G5m`|XLRjZic9f<jkmoIq9h0%%p0Ns&9zb85h?pG?Qg$@Mf!!>j&7B-4n6IiXb z4)?k(TjQ4Wy>UY~i)Fg#mZdUF_Y<dv8Yw)ZCeo~KBNyeYR9@qGS_n~fD%+&VEz<?0 zDcWPWPA;qlfxmTkh7di$sH)onxB~76OeR#j4qOHJYhIEQc#4-2YR?1r3gGBhDrrHU z5_a>lQtdL_35>qv&%3b9(kRxI>wF1hnD7<I2#uCRr^GG;{8)DYFP$-3^Or^Kj;q@Y z_YCfC+~=5VsQa5~g$R6WnfOj|VpArUbN|R?zaX6rQd##eX%>Ty>Hg+)&+z<atQ2~g z5jTXWwBe1ypy++4r_Al`6<tbx5kq~XeS8V7(_O-SFQ@dv&@e5^ggcsOIU!E)5*=52 zNxIwc`CPrkUq?=>a&?lw1G;&M4mL7{#%++?=4NNNJX~G^8-;5i1-!BCIC#^H>C&tO z&I7O4sHxF`N_BJZ<G!HVSfdY>8m@S~Ef2Es9ok~UKQOljy%D%C>ON4L1(J|xDWNo# zJcb_)^3e;H-b$dOjb@tG*WBlEUpKcZskOSrh4O}fsJ4fft)_ip?gfKJk$R6xHX$cm zHzSw8JrurU<0f1I@}qsWK9XLi{F&i@8&r^k*+f$lcvd&1S{~mZ)5s@5y9PWTF0rr) zuBf?JKvu9;-rVHC-x@hx<22kh({_NQ(Ouw_6F7&FkAVvtxkcI)q>iP#qSerNWYB2W z`Mu#k5dGchMO(&Tv@)%_(8fDi8RQYqY1DceS;olY!X5Hg2$UA`0e=SktZom3G86rW zwSS#TYFrUMWN5Ne7LAssl@0Py_!T(3b)2pO8LqJhu8J^({L7&mb%x8YmO2cIf|c-= zFuC8{d}v#w6T<K)*bCqC8hbg7<M+P<mQH1()I{S8i)~cR+!$#O0-2nC*4X6qgX=8f zRM<V=0q(3;*6C=#MYBx%#R?Y!B+4fJ+1y!by`4q^_a$0Z+C6q(hL*dHwSKKFulBvG zdl<mcPgJH$Cxk{6NsHq)GW?Xe*VN{KT*FPp<WFv>VeFGJa$c<GFeCZ{xH)c8TV}zy z3j7k>L&`IBzme7<bx}G{qXF<YuC9QPm1t4jt06?IDHn9vX*DW`&rEbhtv{*OmM&oA zI!?0)Cy1^lTGOBjx@~#x>(m2nCB3OWOex$@9xBN+&iP0lbvjR~g3uvWz$?%u=tUI` z&&=No2EA&_YH)dU*Xo|Y_}a*mY&>JF|A5DZhZ2QSpsBqHH_fyw9Q+syhWnb{3?_Sq zZd4iLE!OU``!mKrPSr4~ka|a&l$Q%cGf6AK<tH_WmjiH-^j?5OU5Q=-c?)<XsX@3a zoZfYsiE$tI4&`Sw?x>BkenQV<ywe$?@pQ*XQ(EC|0*9p8g(4uMaF>x9ikrtPI>zwb zwrtDLE*J3`sRUFGd4hk!CFZ$1NPSY9;XVeb30#Qs22u&k-4$j;e*yoYb_VW_ke*&C zOTWlQieN3O30Hv0X{561UZuCr1IWbbT+`k+HyM=)z^UMp>V7FLEY#+7ypdbkI8HA< zZcAxpkk>ib6IA>+E8)FoqY;%s<S)W4A<#l2F2>6mi%nZ5JP-Vm#<xtilqU0b?$Uh* zHyxAZG>S-H)fl7pGx<$Un{dAXnICG=hrD#;e!9k4BbRbo-dnekN)hkD8|L2ig_lij zha37#qlqo=8}u~MG&X-8c#P8};Q2(mIgMl^nMOs7!30vF?Z&tQ(w<&^wRuiiLnA7| z<X1+{z&L7;3c@U&PvUL_{ugbfT5B`*nb8uizl|CR#o-FO;`m$@l6EJsNZQVIu3++S zD&N6nloqA@G=X#)aVURfMqZv@0jZ+)3CL)T5v0ln`KUSfvs~we0FE+9Ux8aBylSm^ zOwP31akRmt-WTFfp2$W94&L^ll8~Q)`=Ra|xIald*kdYiKiuP-F80VefZXC>veP?3 zD*8Iuh+gI;x4Fx$-+)RTkawy4W>9nKMJCe|cvHI5(odWAK?qR{mAV>*g)PEt)=CrY z&&F`IYc4w-(OS|^HTv49j5Mvr2WT%#zc=HgrK?NJ1FsWaG&i}6eaYN3JeM)(x}}o< z#~8GZ^6Nz7sf`IM_?Kj1q$_?8Ev@he$eN%W_1E1JFi``iQ$$DOws9LzoW=<g*;wO; zNL~KYG2}Ogn1XI7lexn+3Nf_J9&ZsSXj(a^1g`UMtHv|qDIu;0^(Ey`q*n-ZCy)ua z5?aq76+O?|cW@=)$~o-@Szyp9%REE*Ca3vySDJfG?V4H@k9!kFMrmTouRC3E`jco= z%e0`E0e6({W!-<szpZwf@_S6~p*NO%3!7i$d6>poDs6C6l3F3%OyF~&E!;@lni~DW zLy4Bztv2q5!f7LC1Vd3dje*i`xJ~JO;o3*4H4#2hD<6L2iQWz1s3}Ho@{Ks1<H=MZ zniV*k6@CqkXaL+#mTpOTB)eUl?s`l9u~q^CGnqW7yGiYQ>^sETNdngi^d?`Md>fyN zZ5qvh_nI~Y<fzbJ?J@V?xUjZCG|CLz0dA{l4a1j2Oe3MO&_rk&LW2VF&*Z3CrDUlR zCEGT8wNdS=mFu;wR=a7lCbg?HZ&tfugSJg7hyOW~`hSqhRq9o5+q8D8>Sr?if2nG% z%1zofYuL6%lj@DzHf&O@dXv?0`X>w)V#A{W#rpP-8PtAY=VF7}_b=9^PtQ)B`wuAA ztADW$-P^V;H=s=KvV%I6?%1~PppwN0b}84jd;gv#x|AtjzF4zjePj9-iRnFHVEdju ziwx=8dvK|a-G?d0{%t#`bMH=l`WNfit$qJaod*`{+QAB4`giVEwC~U}NnYyJr_&of TJ69+eZoz-~6emHv1o8h51~-S^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a063c7bbb56a3f1ae6afb76dc33e7e35d25d6f50 GIT binary patch literal 1144 zcmah|&2G~`5Z?7)+{$U8s7O>?;6x-^(?8Kl2tiZS3n@t9WC^Vt?<RG%cFgW3kf^s* z>T8rE@4%Dz%86It#EjiQdV#fe_uCnJX7-!UN6qFkf$=@w_*i;`{J_I}H~?P3)W@)J z!l@(~jVMKINh`A>yTZ0~GB<K7>_{(bL=8$#2zR-6Nw_EI%#M8C=#rNIlR~H#E$??m z(xgWdBid)N>I(B-4SPa?XRSTtX+G$h*oaP?oTa${>&D5^&hGZkajK0<dn1z$^VfMS zCpy*OU9G*W+hLt|$8X*ykmS#>Z;;*tAV@?xiL5Kqr<`)@(vNK6aGN`qWJV(wa8)&6 z?}|7i!m1l(P$#I1Oz;jkaL4F4^;1|3G4z7WtZVBlIE`(b8JwAGycvPLaY3$q^l$=E z>1k`JboHnZN&)kv^chR@)G($npmNc+lvHdmohj@_xy~0DU@=lK6{>WV(82%{jux^H z`x0Y`jJ0O$8~HT~3zd$6&u|>8us@VsC>>@h?42`qp!f6VW4@QLV!ZRr^bZE-N^bY} z4-dl+VUZS_X|7Ey<>r?n|Gb-=PtjOSHWoP_sxW~La$&+j4_j1Jjod0G%7=m<!_)`} zU7^d=r_=RCD!1lWzQrl>+Qtv@%A5jM)@kY0->DU_wWtbUt8l%n!m$jn65xU5aVDOC zMO&~CYx>|;&c(O>pSRIQ32O1L#J-I4!6+UG6u~^{?TgOeX!+P@EReBsnXzohM-p+s z*r!n}Yfr^p=>wOb4l_}AA+EXyOWC|>Y$Butr63#g%9@Cgh)Pb60BF>ePXjM-DjO<p zHS66FP<KipN99_rGw8GtS^d{lDlG3*-CYn}twRr@Xb>fev<m&Vk{VSF@n6)}d-)KH KK^X+JdaU0;uob!h literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81cb445bee5b3579a13401900c94e9671496110e GIT binary patch literal 2978 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 VLkSlTjO*b6-oTQ)aV%=({s)`ctx5m@ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a6dff32ae8511cc8026cde10eb4a8c93fce8852 GIT binary patch literal 22143 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 V9^9)-)xzN&_<dSb>{zj5{ST*`-7f$D literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df82b84bd102fa38a41652fed9d4707975818a91 GIT binary patch literal 38022 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 ba=FAa?SFmtf%1*~vBCZ6y?Xn(+aLHJ3awI6 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23ed3921108bb3854b3f0941ac2206fac008fbcd GIT binary patch literal 23636 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 G+5ZKjlE7jB literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90d0b07d52f51a0dd0afd1a45d5f9f54b68e6a71 GIT binary patch literal 29092 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd1c39466bf63509575b017df0aa81607be8a756 GIT binary patch literal 23594 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 Cq9COJ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f4e9239d2f3ae021bd23d9185681663612ac6da GIT binary patch literal 22223 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 Ag#Z8m literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d60344f065f249f1491dccbddc50932e919bd86 GIT binary patch literal 23625 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 Sq4TVc&hg{!|KH^QiT?{k)-pc; literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efd04dd48fba1816c98864d257b3fa51b9e4adcf GIT binary patch literal 22202 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 Wn&XoGEy}6$rasV`+PLA-|Nad_zs+(0 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30da70817167559ccabb35a64e3cb0c4731ff17e GIT binary patch literal 22225 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68b55c9b59e0f129bad8e64f86aef12e4320dd7f GIT binary patch literal 2935 zcmc&$OK%%D5GJ_~t=20?Nu7t|^mQqs0*;zCK^!1x>?*GUj_p=X3oMedvPdaXRx5=| zIk75VY6Cg8KOs5x(qGV1f5zU59t!_}UUKRT*RdowNgMRgB{&++49Vd)5Bsx1!6)$j zQagR``3xby<Kp0>ge<}$`Gyf9h@cVa(2!E(S;RV4XaR49wy;A-kkA!Qm=kX3fh;d_ zp)b5}O60>p_+df1|NF?vHy`6(d-Bc4_<jcv2qsYQVdYE5Ow=A8XdQq)0E@%AH(lrD zX!vm6Xq9o3GIvam8edM0jQ~6vUn4&$bI0_k34Wvv5>AV$@W@Rf0#Vo{q9Eyx6&A&G zm6VR`L9&q&O$(L#HC2^*O?5Y<0zrUWD{fYGP0KwStoC4%J;+J2XCZNrxJYtHJRqe- zh0=dbaHD!XG3UMB#Ash;hi_Acj1G9E9lj(pHr&hXMyHIpk=^K`(Y+(t>+KHCtAiH@ zAHs}ZvJ6C$kV3VyC!|3I6>QfFEnx|JmxQ)-gd^NtvO_}`_?++zpA&iEgWeNUB7oog z6JnFlhqxEgV7aDS@%b#?b@UTI{KZ>wCLaLNMAISJVNcmJPzo|6+%nW2lBZ54gY)Q0 z$xWT4-;+uOur2jCZ^bRmd0OOAEz!IV`NiwNCTW2;lzhnR-F~d4N*yH=sUhX;L`Dtx z&GXEV^PkA`ez~Vwn~;O$&6+AVx{;77DR)$Pqs{q3axuQNDK6A`Z}a1ibYr2}R?+#! z#mkq=>*ZdnH{XgAU5ldm$G!N`C-wFKg=X?i8H=teqgz7ia%9lxne0E;+fvi;h#G=` zX-()fbzuySkArsZ#S{OAUIjP42Sg)Y5UnQFY{p=x?WfL=JTu)KaAPZ`RscL}b^Vq) z0(;Wn#+TQ>;FYCyzH;ZbDuPI1(W#?AN>m*~9{y(RljAQ`O<)pCT>_p4bZ~6KSA+3{ zqZn%ADAu;1#+iZtd3AMuVd3KC`Sa$Em*1BL2pa^A$F+`(V1I%h5;mBfxOCj=AMZ}H z2fgA(FRI1Oeyu5cW4BF)<Ap`t_yT5FayZQ^H-LeZB}4j*ZqvtWLwb$eyS2?Az1b|; zwlo`(wxw+dlXa4S#2(s$K45B5J8c)jm|KJWZEt8hpcU*A)W{XE#e#TP{2Fz6z|hJ9 zY8pw&Pv;t~2y&c1YU%r2#?7de+~<+hAWPEy2=NMlx!$dq+9+lKn#Jv|kWrQs`O5NA zwQ3RqOEYy>R@eFM>#55jzu_><5~x4qOO8pA)Z5t764WZC_0-2u?3bU7)psa^QoA9g z&~Qp}0tlf#49`ptei=PReKt5c5nbGI5LNUFr@{IzFn|ZNjy3}Xi<n&+kZRjIfc+2( z;sH@-1>0uv8I%fZ7VY658bH>WA*Ucpb7Y$hnP6bKhL*s)Ge!m|=T@5E&HQ}xx54gJ zOndWXe@8H@_eB>Ln|FWs_0O|+|F{a6yblV69;$bNq*l`J7}QEu2A89|&?x|@Zro@I z8Q0}uh^Cv6@FVs2aLhhf0ks*z<+2k{dmgndj}GQ0z?$4!n!*N&#RCn}=e*Mu{RsJh z^N0Oflxa*8GG(87(3zmO>MeB&pKuxpwrBMr5NN1bXzMbHI3M{9we%JmnI3^{`CFI? zG9C?F&k5|n_NGn4UMU?-3;Xq&bwSf~Qb)%9PLct45;msRoohD~=16KSRVzrUKq_A$ zS;ZxC)m8Nln5Z*I-bR9#jvUK4bSw3)WRL$8&5{sEKm%qon;sfgk^Yx)B5zOq1qZ2D Ai~s-t literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c2f65b344fd8754cc3712ecb2f3b77376cefdcc GIT binary patch literal 2240 zcma)7OK%%D5GMEKmAsN2+j;eosx8t&Kx3s3qY01}ZEQC&(8z(Uw7>!Zu@)(LmDR4o zrCeK3F13rC`X8iYZ~Xy1^mp*uQ~p8`pq-&))dpgql*paokTb*Ke8c;tQjtLWBYNxU zlM*3+A#>UsAijZ~--dw`P7~6lA*D!LiPg13yX%AwB@YO<xpP9eBj~Xmy4>9*Rqqvr zZB?pE>-&-173#6f_JpijIzTE;+q)`KLI;nc=6;+C!!=>ctf75u`42D%5>ie=i__5N z3ol8F8k>dCF|^CQ6F+o?$LF|zLXK%T2XuiK4ej%J9-NS{z)QRg-{MQ+kZ>NnT+~+{ z^%E7}KT_hHpMy%V0`1L0BdRwo;~pXSwWmG*1PDbG9g<_KV+|>%znYK@39~tY(cu=i z+7?hQC*Xozhak--QQBs$I8j2rLbX*-yLrDSq;!GPK4WnjE5`I?9_LENdwmsWDT~r5 zIT{G53(br}Oj+L5MV3UlVoeA;MBB+l(vlvkq`JUZ6NEWqzmdNWYdsksz#Y^MB3Wx? z2^TW2b!Ba@!`PjCE&cL<f6-*UgU@cO)}3}oCZD#}?%u66YQ4C3D^7D2CCRPBUi#DL z&CUQPO=kxp<(aIZeJ)h3yN6URRL>;9YVSxEz?+Yu=RORCE>RDDgZJJX?A6nwH!-2G z;dd7Ad%&E=dt{A4I3yig-oSCjJ8~6xXTo#1lQZ$R>T(WrR6U8_Ov3F-0S?P~oIrrc z09Q~65W!CwrxtKn#NiSQx1i^^iqJ9~rfB-$oePd+)So*Ko@pI*pc9Jx49O0;K`}R$ z>zUf>_7c$*sS<os%1lmunK&`?L<iGQvoz|8HB@JE)Eazvfg@+v|4)D966n3azK?0# zkJ{qy8QT}#>*?AVjxf{lDoh+Kh{)le=4R<J{5Htb-(LV~I@ZV@(xG*ojOhz|Xe+1V zKC@&UB;II_1MWIL^uo{@LupdQ&O9J3cuby`&Ds*I<uF@5H@g6{Fax?5$K-`G1cbuO z2+#|5VEz)f@8Nf8w2a))8H0PEaWVtmaQhm;@hbTRcTD9!642mGHCRT&3fR63x?h{U zSH=XX(bX|(zxK?LuTOmgeg!hXtq<P6nOERHflp;WRu!lUnXE*rvIk`gWF~<nrqHW@ zpjEGHSHeXIZ6_i%S*(kxI8+QE3k3!Xt9CbccD8r4mt^fW)DM@7y?$FRgGjF6fB@58 zeY?RPZEA0_Q+r#DUF7}mwx85D*j7WkyNz#m8hW`cpyKqUgcLQE2Mr?}41BcH5`sfP zGZnwEvDw&MZ*0{c=!JHsm`JmJd!O-0MY?SCWN9nrB5ex2wEJ*-r?LK|!5R;DHi7wm zqv{$MY99{|eo0MZNc?H}GZuVIYlbcuXw2{-KLC%uf}XF!fQ4rfkm>_sed-tr$H~l+ zb&VFSvK0Uia%=GR1rWlcor4ZS&ZIC_4!A}#qT?x;tw}Zc2n26NkVH`keF9uMxOsuq z^KrsL5#S?%xQ9og$XGYy{RHWNvFH6LnM&pu<5`n2Q-e+A(mrGsJT&U)%<W^Kj4!%0 zeKMLNNnqP7pr>WfR6s;7ZppDS`nF@0y}%Eg!13QT1+@;(S?Sy}ATdhX6=}bln_M$l aX%_!yV?v<??cbXm=<6G31~WLIi}t@zq$B+R literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5accd51ff345fb2bda95cb31795dbf82e881f793 GIT binary patch literal 1131 zcmZ8f&2G~`5Z?7qlh{s6Qx1p&_aL=~{)k3G2qi#85m7~2Az4Bz$996lIx)LWTB;n7 zQmH520gk)_PqO01iC5sn%qC5%t~KLt#%s;Y_f4}}bqJha;r$Q4ON9Kv;ObZao`cD+ z;9?R}PBI!$irC;rW(KClCbu#>ur;>$N>&O=8r!^_Rf3AfE8NN4z}2|Ky{sBkH7@hj zY%N&RxWeyb>%lrD2PAf4_kzT3LT6@Bi@gr1SN~FIqfS+=^)VEkq&N_xaegF5-9$jv zIXQl{e;suWUw4*~`|_l9c(e??gXZ?m<LzaPpWnQ@4qHc!-NrI>nrVM;8R6aI_wz7< zewGKx!XqDmOGrRt5*V>{NqRIkV)LRBn3u#Nfd!-3YVB>a)wwZ1J2Ld&gy6djW`fBV z;0jXEDVZ4qV@hNC4d^e-87V9<8*Bxv1Xc#CfH^bLFHZ?`r{uf$gCMa`(P#rjE)R!& z)=PN-j8&B_$9W=z3pG@kv2>Ugj0vnOa2R2uTR{hlK?F7>D(G-yR4LcYOJ$2hCPm#) zmP~k0c<>QwRTztSC?#V*$-gr{7wIG{5`Pj3zc=D>BBY-QzdK-TU+xW`Oyb>$<&*74 zMQ^`95d3j(uhH<2{XES#)1fRv&Nt8U;pt8^ILD+mHc5u@Nca)#L!1<T){SHzmtx-9 zR{lk-LN^b=<Xv!t)(nf@d>rHa-Yq4zu9&FPHV6g848ts8OgW5Yqj<~_dyIV^hkX7; z7g5#4z)`|E(6|BRw5wB5LyQe*uIm7#R+;L!UEfeO906Fo(Y?Sc${7P8^KrB?%8`Rq zE)uAca+7g1SWK)XQ(nJ|>%F*y0_sbj#3F-gDmThu$rl-vRykeR^F;z>);|@eiwtV6 a+r6G_j&LqjembY-87{xXc|CgTG5-UKXdGPt literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a7f155a3afc1bc07cb7b79d5d02da6861bec329 GIT binary patch literal 15686 zcmeHN{ZiXT5Vyec7dGD*LI@BD1Sg?RNN8cE(`lg2CnOo$na*gY<8gfF1jZP~c1X$_ z^d0&FeTP0o|JJ|#ORvzsdb`r;q%(5-L5SN3jqdht_qV&ZcegqV?IaSh0Q>v1IQz?Q zr9j|sXz;(k81W;!>y>CAKmtUm1dbF<Q37N@8=%VJAiINb6QI0qmGR`8%OaX<an|J- zEkuG^m<|w?hG>|CNceYEi;##GwQLEirVmjj$-E#ji_dMes%5{t+FS?sm$#wjeNgj$ zXWx0Wj5|+;>yvp+Hp-8*7#Y%rXq3chj1G|m#wt#RwFDU?QFg<)xIT`TYp=0$9Is`Z ztKVD+P3r+<?7O_C4U-XVgeKTr4bu@aivEt0F>TC>p_p6Qn(QU#qxSNsHcrO12|7li zbev9*3Di7ECbcQ&?68Qy#a9y7A=k1kXB%Ys$nB9iY}mTYRq5b(p`2Q5x_nnlk|}MP zPLU){(rGe{Bbp&I+7(NuEo*t?9Xsxma~v|wWrB8exPH!Y)lH)VeNG9EcGYZDv*e0) zm0n?^nx$9CERJf9T-B~QN7b~BoSHc;kASy1-)(tDn<sPH0=>r8-aK6(*U<7Jnb)op zl_Z%zkVDv>k;dU{a|^DT#LSE1cpLMPDq4&Zc2u$e9JFcSO-ZhW)#!hDOIsp~+A_V) zq?hP2xsHC{V1BP4BFV~byjGbvFb)_W*3dS4tP=bJ?F;O3@VFHB)a3DATPOE^l`LsD zDf5-C(wk%%y<a0Yw3LMhIcJOq$qI>+RdSPA1?%c3M(4uHx*ToSoU#5++h~W6)uFdt z`z#m3)hQBICS0B3xO_KQ7Ja<9j&5qQ+9`_7J6@gQobqJF*=mRG$)+pAv||lq%71CM z$eMPWrbvq3qPNK{+!J@m?OY&r$57b0E2Zf1{bK3eL6znj#Rgpqu-+PQdM*s6Bv2dd zK~*o<3mHO}F)#*T&_TcGA_g#T28K?B`1NmL;OY#4lYa64iGe+<DOJv0xGI5fz^c@P zI|pw!Q>s2xsub(>LZkSmLiM=WC>KkO<C;EHhn#A$hD+~?wL*nft#+_lJi5qyYr5M@ z&g=#ICG)MBraw!n2*dtvw`d)McC~yyIZyv^QDYVxhVk}gVPITFz`u?QBLc8dyXaU! z=OzWhU~jgZrvZ$!e>kv0f;k7bF08s#%#n2MeCs%diMSyUng+aG)YaWr+Yh$Q<Lkv_ z0<jOf)Q1YX#QLy)KKp&*SSnUdFBE2LOcuRp@x+Rq<WtV{+(tAo_4H=})13;*zq@c1 z;d%nE&qA5kyX((hUEpv1ul?-ld9v~upL&thpZiGis*R-JDT13%6rOUI!9X`I!_a@i z2264)c;1QAOp(vCW{SL+!H6Z*r9M>9CDw;^_>AwTfQgmU3x&Vxdr{CDi>amc&lYhO z{ZfxbbP|n=gzQr--rmBTr^52_PTCw8L3pQf7WueN-<Q@KAHL4BW#>z&^+u55>^Iv_ z;+Tmr;q>L(%>I1G>U(uzZ@-<1({q!<hSo!mcQ)?d+xR*&re|onWcVqv{S+z13M20M z1QWuZBA3AsZunF;Gu`tXNhkcC^|^mkuveGZA$C7bvn`}YbMFqyjl#31IWu3{9LEv0 zbswr0B5wU{YY_^N!Z1jEoi{y$*|{noVSRe$2f_~oJ7smdvHNrRh#xobO+)kld(dn9 z0eKdAoqx1`@7tYBv!pGA|1#o|dl~;U%GQi{3i;F*iH3W1n*Y^2?;$B2N-nJ_UTF3w zC9+q4z68PVu*7Fsol|3w+68Q!HH{(YOSUSEILIYHWQG?8M94sgMAW8%i#9-CYSeK! z6+(i-<tnXDu@=P=u_wa-*UwZ)&s#52>$*y-?~m#=_<UTC>^yzES=imn>1rmMeVNtO zT>fD;uZN!IbA|nk9!7pHuTPkQPab9qdzlx7{KK8SjGi#L`-T0NKV|mxD1IG<+9D>& zfRk3I8#!$8Z7BO#;Mpq^YLWo8Iwh#ZcS4_MZ73rxD0DVMf$xOof3~5Fw4l)03<W-i z#?1FAh>cn_15fd8H+qCiaCjugeq10pj1+@Tm|bpQ!sK#T?DcMLV<%%;wP>))yWQXs zF5!ajIpB=uaOge<4iX#=Pxvj<X{5kuv&#)km|P3?N1*luRyY*@9H&oe2dC_F<@9N> zmM$Mx2(8uAN44~u!$M)JzFGb5lsqUEPEI%OHp*LX4{Mcs<<0HwbUuA@aI$_-WuH1% zD(fFlsvqu`4$q(y@4_jqlH*z$K7J;&kv@7;s@IRcIr&wOe1CLI-dE@kbIg2wjy+=I zYH)d8SyXNe1_uTd^NOg!$wg(&zV5hr%QH-VQJGhkr2ctXizNxNl76%a{frZFSzbBE vo8=_4H=~T>H78k}WV~5rlJSy?%$rk2(O2*nyq>k{IjaU+&<{26+;R99E=i$f literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1347b6f43d6e2618be86ec7bd98ca05ac304e573 GIT binary patch literal 2993 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 JO{nli_kU$F+{FL@ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03b095aab1e149c920841bc869fc1021486d77ee GIT binary patch literal 1621 zcmaJ>+iu%77$zkjWLvUj$4Rqdr(0ud-K2Gz0>v;Sz_Ma%F~9}}5Euwqq8+8A>`}6t z6z-J^^d)wY0K3^c>`8dLtG&Xm#-DW3rUOQSAO4fX|L}=NK~P6}{Tbc;MFj}`1<Lg* zY2jPF^WQWiD8U>FOfUx7;f`>LYh;&~M46ODg;Ye9RE0-8Q6n``Cw1d5@rLk;F9H%6 zz08}UMOq>xq0uY6EjpxQ<SO41UD7qO$G61}*)ejB-x0fH7o!uD)RV?rlr$J#yX2F^ zAEI9HH`Xcku<9J2MsmoC6FFPVf0DB?liGS`m}XPXjxGwe@o!ue)%`im_Vx#R#}_i? zJdK~v62?{ihgo_kt-SSPRHWJ9c0l+%if>yQ&&J~L;K06Pl)=C#Jx7J+6OT_MV=rw$ z+aCMyy-A04?MX)qK8<7=Wj1tsli_W%uBtV9HaysWFglG=dyp>Q#tyz`W654!TYanE zw4-Cs87<_?G(R;_v2NeZayL@`sTLR_I6=gDhbB0|iSyPY?mJXMq@?@qs@Cx6c=$oL zV;BT1Ade;#f{*3DYba2GS7_~AI#&pz!YxW`tg&pcVz6q^GgvcNH`p-f8w?CK4Yt;J z>aP$Di}o75fv<HEywbFI;~3d7vb(~UTPtVfUO5=8&{=rdU189t?v*C<3SDkPMhSv~ zUVJy|?Wl6Tm@_FmI&I}qnr3N1sf1D_)FsOR6@V&$2T%impGh_Vd;n;GYyz}3sOsD> zGM6EkT3~ADte^r&M>kGYVdn+Q5>=K=J9{Nn${C-i;M5Ft6Q;KLY?{Uqr?<`BWtuNO zwraA}D2;iP=al||{yFc@Wx9+C)?Y@lKbi4_$-FOQe|$#iVLr$nFOx?xoiFzv6qCd0 zndEzu!ILNbQGcG!@1<E@M4aC{pJ%Tg#%Hg=Xf|Eyv}dv(>whp|ML!?M`4oOcTiN~j zh3x8@zt%ekK)C5t@PD3i1^e1w!k+Q@xQ;#N_3lSRyMH~FUKvJ|MS@YP>J*x};2`^y z{;FGHJ?3N;Y`PFL&h<b)*EtyIVfh)zUjV?=ztTH*G<ewPFM4-X2kO!j`Jf~TA*!Vd zwJuwzA&P4AD4WKcYsF0X|GA@@@WK@C2pfIFCDj4X`1)F~-Wz_Y0KA311*`+;rdnXL z%&=BNHs4w{Spo@FXkNBAfsF*FnwsCY$4bx~<vrC=y1(B*zjA1mkA3{58{*IbNk8tt Dqh_>B literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22929bc94ea228ad702b78eaa6d4c89103a4f45c GIT binary patch literal 2447 zcmZuz&2JM&6rY*>@Y=B*lR!vNRRyU?wNx-|p#=$5g(N@_aiZ9$swFhtc*f3}-L;ur zr-@}wNyU{vAvyMcsQ5$X+EcDQ_R_vL8z)Z7u4m@W$Ig52_rCn3R4Nd7{_t<S{#YjD zPn=918;BpFCBHx?h@c^fXp2&$S;!)*Wf|HE?Z|04hPFdD%C&Nac0w=8xAKN|!$LIE znu&_7A|=m=$O-R=2v5>Ot5p*D2B{WKDX^(hy|6J1)8NTLDpz)W)sX3y>hDMeJ98_2 z5yag_>ZfwUZ|?@Ngw@5yi}l88kfbWu8Kyx$ejNMZK@udeH;;QO{Wz8T>C|!wmw97@ zZ)~ovy{s}_L>`l?b@A+S!>A2Xoj=wYm23eaNs9{7V(&?Z3M$x<*Rl+42^(lzI>Hg| z5jmtS7ign0&^eJ8g(K4P#EdAyn14@f(kcK1C0#(lGJV?!2R=9=Uu?-e=u(o>F*#(% z>;yJbE42?{&YjdfBrxVu&y4voIWFJ{LEvs$ug+*E84jdUdALM-oCk4`a<1@V<>Fet zZ2;y;q|o^KnwWx>`-tlZzISl1(#~K#U)GM2iA(`?JCR`r#ysck&`%Q1e<yz@wSfxu zz;d-cU)4JOP)L>3B30YzasD8=AAi3m?zQ<~@0+`6=Rvop!mm5`A3m%#YlC2LJBX9i z55wF0gZS5P+r1Gkn#T8JEc&X}244{}ttGu685oDTGdNH)An7e=iScq;rUmN3J2HNe z;e2O;!>0lN48Fb$_?Yyp4EhPMw!-TTtZEi1h$KK<RkGm<F3n*#j~$-)3R;2?6Od_C zxv=^jgW)An(EclU-h&R9lOE0N$qXM|MAZR!9{Ul*gW;O7yWn{hKD~=~Fz5&yU7zAO z{rRUEqo4wrvby$O_ya!%LmL*KW~aT-kGn&^E74siJf|_A?6-|Pa0p#02hAw@5>);` z_nE<+9>TjyUjOxuf%5Fw8q+abA}92nH3rx3Id7QSf*tobCm;-Z9<=<Jo!Af>h29JV zL~)C}t(dbVINO2M@}<>TSgn}5D<|ZgJ!XQz%EvK;^b!JoMOcq;oI9R3Gka_=LQwsN zyY>mAxOX+%%jUo>I}MTw>pGlTBtSVC^}p}TDRTnOUhKZD{6s(o_e=(6WVi;>FT7zN zsCsI6Tt5M%kUm~KK{=M**f^i)2rJjXZn^sC=B;EIepzTN?*{2I1ae<3`|0uyq*~ZJ z1^9_VZ#zY+oMKuy{Rf`v4G3*8sMJ;{V^xH8U5Fv0a)`-PD)dY3tZi>^ZfiH}ce_$) zN64LFSE1jj1?<qc+O2Ok`No=dvoE!~-fZC9d%F3mzRK5|+G#W&Z#VUP7yP+BR7%D$ zf`0>JUEq*RvT5e|c1KE~N`}1=Mdw%7nrkb~_4+eC+wG@Z#{FS;mkU4jb=ln6k2`^o zaa-!S#`DeX=E|!kZ$95%gUQR)s$-%@dk6{0s5A{AzRr>&Dyuz|h9eFpx-LTOOAzA$ zwB$SJ2)#-xCfSrB-Pnf09@9^mE>M@wu{k)iNDHjY%CrclJvN%13QN@OJRH#$*i3kQ z4g?sM98+*tba`edmYUEwWLb8w4MqwxO$Lz_`TJEXQxJ4AHIc*E(Z#bgZ)X413orN? zT7ngV7#&7SQ*vHL6^aZL7R*GPgTZ*z7sC+gBIj?1ewgi;ylfJo_P`^dCZz{czJgF1 z!FB1Zg0y8ALZv!~9P*CIswSagIr{=yf}ZKoVy<Z8>)kXNxn3>n*=Xl1%Vqwr(82Xw zW?17nQTBJj)Iun2SWKo$Uses>-k=?)`&s#O;mQQ+q^X;ZjE7NTeB4AsRtnCg&E!T| Uwf87P<Oi%PM&KeCKYJ_IzlwEH1^@s6 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4733a137d44f3f32a83a8795d2751b3823e9a8e1 GIT binary patch literal 5837 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c62398b6e5c216c11fb4f86d9f78b8691cfc041 GIT binary patch literal 1978 zcmah~%}ygn5bmBokImR1SSde>qE({o%F%+eNzj56g)HC&B(RY^D3YaB%S^YuHZz0i z856L~38cO4DGvb0T=og_40(V)CCZ6Ya?UALJ;0hMQAX<O>gvC$udBXUEfxy|zMtD4 zzWfEW-*IsJS)hCeE!hOY38x{6Xp2(RjnIh9mKj+sOOMUaj+~aGbt}w8Zp)=)gK(QW z7lb>4o|~;a&oxQey{2$nnX2O2tF~;4bXOkk3t2XlhgvW0Hq&-0l(*9kUiD(3N3eW$ z?U3J2-b~>kd;W_h*4$w`_4Vp@04Lvl=8cy4pa{~UoU{y1Tjp!hq1@o+h1;^UZgCrQ zTR7a|xeIbmTRG5Op4Ym|3w-K=fcqXVLSJ}IEYg~SP)e$R*JlBAv+I6c2{1nVutz7b zC7**xNlM4$+_*HZU@|pR>m0_+<^-fOCYL$1a{@=xTG>^0G8_mgbFfvpjP>GP%9yla zC>^xr0}TmFB2{GZFk;a@3jowa*-|7T1$?YTgdOPfj0IskNf`Ty{FPJ&vUdz1SB~4V z(m4#dkVz$ymHj?rOUYvV?3jNYu)*<{U!<L-ZeNB^JB!Q96~8j*4d#1slD5Ne{$vpU z@Kw+sp;0$>EMk5rE9e3jX=MnT2l{ar2B$I)9zTMXxF85E(E@eoXzm?=3%3#eJAj|S zuKNIvN#D$%<Orjsfir5?cz)TIc#p<TdZ=NZ%PE|qvY2%xG)<$JL4nJjKuZwZ%)`;l zgnt^-d(Pntui*|X6;9#ZjM~VCxaXJjxi?p3cidg1JpD)_WpO(aPjSBif*7OsCT^Qt z^S_s>ERO%U&kfsgci8TV#fiHnk-wb}v>&ht<H4qb`w^6r{+O<lm-}Z1piVC7*tnu+ z=GaV)zIkBCC#lu9F^PA{k)y3Su&#pDy=TpX6%rjzC|m(x2R4o@(x2kSGhz@nb>w^x z#nAU)XA#!Efubl~p=J8Ol5cL$!xaFwS-VDur6!aa{lcmci<6W=hNePd1j?>98uf<6 zB2-ST?z5e$a<T==+47q>c3;%@YU^yvS9a5X-tg627hWeAN-1LKA)iAL>*Rr&)a;aB zulm(Bf2+2kN_y>K-05)<2SUv@H|q_5ZO>=^W}^y&?e(&yQ%<@2r>TIurJ@03!A<pQ zUv+l8OA)Ih1YZW9laE0VC>9TzORYOuqO*nvW#k&8>4~(#eRt`C=wRUb85cm|^bAU+ z5Bz;V<fAd_dOSy#$r<J5n7$9}Glopo#bnjGZ#RA$J$U=a$~6|n4afbtQZ_O)iuGER zt!+MUu-!&|6|7iU${EIC??C(`?d3z5+lH3tUycrC2HpQ)!u|VLmObP>tP;jlfwAb2 z4@1;F#*T*VFq@H&;ZV&lx`dSrqyxN}p2}IAc!1(F6c0fFQ)WyUh%f{;y~7=9NArQE z0;Jqep(SVn)D6$^Y|rv6cTQ7Etz1yWn+nY+P9oOI7C^&^PPQ!jX0u1uNfTv1G)>^j liS~mei8PUCEOqBe<`ep%+;6gwzx@cEK}PfF45Wf*{SErK!<hg8 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..355144a6032f55a12de22f3849eb57339517ede2 GIT binary patch literal 447 zcmXv~Jx{|h5KY?fp`fk|OgGYjn6C<o5ULOiEFb}5sDvyxb{ZGQwrnS~{WUN$v+_%_ z@(&o9a6^02J>R=K$?x7}rxOQ0zR1q=kAJ@xWEE{+41C&c4>TACG#rL3d~4CxdpK;< z_CwH(=AZFn&Mg#*mVyDBa_cN8DQ4glSYBwsvl$rX3}+RWV{kcxiW$q51X&g%W<X_- z=EP9u;>@T5Ub)M;1j}5h6FmbWDKvxS7T9v6N%}&@%qDSsMoO0}a|TyL!lfXxS%Y0l zWHMUO!MGq?B&jO8@qFzl*-wt^FuCnU^#;aNr5M*+7%zo+vSz(<S8qIB-#^^k-F^gS z-P_Q>uSVMNia3TUVo;_8_4lB{pwR^5Q`?g#6+KR|t`7HIb~>IIagg=;ee{Sl*Lz%A rM}*j$YWaGUPUeedlm2%}l|joZ(Nc_epx!+HH~3;9!bTpVRuujLyW5To literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# <http://www.edu.tw:81/mandr/> +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55f696d4498f17288f757cc50e0820cc55efaec2 GIT binary patch literal 204 zcmZ?b<>g`kf<1{+v5Y|aF^B^LAOQy;E@lA|DGb33nv8xc8Hzx{2;x_%enC-YSz<}5 zepzCXep-G`N@`KDer}O|QdWGtMX_m~d0C1{a(qFVkwHnCMS50Ij$xXqrKNs|enDn| zZf0I_Nn%cpZbd;}xp8t<6-W?_<I7U>Qu2%RlQR;FQc_FwlXEil<Kr{)GE3s)^$IF) TaoFVMr<CTT+JT%?48#loe2zCZ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdd37d668d88ce0dd1b4ade0669851c14d2eac63 GIT binary patch literal 2693 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 N$Ip-MM)w--{{ZH0A(H?A literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from pip._vendor.chardet import __version__ +from pip._vendor.chardet.compat import PY2 +from pip._vendor.chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# <http:#www.edu.tw:81/mandr/> + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..2a3bf47 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py @@ -0,0 +1,6 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.4.1' diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb65a28995c88a72afa9039b6e492392b3682415 GIT binary patch literal 452 zcmXv~$xg#C5KYn~UDAqc#UJ$0x~nJ>LQoJ#F0F)Q30bB|k&7KilQdoah=1TqeC5Q6 zJ10D?I?}v1o5y-HYqc7VwJ(18`fK?cle2j?xU-%=T8N$4m5y?$t32wd3au!g`YzTz z8K{tks!FS>Mr*20>&JRUHdI6-8~d~w2Xm(r{<wBk$2Y!6MPb4?IWe5LwbW7rSDY2e zuE4P;4T<q*eEDI5d9jy?2_H6)Yv{Npx=(Yl&@Un#4G%%TH|`CdJ1x_|m4Zu=Cx8l| zg5V<r7L3pBGYB!SBGeG-*om-H=q)Y;Jd24KD-+0tP8s`j-~vYx{(xj4N?s(S<Um$h z#&(P-Aa85NruihjD&z5zW#zD6tfud4kb~9a`kE|ACbF(b^MXs+-DT-^v|Jyscy#+) i8fzfuI}pZD4P(7*Z)!J6#~Yd4qN*GPwB5Gb^!@>g$b3Km literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..975c805739808e8d51e3d433f7403f08b3d175ce GIT binary patch literal 3350 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 N<TAN2y5n(%`yceIiroMJ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ebffa35d303e4f60e0b593e2ffa19c77b499c73 GIT binary patch literal 7606 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 V^$<{q=xIa)b2gH>$Ue<o{U7aP`8NOn literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf95fb49487c6a24320e3da824ca9ca05ae7fe95 GIT binary patch literal 1671 zcma)6OK%%D5GJ_~tyT{|n!2swqJj?v1T;|^H*HchMIWdSJ?K&)34|64Mx^CcR=dKG zl44i6)IRjm{s#Nl|IlBu*Pikhdg=@n$#&2J-Ng(!<d7VG^9{dgG-8I|pK|x7pDT?0 zMaJs$vGWy*v8WVNJY)T3%lq8fqA!$CUgnMczR%G^1}Gs)1tn6xtg1kT=d2&AZ565N zIq%n0tZFz?*L>7ab=5d$XT0B3O|^le8){Q+VY{jL53K#xD?FKXUvboJUe><OP1-A- zr1`<U!vRgLK7pNYQOvujEC%_!3b!n?{ET0SONOB_+>UqK9(d?c)(S|6iLt7f+Oi7T zXq(6^`-4G<(@y<uI}=D}((2AkLg%Q+lm^ooL+9BjNgkN{`DZir$sn1`?%lOV4~8Si zK0dnt@L{LdnWU53X>Kg;c>Bd9pC1fHr!?p!ndw{=&>0k20dg!mX`b3tW~tG4CMOW! z`P(Rl&}Tg2ZlpJGCXP@`F}mCSik*dLb}d`51z(7vcgA7Ya)tN)g<CQ5q>nm~A@vcJ z2tHLzR`MMiS)W$mI`1s-nH7mAE9C3EenhXT^9tYa3S`yB=G@jU>b7yo5m_N)hpyK> z{b&wy^5{@zMz;n<ew3vHYg+Tv9=BwE(kkq+hL(ikqaI9kuiY#?94_O>GMnn}017BQ zb7IPHnHZqEIzt0orHqUw9W>EumBJd?Xn>aE8<TD&=I}*o6IJB843|b3fgYyD;yfYV z_RFfA+QKoRtYGXj4Ymw$$8=KqwEGn^01JhcKIQEl?3rCuOl<Qg2ze-C9(p_6Y0t+N zh?4(K))vmZCTo+(ng~lts=}W2(DGNL4IC0cl?pXd4N`SdYq~CbF0xQ*itPaBO@xYA z6cUr(!~QxFDj9MwP|QB6C5e8=l%8TjA7jxx!Lq>;!rs$$0SR{>w^dt|J|+|M^?Xk4 zwP0KvjTOZc#NU2S=eTeXBEe$;dpNQV2m5SY#Vs`cA23byyavoBng0z8IAC1q+yLf% zTs9yc&_|H2E9^rw7C!8+Ds15?{+s_YSOgdRlEMBW7>SoyefYWvdR^W|f7l^)3)T9$ zF~`L;Qwi~i2u(C?hwuUU-CP00sIs!8H@tx;Y~bYgD2A@cxQ~C`CD+Zg{ljjz*WLnp zKgt+MOt@$1GY3#vllXetVotB8dj*%Qa$IsSI`Fn|tt*MEJeSSaTa9HdhgdO`I3Ud2 qvDbohY;?Jgz8Dv3n&~eor-l|p7-%HwSQEZ*;zdEc7gd_osPYelfMLJ@ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6c46333bb9ef61e79a4a3f3692af98225a3c705 GIT binary patch literal 3865 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f4b58e079d3d72af417035207d59b8e1903046c GIT binary patch literal 4613 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,257 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not self.stream.closed: + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py @@ -0,0 +1,80 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py @@ -0,0 +1,152 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(stream_id) + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(stream_id) + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = _GetStdHandle(stream_id) + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py @@ -0,0 +1,169 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + self._light = 0 + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + elif mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + elif mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + else: + # invalid mode + return + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..a786b4d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.2.8' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d7d643e9cfbf6e41096d01b28469fdf276df8ff GIT binary patch literal 1050 zcma)5&2H2%5FRJl>|a|g1tG*4A?=}?QmAMpgesr{q-qa<1Vlns8he*)y-7Mrm$u^8 zK1h4y9e5I7Iq?ddm`U1hK^z#%ld=8Hk3UbIEiQI|<a>1Y)3yWfgBO?5B4dkYk&;rN zgn<y06N;ChT;-jD^0af}hVD_1P8$ZMUg!yU59xgmbYriBZv^llysw&sZ)%wM<l%jU z)cF7!&YHS)F2c5MpLMi%0_Q?dp106%{iK{QJZ`KG)&?6fFD^xpu|>03Af+J`3PPuH za%}HKQj{jy-9C(UUM5*O?7OxlWg1Pjl(r+~G*btL?FA|K4<b{ad;|0;TBUyN2RSCQ zsMNtM!eEpcrLhR680=1@+$h%5$20XPmicULwH$4XCukmw);BkUcR`-yD@j_EkufWW zdHUsHJUQmgYRZ{TRfd78OAMq;(xjAfkRKsY4_&?!8!b_-`@(jI2gbaLQe`y$!2!dz z7=Mq{oCD>YLg?0y6MCwld|EeDlL<wB&X^rp_{&5-r&)NU6c9)ZD+c<G^$Kl9)<+#@ zsOH>Ylc3iBT$QxUzBJ)@`C6TW`tW}<VVeRVH{st|JUvayn{-g;=v~jjM={sW!e72m zbr+7L;48?>8xf73$>P1fs8e0NbA6XijGCT$hY+{Owa#_>dagNO*!R&T5HexdV8xGy z+=#fuY973@n5~NU8)Ou`)e=0ay?)m=O*S4U>DYE9bq5yIu+*9DtM0A(paR?O>uH{0 zxs8~iZC><*ZI5-iLoqZ~g;}2iYP6k5sSC`%YO<{-^?&e`D=d0knBzG;*AYFjB<?gi F;y1Iu;XeQX literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28ed2772683f2d945cd4c212b2e6b74cc92c3d9a GIT binary patch literal 32060 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cbcf0dea35b50d4e4753e2d759700204fb3a8f0 GIT binary patch literal 42581 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�~Wi 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..046e324721c0b9b442c806ea2c51bbb117294f08 GIT binary patch literal 17346 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28bbbc1e11e04f892a2c2a6d97b7fe896b75e616 GIT binary patch literal 38732 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 E0O0(uUjP6A literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70a520879a1d8df1a0d10ddfcd8955c127595e77 GIT binary patch literal 10298 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 CZKp*5 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d7dd9e91b2b86c145a83ed83893176d9ad2ba61 GIT binary patch literal 4484 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 U#gDJB7Pq-mX?2{R+Khw$AEN~nMF0Q* literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..539d4bc2ffda866dae2a579f2f35c790592a5106 GIT binary patch literal 27694 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 bxH(2R$Ui_h|0U64c5vvsV*HntC)WP~cOJu_ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70b21f27119519501b4ed9dbdccb67738caa93d5 GIT binary patch literal 10894 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab68fea7701b25faf420d88b99c2ee4bafe9f8e4 GIT binary patch literal 11084 zcmbVSOKclSdhQ3=BwHjU%d-3&Pg@?1M8~2$kDc)dw#S|sYuA8R<Jg*6FK0a57ON>W z)$Ha}HT57`2{4`w^1xyTNe~2!9H<-uB-lf+r%kYjWU<F!FUhG7L6BT_fLwyT?IFnb zSMecvyx2u3u~@AB>-E?F`2N56PN`&Tc>TmZ_vC+XYubO&m*Fde%5A*G4^c3U>4DbP zYr0N#BQR=){4{H({LIuc@-th@%1^6iF_UG2TsvROw+ppG+pgK@YqD%G(Jt1CvTg;X zcDYt=Pu3>eQ?;q~iQ0+wbZuJKJfnZon>o~Lr&z8(d#Ke;dzt<jmPgB3R;Zn0Hk<fd ztDXP4#)_=;xyDM~g{Nli1!g?bD&;S+Vy&X5xp($sPuzQd?Ms~+%(Ni(MI#EE{$@JK zyx42RbuVm0%nvuyT+Q#S`hkajR?`oe$1B;iNG<PoJnqI3Pp39LblB@eochIlKP_Uk z9S>hSZoHM2)pM`WjoppFOLKl$-|@m7_kS?IedF!DcHn?o_)&Os?v?7bIcGTg&AAWO zSC_8OIU;sL<_1yd-JIL^#N6Ar>>I8SUV9_hchEl+H|M%MToH{eukDJZw%_29h??<I zBWka>qFvp2WzK24q2KgG{Nd5bZrRRgsCx|S_v8Iz%c)+&l5D5LqlPC$#P9INmQPIT za;)a@^*8V^bla%U3smF%4ywC;_}Z&;%eQQderajRQ6o3^op{T0+)gL(8*YpZI|6Ls zG$r>w?fTqnV+Eq>EG^NxV%`<;y|5YmmV10{j(QD;q&kg?9eeBn_jhn;o1Qq<e0PtI z1q-?F?RbF`P<eCC75BoOXxrm+PS?NFpncz*Yr28(XiLtG<zF-G^3kc6N2|wSEe}uY zmbeI^`{eSa>XpuZycLDJZ+~=c>8<LMD~lgFg(uZ3mA7AV6GPK3J4;uV93_P-PB(5Y zU8fe?Z#wll@w;AkZr*ej>h-n@fvPX8*bZKPo8-`eL|+9<!G64$hd$gBQLy7Jwj<UJ zysJ*L8#XGc57E@?s%O1Eps2{M^awqin>1oo^%Wnf&nF{_j>}^K8XB`IaJcc}LUmz0 z0_N@pF$kauZX9!(;;JKiRXb5<@mgg}+l;u=ar{s{9xsqq@|AH^1BM#+=N<$z9FVI0 zLnX)K&^}zgx%1JrCs+{os-nBG$QKruM1%XC_~UA4fA{U=<Eppk;V2faItzFo=~Pi; z(sF3K7-PiRh4~@x1ofL=lspzk8A0^ax>#{8J8RHq>@@ax2dnm&;|k}RWU9B<@H(+` zSALM1;EA{5pidM+<3+barwse#Jdi@<+`8$!T76@5Ahcc)!&vd^F0{*AT$rC1ABPLh z{Ji5G;T0|C71@h=czZZF-l*6OGK};x@g|G^F5coX3Z^I8w#C;Itq*&DsPlJF)0xi9 zL*rxPKtC`*VMq!C6q!R^tg~!_wx%(w9cbaS?5WzVM5DGugLTfW{YrOwrRA>R%Nu^U z4EyMCn*LY%TrW2-9I`IG43!llwP6q;a=SjvYgP&z%(#ss8`@YC{nH6p<zdU;YJ7%9 z>nwL*3EbFQ-f{VIGYY^YvE0U_t$O{s_*(ep4tu>(@9eyKEpA@lZ1Lcg=GWeOYk7US z<9C+)5EBQ%(q1RreXY^zQKNj5L1z(PX1<66e`8q*lYlU#C*c%6?MAV8WHs*)Kc`S= zdOmCGQ~I=CHf%kw^I5bt=)v$sJh+XwNKtrNO=lXMtX?y{44kR~hq}PB%=%of<yem8 z;r{Yop=I|cSb>gb;1Y|<A=XN)%qBroW{d0un?|omc9PAYWy(8In`WojEb1rOX?6ym zGpxeSvU8w1#m=(}Xqoj+vlrOK&$Xv|?TmM(b(Xz2`gX2$o;llw_(zXwg>8fX6txS~ z#(&B#u{rdAfn8yj*-IGlBKsXS&t69DMd_ZerW22(27c3p;qBF>RNiqK0W7BzN3evQ zeFwIo!9ARwGhndO<WbuZQI|KyZA67rB4?{)yW=(d=D_2Ks%%?ZUu{_6D81+t7FS7m z4;9F(R@V{(rJk55NvgHFDa%ZpZCT9NHaaV^W^Nl1)pFDZs(f5vnWsc=C)v)!cp_2X zijq2uetguAYB`2BP?s3#fwi`pW;>Da_tH$u-Ekr8TF-o3{dQ`Eait8&mwT-<pQkpI zfUpJCOD<#ez=dhqf<UKPn9&BHMk9zeHawmhkw`P-HPWnf9%){nBh0Xuny96DXoK&< z_3}LSpXTaKILoM$T6JI4F|n0qgcmgV1w7?1P(f}i%`v`T=iQL75z$K>Q^hHIo`+ir z{kUHL2;T(Bwq{uR;Ln)Ri@GfZzc+K_?5o304U&C&W$_-Fq1*V9ka5vrfDC>k(ONpc z5gRSDpGovX9cIWp$RwG5mZ0XLagdSEEF2_#(-R$R&aS2AX4hX$E#-yN+`t=Ga(Lju zMPU|x2}PPA5XVVb(;W9YfeXH7T9F@Cvb;i6C*-53Loh<51`AW889vL2vvoQtH-NDZ zA-_j#!8W=J3AkYerofW2-kU$hj$hZ4pGDUONiMyJSp~e`#arA*u|F3>lAr3|pE@wW zFj(nBuxuMx_;<C3+GFioTKG~%i;dW98rwEs)iwHyiE+e816Vx!2z1OOx$Ff}Z^-Y_ z>peIu-uB6XH6^GMO3C2G#zxoih2suX^;qvk0OT03g&tqN<OCRJ?3HNvFKJgj<MO4o z-icKgvc<>-L>(`5=EW+BBh}Lki~&n???1ZBIgohn-utRz1<~dv#6Gv{@(^yaVjejv zqxls%Es&UtEiVWJaj%F%%Nh{QGdPo?-aB>dJchK#SWoPitbY#`a&jb#{0gL03*Z(L zqa`JjoF;?GfZRe3;STkF_E76vkW@%9wUN7=Ri=QGAMWKMQB|sY-w(TcJ-a1+J|UFe z<S~aiFDf~H8-1i?q?y1)1Y<qg2LNuT6A+^Z9Bkw9ewq!UUGOIluO+?cQ3lD*&&uyC zEW%!0&3r_7e;<>HG73$%jl3}p-7Xs$y*GD^VbAS4((W93kGS_4zQoXIrf-{kib0pd z>#;#%jM8|jpN2S|)}Yg7E5kD2<LfMYkPS1;I>@qIqHpJ-)g+T-xAg-vG5IGfpP)}- zpkD#~tk7Zhft6TnV$@zdt-XmSXe+5th<n++00|t)>^ogQ06cRbA{*eT6xgbBFI18b z<Q#Z#Il^-mfz`f+FfrN%{)Qhq-eol2?v~%!BJBvH7=j%+2<<kdcN^-3=)lg1iqplQ z7(`70qu%ZYDsV!5G#mw0gQZoS_wkMI`T`iAI!iPqwg^EI*;qNRIs~6EIO!rVk;g{k z4Y#S530I2ksI5v5O{xf^?|A6%ai>dB@eqh&&ti*ahSrV8>-sYEbqELHLDgB`a>H%u z*T3O%7rb4IINRh<Z^Hju;EW%3x^Z<3wjX(5L?EISXDg07E6dBfySr6CT<QkxD)W|q z4`DA{Ut^naoga0@@?aComjf@{jJHOMA@ibMG?2hZTbqb%dOi?CHR7AggZff~f_XPs zCfBwc1L(Eg#&{Th29mn|rHL}Nm<x`FKB0&&NhN+sit7k6VwW$;FSa!CmoE*D!xm(! z7Zw)iJQf@=LG*JkA@-kp>Gqs0$m1;_^jLtCAuq(|P^2cd0)M?P(mec7OyU5AA3LE5 z0EZYJmm-R^tb~Tl8p$lat4dw*Bb{!$d&7srHcJIm&nkbpzCj8wr2Z4EMGz9uCT!g@ zXJ98SD1BbfqnyTj2KC;#V<zC(0KcTZ4f5#pBK;@S@h;xtJK!AC;lH((#%HO7Uc-ln zpTv6KIMl?;vH28j;aZ$|s`2{-rTRHM%OeEQSq8NN%O1jl!q;cR#nJNuv+$fK3zRS# z(otAKl&}?_!)gPvB?x5>vhhT#*e^*8{R6a@6O4&gnr%|mlMMe+Je6dhqCLs>PcU0j zpdXunUHW%cL?D#IXGwh~1}nq90P6LpF$=KEfwf;wto}*rsgpaNgFBwtw!hH%xq&l2 z#U>ML7HIo3{o7h-Jcd_c_O=O%k5ymtGP3W>qrSCK->Jk(blTyO{uZp;383FJC!{iq zUS2_;d6AlTAKy)_ckZpdckf}(9ya4a?!&teA0cBVT|+M`vk|G;2>f1Q>G8@c2e1^q z5>>lFpuS3Zcg9bzu8)nBvpCNyL-WTxBsmDHD=aU^?!En6Qj<wj`xqt7<lvQA3ClRi zSUL%Ztu~|Nn3J|~a`H;IUZL7+M42b3HBQ>8q+lHug}+HOYgD{X#UvG9N0H`3Xd&5t z8M>vG%-wnX1A1o3y?N>M2ceHmdhgLzJq1zh58a@v>H{4nZ>;h?`~eOBIt`H<1djuh zInd!}6|^YP<>2App`QeRnw}Y8ZKx)BW+<nH8U>sgy=VY^8$}a}YufPKL{qd3P)+HE zK9#Xis=5IX)H`!borzC_=|(7stR2}csmFx%Nqb}9?H2rZ3&GR(Ac>GZV+}!#rE*AV zM&?K|>7+WvI*<yPHb89VH)6nZ?g2fdmgqL|Suv!wOS3Z1`Yacw6c?meW1zkGKZz64 z%wW&G3t!#Am~^xYGU)Uk?SjxqA3K0{Lw8$dqIRLLRWf7oN%I>J0g2M`!!+vvQ{f2r z)RPR+JiF*3v2xhu7vlv3bsl5+QL<6wN}&hIv0Uu0U^<EAk&RM6uvADysQ(}b{GUy7 z$i`ejRGX7#$P(94CopA(wFE{MM(aL|6EgJZkq<G7f~5!fI0utki1P_Ww#N6T5A4Jy zGfSqDj1L<`6iK0PA8H2^NuB^#GC^a1q3?Ys(cja)(4TyGP{f)h`bDg-loVkAONj+j zmdMs}Qj)=2`Cu}c>`#)p=Kq$I4@!V_CFF@p`^X)&rurw6(s17Jk74wtrNP`A7`>DI z88YvPT?(?-lpOn1GIgk9rYo`0pQSqD9HW04BTdl`j*lCk#GQgP$@}FoJ<Rj$Xf^<I z`co!Zm0>_!#~l5nga~RP$)46|PSJ-WC?#2$|0)eugPnr%XXtSj6hFg^GjJ0nTFa+! zH%E7gZ|6Y!3)y-;DQ!xFkMQ;a@r&q*{{&grhKAWd)=7_3eYZC;%nl<F)ibHE<|)tT z^;X7FmCO(x0fx?!gN!L97lHE#LIPg}2>03^VCtsd=uKdZVN>tg9Wvd72vux+bRdZW zpY5LN)m|1O%!}UHN85g<Lo*@uC}cj9z!pNh$_p~Va3l=RQIIIS4*w41ov)%uOH$v5 zNe@o;hf^*m&C4x`7y%B{W`_(d9~pU>zCiwi($ugK%9Jlqw-d5k9qC6GX$@LQS{S8Z z`Ar)B7SUO9wIT&tYDYUBeX973c^lnL?hxTiM0k>tEMvs2@+}swKM;0RP7F*Lbrrlx z^u>V@+@K4pv_LD6Pg4^MO^Y~-QHqD}Q-}O;^DvMxV&Qgb^qOhD=XdJNMRrJ{#$42m z<@)q6)v;REq;JpKp;BG#UM=CjF}h6nY6yQROOuDkK!gXc0kDUbS@IUrKUnY=HlF6; zFOa}6h^mYhdTJZWhm?&ovQH5-Wl$o;arT%sK05aZ7?PVNa44-CnMMf=O@1vgk^V6@ z6>!V)Yn15e>jcYSCkTug1OX+8#LXhYL6ceEGZErxDn&GSj&QM+g>|#Yy1~k5tsFAf z9ayn^qHIWh(DtX)28)8+Udv|oSxv%5vN96`iXTgg;(!7-kKZ-MQ~;Mhmup7y6)CHq zv#A3cA?pd)QLR6b6adp;p%eQsixEker`Pz0*l#*Dz8&CoB>P0qgmUl_o(+_}qD!2> z&k?!)xR;q1AfWI=W(`TxmeBAGH1H)9tEq_#4&FtzQsmdDnUIgts!ggzRFL5Cc`9B; zk($UZO7xTF1~--b&(L0(P{Bt?gnvi{VHSyA(hMzEiM6F<N=f5{`l6)%kBFS|@~V(I z!y>%lwpUkV4t63IK|ojrm<4Z=tttFb7SWb}XHZ_C7K9$ho#xS@M)?LxSLE@QV)d6Q z-Y^GV9{xQ>^6M$mUkCcAEh}rl(udSeu}Mzg3Z#|q7mzAOR#B|SlyN7NKxs1^AzVih zSlxVzSOTuYf$JzC$@ZCY9OzpXz0W{-kcIoW4_u$^Pr`K~3nBgnV@)9ir}a-9QWnWn zBgWJHlZX~(DBFLCEE1f04x*Gpo+H;kMNY5tFRXBoPvCL|;u8KJ7<2XzZc487v|6eB zb_NcGc9HL&O)>+AV)V~pClKlIbIgC9*^~rtWodSzY?U$UAH)}uY-{o<<yZ?4-faH` zHbH%`){7A1Jh(FfcV}&rTmOWW4vG--GTc64D2v92%h&oZk{e6lBKyuEax;Je5d0*I zK7T%3vs8o0wbkBvN|8|VpWFoQffl=+r8ruGdGji%!8dxi5?Y}LlxsvzqTRt|vh*U0 zV&GjWf?Pw%=J)ZjE^n2jdi5?2$Hncs<FXcRn+LNj-6B0BH4<cj2FYRm7pN=UxirRp zN`WrWBTD0{^mvDAFH#|0OE&b7Z&N<xDYd>u#SJR1ph)wS$RrP^JdFHF0j}<W3z^E- zmsamRe6(J_e{bz>{o&m-+jir|7JrrcW;c1%?W9@c`UN}|?MXT>>4W&^G{<*|F5}}S zofAT*WWKk}rMi<I^A!}8vQp+BPy;D*YAKfR@6#8(nc7XCBflV*`PW1x!xTnOv(h_D zb>~v4zo6$|(QLUkrP*(iW<LZKY4!{ft#liZLDIF1KMQ_>{0PM_Xhn2F+FwTWLViYh zkRqN_ETeplN<kDcj`ge!I5O$zVv|mm-qHq;F@TIiMqzq^>kWBk@?c<IWqRfKPUNF) z+5icbX7o-zl97bGx~dNDL`D$>(a>AYMQB}W7Os}0j6XBqFu+lu<vG(v<7xSM3^tmE zkPpQ=a++_T63d%eBs~b(&oJ}AfHG!qLp#2YHGyy88(HqqVEMC@R>j51Q>3JUu=N&F zstIlYDuuOFfAA%7sb;+Kdd+z4)n1<53;{{Lhi0Wx#7|tG5EAJkbj#xot|9!MN4G#^ z?(20RB?-GY=@ddgBudk)1UnT=p`pw+wPiMZ+(gaMgp-3CRYc{DZ5KKHb(-%PzR;cB zF7ZWWq9H%<1Vxj)#4|X9qNpKe8aV_~33^M;y@ARm;udvxLKjI$Md$e(%oajf6?ueH z5Ep}R1(G_(_sB%j9f|4wD;6<IG?Fwp?jSvJB$K&<A3nIav^;t%xq^%+G8spkke?l9 zi3f>R*MU^{biqQm|D$=F=e}fwe0)S_5ip&c>u6Of<>LN^p@x^K6_wE*!qVpqx3T}5 zh8h@hd2I{csEgYmQojbOsJmI(&wxpTTeTJEjzjqX+^_+fJ5du?LGrpyC9k6Z=4W%5 z2-@^uMrD%x$Z+asAv8{aNP|W|THA3q@S~V6u9GR}BO!@HNHj(sI*!J@*9IsH5q$yT z!GB1_U!fRW0j8y6C#O&lnNTi~(Q#=_Gjs&sC2=KVpiRikDU2J0b?T@cA+lpKN?Idj zbP*Mj(Y=clSwESDlmZb;3C&PqkzDep_P3N&>b;+i4rN^({*VR7R!#1cDe+JiS}5s2 zimiQhG{W<Q7yft5*5hN2dARcbIDzrBlrcgKgt&?S12#Y8d-?cmM;QNOP(5QN(h_mB zjvEvt^8=5NpCF^ASqN<q&>S}v$7n0&`YQPa0_6~f;lIOwgoe~clr4W%1q)ZK*FWvL z!NA_->U9=1&^-C*-G}!ctk>7?e)GZoJL`9O3msL8@+#GymtMS0557(XB@>mmCUBmf zsK0l2_09+P*X!TBvvzOw?xS`7DN)2!NPkYUDWwz_1%oR;g)=Nfq_`bW;Drn<zf1)g zP{~;S6RM2`R@MlX^V2BEU5hG;d<Op5$QZcwo6P5mdcKIi7wzk4H}aYM>-OpV>%~kt zb1{=I+b3n;%Ei?1BN?QpIl7*O#>!;?#CiPhX^J%zsRh^rZIqc?3071{U%<_TG!|mu zJn*Z%K>k=ksiZ_+qr7fffT6!H?||hIN#KQF3gMos!~dD4$<Z{3ulXU({7+QOQo9vx pwD8+Tx#Z{ZA<f@VXMKybQQm@J`@=u^lZFeXJ&ly=>5Q45`aeXbW8eS) literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..04c57233032833d89ab9fbbe22734b10ae6eee57 GIT binary patch literal 47962 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 !~j&3m<FYYK1+dxqSAcrN*!3^4u1NaS)$#~ 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 =OngyiF+* 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9e27d5e834d7d5a88e241da6b5208aaa807097b GIT binary patch literal 20434 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc2f013d5788939f64782a81f571b484397b8868 GIT binary patch literal 25370 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 B1dadz literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..770861d473886336e7c7a949771c04b67607dd09 GIT binary patch literal 492 zcmX|8y>1&Z43;yb#syw7cH$bKIn{QJI6+Vp*)p^U&`tpYK_}^KIy&hf>dtZVM16-o zN!GkYrt)kw1W1q+f4+~pnM?}7@>hR+I2{S`It2fPWATlZ#%!#(7k2bhoE_;Ce)t}3 z=N*BGEjkNziVfWD@;U~X17#hoP8K{?Nhfsl3F?>tLv|@>4;?v(!SBkVxD6J2v>j)S z*F-#%o1yN4$ruAi$#HYXISgQDrK+@fY-7r0gJep8Tb>%MvqeXG<p2qC1nswaM}W;x z33-iSMZgWj&H?SboF1IK))|^TpDV6(Mb)9t=NKeq%M2h^8)q`X7QKhc4d@w6eLz(f zKh8!kAC$7uDD_9ABR<yNygkb{VXw23y-u=@-nvAxNwV4~wWLM3=<OGy+J5#q*UQx= z`Dwklyp+FWi!JZxGkSmi)Q0WcY<>^Py{ew+#w0CLW_a@bAW|s|n3XEq-OKp;K<Vr8 I@Pn-4AAWeA6#xJL literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c241651c5f5a28be1429e708aeb42627f619439f GIT binary patch literal 1089 zcmZ8fTWb?R6rP#gO*We}wBQA-$Ra2PY}Z?{g(BMGgCKb^pf1R=J2Q!!?v0sA+LY*n z?GI^R1i_!+Kky&St55y~pFFck@iNOfd*;l!e&_71tau2{xA@w-?-oKo%;n;^AUp+< zUx6_cB8C~saER+a2??{9&76@HTC-KqH8MMQLI<PQsJLMx-Z=2YON`9NI?QF(DGr^t zs3339%;n9n33hkD&IP-VOFPV3Su6KK4}3gkpQ5n2^zb+yx5GC0TnC>H_<Uaaw3!2T z?S&m9uTXF0IM|EnK~)MR{b4Emv|#BpWs^AbX%<V#r5_i}A5IFY(z1}7KcPj`*K0JU z?|C#7Wgf|LA}H4`jk7FHGLVLn7qn!&hXn!i0X5tlKn@vsA4pyTHpjwcxbhhJK;~#p zt|F+)>T66jF28^nHmg}QOd+bncrqDjiytY`1lOAVIt(h2PGiM`X)J<anK3S8kc%K0 zN71(2DjrYSBN|oH2lv!)do&i={o&TmPA~|nwAx4usi5kOqpCQ3NXN%USyMFS1uI3s zQmL{u38G{PQ;?^UZdS9pu{G0%4GiH9?qTijFCn1VDB+mDX}WIMY>+~8r0|IWANPAi zd#S98C@2?gc!wxfnT-E*D2$gdG1h@(jU@gjzA2!NzYD@ee9@f)l=Y3A5OI5s&Mal0 zIp^pcgTBGAYR=IK9=lh7f5OZFPx{B}{HWqo`N>Sd>|rCM5_kQgRQ@g5Yl#k|&`$lR zEqKz6#iZdfllt<AD>EyQ70>IJv>55uU{>+xLX<+=3PkNjQ4!}niVSAP!QB3D*|c>N zNSd4od)Nl*5*vUX^j35;idadbNRv_uGYF#r_(5Z(c~#Fxw_oIDx9i+BhPu^<REt{L zw9GQ-)$DbRy)Y?t_nA^6O(tq#_E%Z;)|qi=cQ-HDB;!vSaFaeTo4D8|o<;B~?&4L4 OU>E)!(zS^x8~+AUVhOJR literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6febd5ef850e086512344aa638dfeeb73fdacb80 GIT binary patch literal 21405 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 O#+lDMiCU5uRQ%uKX&vMM literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27bc6ffdace53da796c99864f541bb9507f8bbaf GIT binary patch literal 15870 zcmdUWYj7J^mR@(G(P)4m2vXG3veeeYA|w%%C0UkjSvEydHXVuLinJxul%XbWlLQF@ z(Cvmq!i|~K(mR>mY-XHIB{em>*?^N&rLtR<OtSkUHJQw>JSvsVW;5BEZ1s=)NVZbz zRBH36sno_*smXWF1wc^JOm?gCCm?bA_I*FjJ@=gN9Ng&dPigpk-#zkRzNBgYkzP8V zK1ANZ*Z+>8X+m4jgf5J-zM%8dSTOh*TZr+~TrlyBmE#-Mg0+!YNa)&Dnse+0`<_-g zYHD6`JtY@)js7?%wP1gwRgC+ZFhyKgA|Y&%6e-as(xP8vR{9qD#DK_trY)pBbFE)~ z+cVZOtpShUw)Gu-AzMk~&1enoXxn&0{*V}4H{_4Rke3zvgz*c;VXd`qM_ae#kEkT- z4|`e9+A(^|f3C~4K)Tr9TZ2-2>!4QbsaiM00n|G9RIMA&t0fMJ!<fl_Z~wNoa6lY! z4~iGWQKTI5?AGBOZQ+O)YrP;|#H@~rW8ye+Uc{`AwT|y#wGL|w4!sFOI5ek)mpq43 z5x#U-JE$$3;JKYdnNw)tbocFLyqyt-J0gsQoH!v)qTRFNlsJv&Iq|YMgXeiMB64_+ zinHPzo_TRzjN&;arbJ$heWov55En!ODX)lE#6>(Wic8`$o|nW;@v6w6#AR_sm`Hh5 zye9hbydtiOB%ZH%`E3oOetkJ6-ViC2yxNoUrm&Iny0|7Rlzl_ICE|F#DXxn?Jg<qj zMH<hy#5-af&+Fobn85RG?;SC@ZhUUYU-#bLCTcR~wA{Om(eYx@^L;0%I<s5BYPE94 zcZ$`@a%rV5-Jn#hIHk&RRc>%R{{<2HOwNd`nkz*~Mz-|aa?K4^qx~yhP*61stA*uK z*{ir4UX<xce(cI<VDG!H>TS5|9#z?`XHz+Dm|LJ&fg1FqWGBau(i|<j0gW&k;y0c| z;jt%u3_i+InqOS?HoSKA3`XvI-H{e`ni4+rwDFz5*FS+^%MP><M`TVjwLr%)JgSai zsLg3Oeh70qmO{o*HcH%?o076Bb9!XbSpSYD2a*0|I98LT$8O+_Ve(_k)w00A#x~^G z(psT#)ql0}+GBCKSg1X|cp+H6y0RwAuPnd%`s-u!W3^Ikv{dl}w_G0GtW};|Dy}ss zk-wN<MO5XODEUFTv@}*&a*OM=stm^bEnjUyzP1%*3ckDS6*_xFv+`+<nr`T}p3&t# z#3Q2;EF@~hrFy9>N`LZ`pZuf|U#t}uAD8|o#WRR=)}p&1u3Rqt4<r_;4f^a^v^)|v zM}$79J#d;@psndGgTq*03M15ZVmrFDL~KrbWZeV*!UD#zfQ{6g7u0KcnoFZk#mm*A zTaFU9tD;`^{P~-?cw|(4nMDtgRq}~cB6F=;szm*T*}He%pPHC2+!&vm!txu-6<&H3 z3{j1Nl3%DPy5O0-fyDMYr1V2r3Hbt2Zgyv7;Vp?Tlfthc5@`N6nEUD*MiY|`Vl7j| zgt=pg_+hQ7hgzs_>rEpxTHwh$dNUTr{ObX@^S1u;dKhaZcC>G1n`U6QlA*by>l)^- z{hW3egcPLYFJaYeUbQ$%^o4Qa=sPj=qu#*V>Fv=nYW2H{^fEJF;EDkWM%Hqv0;-Di z{1>zxl7dG6E*%t?R~o~6UL9`}YwhD0r)yQev{|T0oW9K{rQTMnIJb#XrC6>DuaW)K zmqi@)=Ge4KiTY|dah>dePiwNe<`sh_*Y}!Z`T1NrN*2&3QJsjA((|iz2^J$?#JD26 zz{jvqh%D*X%B3JOY4}lQ-1j|6{DzNFlyv=qAE1d1RGFK2Z|e5c9IBwn<r?kzNAvI9 znJL`(VEWc%6!X0xXL0)r+0H=#?<lUjE8ao^JcZV0!KP6$<>-E7DW32&rDO|U#ji`S zhxP;}F=+n?0?jb>w4MdAr0`7X!@7wuqYoMK734P3i=U2s{K=;e&c2;nY<8JS0$C(2 z5RdTx070M;?+vvUBm$g<qliH!0LADPD~N3~Ew#)Yt!Zpdh6ZTj8qt!_aX(*wbYb&+ zNT=)6qR}*)any~6G0>AC7amRG&7!w3&a^UlPkVIX9`%%<_H}LZKH_K@^=~y}fsHpK z#EIP2e^L7j+A`!65&O(;TIi#lgObO(J#pJXvXu%g^k8rwe;0jxMwE<`Y|cc9m2!2- zE&JWs6M@pqiOcw>5TIq;%QV|i|2oMRN4}1ea~SnG$Jhb0&BbQqag=2`26@L<WVK!c zt=hPQimTP7waBE409i@!)RMad4$*VilOQ}0Xwj2Z>Q=G46!y*58z&0hX3edLLVKk7 zYs_f;>-lb_Tp#ae)VE3$2)d?QBwh-<4L^#5O@Z;)?PNbnQK4#$%1GjVQAT<j)yH19 zqA5zn0O#Su@w<h)Q?s`~tM#Q^BC-^ZmKSNFZ&J-fr!Pyj7sVgD<+>+dqY`wL<aBw3 z;)<g^HIa{y!z--m77?gn8APZy_<RQBYUl^_l$p^pM%o(I<rGSPK^r5FA}G=}(T7sZ z_R~Lv2$KZ}17rb4-qJ&2;v_c28vkgz;smRngELyHtT+$p&U<*?X)isbiFF(#r(9b1 zoKJo5lYFp>a!uz+DOjb7DF>foRf0X#sue+P@O+(RS>524H{6=@khiCRZT27LQ(R|y znR2D)lzgXBeO?piowDaX_P7xqhf}W<SKZ2rC-SOW;*j*&L!VcX@H6OB5A-zy6q~2# z&!*X!yo9#o0R&OPt2{2rY6Wt_WlDS%0Vp@MJF#8T<-PukDB!0NXuN;4iz&TvtN^<4 z173;e5v?KLMh*E6f?SNRN%<Zn^imHeF!l8HwDt=q=F_fgRyrZ4@$Aw=950kJfv-=a zr{!VR^m3@TbY>+-z#w8x6O4xz=hUMiFd!|AUDF;7wHX7+NRhejZTa$bw1JzvFK{J^ zWqdYLRoYG!?_^NnD27l@qQ=uaIt|(nApUTjze;0ceGJ4t!~`$zAZ^bi=sxF32t-QY zt)VWobz5c;*CFI#Z@0B=13dCZV6<W&a^kX=)zkuWEe`%`$(x8-tpwfQxXCGQ2e{2~ z^Mh~UXwalbz;Wq-7&PfPU#D^yo#s+JDoG=e=P01HU=m@HP?Akbai=<N!pN>bq@`2E zdy<RG3#bs8bQGc(PK}(Q27cQ5Fq5OQe;uWK+H?)~m5p!O7zRP5^&`6c0IA(|`ZFB< zng6E@o)633<00oTvZv0)Zz5?gGe54>5}XO}$^ZMI;HBb*dk+OC@S#ZeHuoFUn~6Zv z({cGBo<(};e28%{LDAllh|3prhEytgQ<vB*@}z?RlOtZBHkw%Z(-gh0z{kN`cI)Mi zw(?sj=M%Yr4?y&g_Ymujfks9b8;{{v5K+Q5L{#wSCaI3G&zQ8=Af!TcxY5p!@92=T zEgS$%UL`#y1mQwRrEwFP+bA1CY)wL#h1elOlzXVk0cuD=5a~m?gwRBq6zT)oHiUST z`K()}pW0%9ATtwXl$iFx+|=D05YD^9C;m%QpgH-SB~-e?8cyFgaQ?7_U>v4eI1>Bi z&rv|P64<8+2GYLsc|CapZPEwm?EGVDmM=A8oLE{)B=K~YNIFINa7Kyo+1bhQ`SCCH zuSAy8f+I_~@(J{d0X2u4cgJr}-Me%5&qaw_r6uXgtw#K`$e$K`g*L1_GxVIT2K+8Y z5XI0l?>R1g@H3mFW}-1kd^Jk9HPiyB*Eut?aZx~v!$=n>+ob41a#=#sc~X_@Pm@f# zcV6G437<fq;fA-(6vR|hH;t4*5&&WphoDMNxq?#NLr-McRdi0oh>nzCs_uIM#s*Q5 z(jX{;%j=*fTb?DhiEkWVD==uw6cqKBV&BX(6Jde{SO8eUR4UHqcS2HczTHfQNhnD6 zj_xlaW&xy0g5owGEkbchgh}*~3ITV8sg_NU){X%d+}BKpX)4RlBw(&2XuMzahy7s6 z-w)FeNc+Hg7q`+uDolfN(}2!SL1*uS&i-H8I(xcBHT!prFixdELizg|>hjy8#d}(S zc3S-ei8V7K(;WC*-~3UK2{YTe7+5y}oBRi){2&;hlu7M#{lRyeS@fKR`Zov#FB=Z- z=%4Gg_d`>~X(m{$Bx?RMH6P5bPh^`zAr!oI3qV;I3{wAxsn30tuOr>!^j{W(&7sO> z*cS|~?c<ccMKLOgat~2%fK&e@%wjc%s9*WRkf1x0PGvjyha!p6rv&;tsI^=EPuy~r z`c>)ezOkmJrq-glFC4;{{~#R1sE4sb+-7q)926!}_U~xi$3C<<d=PWTJ`7_thP;Uy zSdVL3<tw}sgP7GIcH)HE36u!hdof76iQZ5aP-Y7IK<j|FFw;5^W=UD;&WuK~cV>H1 zum@SJW}-b}ZlyBxY<r*UbTuQ)+|xGmVZ3#arI!<+ul>z*a41X%gWCj-{js7ojA#Ef z?Q`SNALByTTZf_Y(5Q$l4L5#gmJlSzb#Av&t5HALDtiv;mTf6@+#%rxY5^Dp!D)e8 zs*sFJiVKh+Tv$%cElHoGSP2FtD-cc{2g0peVHs5^0dBds9h9xPP?H59ImZQLNAkCa z)`bIpSl{p}!Fi_?piOQ9T#rin0hDH^ik6*<_oSyiB@8!CjC|~lHpWL69<-kqMqe*H zIG0=W&%TB4Nd9cD@#5mC#gUPZQ3ypJw4Yq=Y;G~vcwzArl;7v(HfI{~dayitH5!0k zEvqYl!aTp|);!Yayh^c3vVUZG1fKa{>L(*jX@8`dG>lWHzSK|UVv#j*^Vaygb6~!c zDq>H}&T@>^#QB?1Z1$sqyopM=BatD2UlgkwHG+wtY6-9CM`pF=RS1u8MY&V~j+g?r zCIg=|k|<7kOf8DDipdg5lxXWRQLI!6qSS}9X$qS#%Ro=$`{*l*0p*kgCjn6KTv=QN zuMcGJB>+K{T1QU=UyyRhqF<CM`Hb#WiWp+OCa^BK1CdQML`1?OP?RQtpEcZq+{7Cp z8Ay3$&)Y?MGexz6Nmr@?NA%?=u4akBB17MZ^h%^Zj?7@A_LvpPXi#!bqT7eBBoq>q zqWE&Pj**+B_(pMeIUs=PnOkT8C<}q99r*U&p{oDO2(%=rEh#9W>iQYN^^<}UY9Q4l z6varBf@&C$L^H+#BOOayrh!tpu%N1PDMD9Lh6RZ=jk;;%Sw=>;VnZ>gw`k)K_dqRV z(K@w;GWeo)9IeELs7@@U%Wq*kdt?u~fG6<vX{rHKYSQUigi`9H-Ue}qK*qKq&x=@) z2&^@G**KszwTdZB;F_vzQpC4``=JK#%$(J5?(#9_LrG#goj5w69UhU7>`pYY-KElU z*<JA)eF_H{J?)?N<v2zIItoCaOHdd_@!BK*kmw^1Q;`Hv2R8tjEz#Q`z_7xHQ+Ma4 z0f^1LcjxZB{5BOO`4FPgfa(Ftl4RuVDM3OKLUkJgnbJ8SBVf_>ES_B<pM+4-uz1D( z2ob`tn)+5I0Ez>E9C{Pj{QF?@1}@xBbm&*Q);KSai&cvSPz`xCZ$f-Te9b%n+Y8d6 zF%ddSVglCH_zG-V%CZ&2(Z0ELBCtYpTL*3$4-#O=?VdV9MNgkU?CBG&_w@O_KXsqB z{6i9BaD8gRx~9<SMB}yTN+~G0<x)f82^$PZ6Z3Uzz&(NO<J>xs>YUj-bJO=72zrDR z<s11@1#G?~+C~-T!$9)cit+{k2|}&N=0Z%#ISuI$Y=e1VBkqix_H#2)^2V*nx%bBJ zPEAI3Czea{elbNyiRnAckL0gmPvqaAfP`vUryxTCQ4oMp(s2kqQzn*3_oCQ_zY^JP z%2<_jVxOXms1Jf^2^JW_hwl@8yo^Fx%wj}I!Jrxa2o540=|gm+@kELVUFC11WS4w8 z!akD^X;J|W4Idrj8pS~bSaOr&>PXS@Cy-|2nZz@NJSqdZjik+%Ne6Td&^pv^Xd)=p zk0Y3AocmL6*37*8Rg47J$@GoMskwO|-`E;;@}ks@>6v!AB%wM=PR~r-`e1Tu_M?Ug ztBQz>xjTq?n^?%H`%_V(eflB`H7BR<&Oi;I(-$3j=4cjX?i42P%<mrSD1n2?41XVL zs1pqsz$?}RA`yUow0lo)&VbsSO0}Xk2$GfN)0S(oG`L<Gn?Zk)l*q2IPeY<FZ^W-7 z0&!l4IG<K12!wnR_ZjG8aX+@X3BbpI;BAJce_<BL2CxxAKjL9rHXuad+zMd95TdMR z0zzLr#HKV8IGMxX1{SzMMTvasT!#tp3vBMA6A+kpTRI^uq;qRKI^~kcg$+&Y3R;R% z^Q-?q3tBUc6DI}CEEUgTS!s_LbuQ<Spp|O8JofR~2hK^{z25Tk%OQU(wJRejm^>jR zHdOiu*d)s$j@+WOOB8%cL5Lt{!$4M3EFr0eL*j$Y9U>;bK_$OQ!RHkGWeRpN3sSV1 zw|qtvH-a}UL3cde^<+{syEi=F>;y*R?ly6E7pW|L_V5D|op1r4qDz%Alw*kT2?sF( z$#`@=h~wh5aUp|G@a2nKoO&2NKqB$RvFBX7wXF`l<duGJ%udLY=&6y~&B`TuE?7ck z6>8eOWjpsL*}>@Ye0mXx)&5Od1jcG{U(&5fsC##!D6k8k5`+<ejS;>`N+y|=b9&=^ zd-$%yriETrfu(ykTm$HaMCj)MhqOga7<xUSa6~d5^o*?whsb_p{5={VBO%6~Va1R) zfiEMc9i1NoG8$)p_JByT=?q6YXaU$3!I@D)DJ;F9%<fPKV)*UuP-62%>YqOJq=n?M z&;`>rj~Q~9I6gtE5XTHMw-P8zizaB{jK+7n<Aj}{MyeI|yrX5g<g~z+b4Qu^+FIGe zhwAm=L(;owf%g{Ub<UF(207Zn{r<QlJi$8ElTx|NT9w=t^Kg6!uxt0hQUJACgq{Oc z%<14gO3#`Bg!>9+$f&ElPO&Zy49NZhCCnj!D#RwLo;~G5M-tfgXbp*lYnDZa&M4C2 z(TAShg;cag&>kc#fHP!Y1Fe1BT{4zW_ZnXyitG~HpJ};xRd7$y070RAl)AH#-$&}x zQ=u9B^Da5Wi+JS^U0{?)=$Ze0kS$3H>o&CVuaz{H4iAt`k^x9+z!S(6%MB);ae5cl zVG0xE+=Dd84_qhNu0wJ}9O;lFAiP3?KpfHot}8fN1vaiLa5ef9{VJy|jwaVqA_J`H zTR|V_6F5LXDFZ;Rej`Y?Q>?XqkzJ3=9|W0g>U$7U$xxuJC*<#OpF_Y!vcUjyh6r<^ zCq|P6a<kZJjpK0$)@hho;hfbpFtQ^U+0c3ld2R0#fh)Q@u6?ax)goa)z|^qi>#=s5 z`&#>9*x>%aNn_|`AJ7%xc<sKewS!_GI|O|V{T%|*gLQ*p<1i4cBVu?*r_}_{#bqz{ zuLC=gzq|QkaR4~pMWB8_lu$YmywExdSFS^0Vkg#qJKT8-vA%TO19kapn8`mBM=*vL z87n$QF>wSf*qc|m%?m%R%`hPj0c*0MG5}fZw)mfc*lDd}a0dgX*Gys@$Hh?~hz8?s zI^%9%1778jb6B&FXa7>zhjlXiuWg>^K2JT>=dou-Zan$~!U%96`P(bNA2*MMWIjL8 z><3D8g8C2pci6ZNqzH2i(}e%GdDL-t3p9R@?47Vvb^scmY@~$uIBpLV!|+VGOgwDY z@rn;tNB<|7sO&v<!B<Gzcs`%u8h0wr2bI$1d6WT@+wff2VLhM@TQIOHEWuItKEp^| zpRYD21Z31vQ{U_~cMqsT^$AoS08O{uqH|{sC==YoTxX+RTy^{nC^nu16cw}?2T%HW zGbZ4K=E?{dabP#VynJG!Z1*i!tLwze>oxA%bJ2XK9q?*3?cO!&nNt^UYx7&Us41_O zJ`$&QU0k+yeZy+qc)?%AoyxKl1Nu?6C$CZ!)j%$TD=844pm{jK?7F=ug}aObxDLsl zu@I~J7v(Hsjo8Kf6^K`D3k1}AcBYY^AWt4c@C9)^+zsTc0M%oBZc0I2vO)<-==SaR z7Tz2EqXaT7`sWs(oLdB3<}|XSB`BS;iVN%GPn_g~vr%&V?!<cv8>2QFgWVFSH?lZ) zF2~YiV}EZtl1CQ(@Ki2$5;)Vuotc}{?~>O7AU8NzP2HTnk7Ou26P>rd9^FQgm65Rt zR$zEJ;L!t!qO?>G6l$ha9=;uZi%OG@7$w?95VlINGa3tJkp<I9@rjTFRFbYUcwqSM zlF#-Zd6!b@)`;Rzq=A)@bPJG;+=-MN{0^0%Yec#fe3b%{gXwZ5&!@<O&;VpEmysV) z9`9|8di<w&UC69^0A$NuLh0Xd*Q&Df%9d9EWCY-lC91f}d&NRC;6JfWR@!nKOnXXn zw$S{)rmOGIBck;|G&Ys0X2YRK#mHkLV`LyUlSWO}9D>nOM%Eg_ov+|7SaaadF$9T| zls!Oe@f6xYJw2P~0AS?zkx5fN!D&Es0E$t|EI9yVGmSkedJN;4z?bD&62su`(YC`i z{z_YNAg;qlm-&?g0CNQ>MwhMBDS^*u5BROP9oWj!7N6-eWa?CWj(|shBzLCGHKrcb z;VB9DGaz8(nPPdQjL>%HxE-7{T1?(xNFPjCPc1gVe0L#6C<)jiis26xqf^Jz{R9*5 zT5u}@I)}m-X!7KyBx1PdN01gLNtARG*g*gjLQy8mmky8$w<K;T<u(mRKX%xPqt>FZ zU>$`#g7~VixjwZ*_TuDv%>VfS9;PC-ZTMerx39I5JKAELoV!S+ZrZqu(PE3;yV0i^ z+K9u=8*!WCaQ5c7DY9aaEHh#Vz5RQ!4~_{8TVe#edBeExb@_5=iTx;fU_JhMOwNjf zO;a2SV11%g*t-rN!o4kyh%B|o&?oFWm9yN=3*5(1ZfBBvv8Y75m&2U<BIgQm3}Z-y z)^e<yf1L9j&Tk0^(nh+~FJ8h*lVvaylItYwW;80?-2+%l*vTs2<(^gD6R3;aAPb1F zFYId#ij$}V3t_V#a?_AF1&IYVp2`8pP5W4G`lBuc@&0|SF^nFE#c5cYV9CPDr2s!> z$?miRxeu186r?z^*<BPbw+_-6#F-tvbx6P^94mZ;#*hAR|3i+r7WPxmJlb^A5+m53 ze(~}_P2_lGhs9YMC&qXV4x9!#tV8;V$zgH6X?Jqa+5pCMM2v>CliA>f;Arq-m?aev zbIF3f5Eo}KZ%84qg<+4HcI6Yq@|^ZhsI|%r-pBa;_r(RgU&s3^{QigHBHr_Ozr^o9 z7MJmU4DYYvJtj?Y1@D>Qn0PJBE(5Y9P_}X{w8d4<zW~}iE?#fb${Q%_An#3{$!t&F zEpZKbrg*Dqi|g2V3-rf3pL^T=O&qeW_5q|*@d;f1(61^%X}RPnb?jNyiO>2xNiz6n zi`E8AY2__q5#%t8mg*&cwX1B6`ZceJ28#}R`l5`44_{SM50GEDxsGDCw`{=e@r?z$ zoeyi={8p_5H)M3yc6L>Rg!n^jh?^pjsC|dActjkMZUmT3ijeXE^#CgN>or_W%mSS= zRX@*{7WiK7ylSHixBL1EyT!pX*DYdMc3ti}eG5o!bY=MtT=J=#J9BS3-b$Xu!Rfox z_qnZS`Y-vFGf+igekv8~WmnQ<Hpo$&B*_t~hxU*t>kt#s^4z=A+|VlA`=7Yd%bmwU zDw*>Zyel@jYjr(#C;n_7+(fsZ4u9WtH{d>rZkF3JFqT9~f^TpIcm%>&Ro@&fy?XV^ z-W2@CVAXX--d4OH1^p@}Q}Rb4U5)zn%H?{ed`XrzM_<if>V3a*dGt#DqVgZ?2(zTn zw}*jwdl*!A5ODh#WnXt^<jUnG7*soTus-9rC$C(_uCBYz=G7~OE0@nZ)0Mz0Q)KG) zmCN(z9f&U7VNz2imufuI(loZ9RNv?=dg&rs#<18W&UZ$g4lxrEo+sl%zC*jchU1)? z*-hvLTod|6WmMTCI>n)Ow9gjydaVvAT;0pQbEdadT*X*hhh^A?<<Q(mzJR~~PrlT1 zumY0*e<Rslo`pn7&7om;=E*Xz{I|GVztqPhNyPGBAc*wBm-^_;7wq{$hROOS+-H24 zy&$&LEAZ@xOoURe!VOk!tn#k$*`mu5`4<FlESR*tQOqrEHf*k+Kka`(asbS{TPqkv z!}@qp<R6@40XsT$dwk-~-2DQu`&)NDx;-^BUzi`i`|i|y<HFb+n`*||-aKOyRq4%n z@^J~S>g~J_)o)0!=3q39x30k<@%pTU1*jN&0D1mHSa1Q+w@Y0cqih(=uPOd^9eD2B zxoczXH<tBT?vAVtw^;SD0IyugU(Pq;EYd4+Kep@!yD~n@>f}6Gx^(qQ6sy&W5PJSA zPgc<$q++5yz(<rS{~HDWo$^hzbBR3=YsD*<RazWrS1tpg*)99yZiQsMQX)R)mK&!h z@f)DPS+7)|I2bA1b~{2JDW1gK{I^a^Zlw&i&L30tiyjlR)hC{uoq*pIMGDXtF~+LD zD!DTnVtePX`8lUYD_BC7{5=XrC@50!6$CJ3Q%lOqMU*8Q6fmOQ1-*Nq?ygj*3}N4) z!lVF1CjTHIUMyF!d5rV^KILsvUV<#^IAsj5%I{Hno&ti*qr`^0>B9n;8)VnANH0bD z+JZ^SYGhS?x(p(7wdx1tGXURXG*9!Odc1sO_%Fl3oHc}n1b$jTf-lnn);vm~Sf?IY z;y}tuw}|s%KaHOCp~%N1)zZwg!{i)D_8tqu{Sijs35B<e;TSCCW)^vABWsfNJcIO8 zu(7K+DHEg^z`m{zC4kdgrpd}h%mR{+)}Vl-^kXpinXEFHu)QBjkpC#`?TD+oRKMqo zny81~EF%R=lx0B4piy={bjm02W!FkVO32AiSL)-g@Xj#?JqcU?-!xZzVL9lUvWSn+ zm)jyojLk^`*WsxHa}~)=Kxr<(EJda%@=i9`wr~;HAUq#Q!l9q=z!(i96iKi2-t|{D zXP6l^%+vlGP9v2(?K^KdCr<k(;G~!IDsZ#G@8Uc~Bjm&jH($sz0sNZdK`Ef$CBc`& zrK2gl&7bb2+XqAf)!2zyk70_Wk!bocY++iL8LZTvl|u<NTT*_ZHL%NadnQ0d17o{0 zFJPneLy}G&{oDkO4X~Li7iWdABLy~8l|otyjBRHpOVFU*Er)KPUI7Fbgwod_fe^wD z>vm?g?aTNEuS{cD!AKp6pq={CL>mcjV@vAigbIRJMWXmD85E-Ahn*jC%)l;_!sI29 zxupGP&sSa$hM1Ms_Z(u0;&4MLRcu;ILXtHQDg6<FTe=)Xqx9<|DpM#h-Oc32fo>E; zwOA;~fVyHgU1lmvc!f~|7cRMA6Zxs%`K8rTu-l7_`leZyVl#Y{o?v8(ox>zGjD<wQ z`>5_epdd@Z-=~1wIOM;ffc4h@MKR_`FHnpfKTc8X6$H`1UH3_E)5>n(Q$9QWPf?5+ zC-bx4rB?=IzDqHp7iL@XcPRD)3jP%Z{}MrzDv)z7|8$Q1%$1k=2b52ydbRc|6#Eth z2?_|gVau{|GN5~zjZKowJZg`KmeoelDec)yqHEp?`7&iZZyW7v%E{t7F>-b$GJ$`n zzbxY)*j2EqXa6kI1|u6b)5bAiA}91=`o?UF*pNL$7>a$8C?d;r0mr16owaSd-%i>I m`^D5_yU#vqXH&=Rv>mstq5dJ;{;Fmo_p91T8*SUbYyJ;<^T9v> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0a86a97424a4691c8712e25d8ed76b8e5a7cc38 GIT binary patch literal 62735 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[posix_prefix] +# Configuration directories. Some of these come straight out of the +# configure script. They are for implementing the other variables, not to +# be used directly in [resource_locations]. +confdir = /etc +datadir = /usr/share +libdir = /usr/lib +statedir = /var +# User resource directory +local = ~/.local/{distribution.name} + +stdlib = {base}/lib/python{py_version_short} +platstdlib = {platbase}/lib/python{py_version_short} +purelib = {base}/lib/python{py_version_short}/site-packages +platlib = {platbase}/lib/python{py_version_short}/site-packages +include = {base}/include/python{py_version_short}{abiflags} +platinclude = {platbase}/include/python{py_version_short}{abiflags} +data = {base} + +[posix_home] +stdlib = {base}/lib/python +platstdlib = {base}/lib/python +purelib = {base}/lib/python +platlib = {base}/lib/python +include = {base}/include/python +platinclude = {base}/include/python +scripts = {base}/bin +data = {base} + +[nt] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2_home] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[nt_user] +stdlib = {userbase}/Python{py_version_nodot} +platstdlib = {userbase}/Python{py_version_nodot} +purelib = {userbase}/Python{py_version_nodot}/site-packages +platlib = {userbase}/Python{py_version_nodot}/site-packages +include = {userbase}/Python{py_version_nodot}/Include +scripts = {userbase}/Scripts +data = {userbase} + +[posix_user] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[osx_framework_user] +stdlib = {userbase}/lib/python +platstdlib = {userbase}/lib/python +purelib = {userbase}/lib/python/site-packages +platlib = {userbase}/lib/python/site-packages +include = {userbase}/include +scripts = {userbase}/bin +data = {userbase} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..1df3aba --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,788 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + + # FIXME don't rely on sys.version here, its format is an implementation detail + # of CPython, use sys.version_info or sys.hexversion +_PY_VERSION = sys.version.split()[0] +_PY_VERSION_SHORT = sys.version[:3] +_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' + r'<string>(.*?)</string>', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> +# All rights reserved. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack("<L", int(time.time())) + self.__write(b"\037\213\010\010" + timestamp + b"\002\377") + if self.name.endswith(".gz"): + self.name = self.name[:-3] + # RFC1952 says we must use ISO-8859-1 for the FNAME field. + self.__write(self.name.encode("iso-8859-1", "replace") + NUL) + + def write(self, s): + """Write string s to the stream. + """ + if self.comptype == "gz": + self.crc = self.zlib.crc32(s, self.crc) + self.pos += len(s) + if self.comptype != "tar": + s = self.cmp.compress(s) + self.__write(s) + + def __write(self, s): + """Write string s to the stream if a whole new block + is ready to be written. + """ + self.buf += s + while len(self.buf) > self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) + self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) + + if not self._extfileobj: + self.fileobj.close() + + self.closed = True + + def _init_read_gz(self): + """Initialize for reading a gzip compressed fileobj. + """ + self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) + self.dbuf = b"" + + # taken from gzip.GzipFile with some alterations + if self.__read(2) != b"\037\213": + raise ReadError("not a gzip file") + if self.__read(1) != b"\010": + raise CompressionError("unsupported compression method") + + flag = ord(self.__read(1)) + self.__read(6) + + if flag & 4: + xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) + self.read(xlen) + if flag & 8: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 16: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 2: + self.__read(2) + + def tell(self): + """Return the stream's file pointer position. + """ + return self.pos + + def seek(self, pos=0): + """Set the stream's file pointer to pos. Negative seeking + is forbidden. + """ + if pos - self.pos >= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..b13cdac --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME) +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, + WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find('METADATA') + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read() + self.modules = data.splitlines() + + def __repr__(self): + return '<InstalledDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '<EggInfoDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..2406be2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.python.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..5c655c3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py @@ -0,0 +1,1295 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, string_types, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, parse_credentials, ensure_slash, + split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.python.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.python.org' in t.netloc, + is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at keys of the form + 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + self.platform_check = False # See issue #112 + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|' + r'win(32|_amd64)|macosx_?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self.platform_check and self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile('<a href=[^>]*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.python.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' + r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=True) + #if not found: + # logger.warning('no previously-included files ' + # 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=False) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found anywhere in ' + # 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, prefix=thedir) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found under directory %r', + # pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects <pattern1> <pattern2> ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects <dir> <pattern1> <pattern2> ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single <dir_pattern>' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) + return pattern_re diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': lambda x, y: x == y, + '===': lambda x, y: x == y, + '~=': lambda x, y: x == y or x > y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..77eed7f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1094 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include +# it in the tuple literal below to allow it (for now) +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + return _345_FIELDS + _566_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + # logger.debug('Attempting to set metadata for %s', self) + # self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' +LEGACY_METADATA_FILENAME = 'METADATA' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..8e22cb9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%s" + type="win32"/> + + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly>'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +if __name__ == '__main__': + import sys, re + + def _resolve(module, func): + __import__(module) + mod = sys.modules[module] + parts = func.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + try: + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + + func = _resolve('%(module)s', '%(func)s') + rc = func() # None interpreted as 0 + except Exception as e: # only supporting Python >= 2.6 + sys.stderr.write('%%s\n' %% e) + rc = 1 + sys.exit(rc) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + # Normalise case for Windows + executable = os.path.normcase(executable) + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s' % (name, sys.version[:3])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + result = finder(distlib_package).find(name).bytes + return result + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..a09d926872d84ae22a617dfe9ebb560d420b37de GIT binary patch literal 92672 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe new file mode 100644 index 0000000000000000000000000000000000000000..9da9b40de922fb203df6b9a1d0ad4139af536850 GIT binary patch literal 102400 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�vlnW`{LoXpTySn$@;x8yoz96jn?+Kk z+8+$D$B^0(dpJ6<hZa-dac!=Dhn7&}Ml@L8?2`HV^PF4PZHDWFvVxb6nK^I63}Ihy z5|`ET>A18uUe?`-6oJ;)kr577Q&Vi><kIszZ_Qr$uhe^fsNOTolL}S>eB)*fB=t!> z-VTs@&yaf8Q*)_o#I@2F(QesP)-{|(k4g>Cwre=A!xmwMY;-K8yUmySJ@MCm|CJ}& zc_7=d`c9fRLg$#ug2UUQz30hw(;n+0IrXqxE4M$qE!^uU@ncbAh1*({4{wX~#v7|h zt!Ft>u19Wbj`B@4NCff}+~v}ieMORYgqxzJ`{&g7c6~pRG;{)TWAZbx<ie!<90O}9 zFuPst_a~ifU7)u$k|UHeV&x#2(^Kba%8_f6es?Tqy=O2BmwS}1RxI0mFO%57W>(dK zj`6KWJ}w7wdDMsql_NPa){*Rv&G4++R*ji#uw-r)A6qgo=lJ7HdO42m-T9`*@Q7Dz zf+UuVF*`x*lEuy`b}3{lL+qQx-V%G0F)qPi+bXtgzTai9vLpp|U<Ej8B$MXm=2j~8 z#PV~8bbWRN7g3L|ARg-t){(9tPfc@phf2~Fgk5B)l7bbK*Iq$2%`9=Gq9I(EFH}L% zrh*VWhLZT6_2Z6h6H2s_uv8FF<8p763W9KbOfoJW-bwWRO;=Bqsh;-w*7d^;>m{as zs0*o<P&JwQ+18<ca_sbkzHLHZ2%ZxQ>1V`BC1hJ-*Ccia#IBKi=^B#in@UCIn4Fmk zior7R+v?|Wna0Stc!;T_-oKJ_$^PsZYv(fQ1ujjn{%Vk9>tTa9t=}6Y#k$KNsn#7D z>0#YsEHbRM2Ju)c4U%UqHppyip+WMkB7-cjt};lPHO(LuR<=QwS{WMg3(c%?245?9 ziow?lKEUA8&sYft-za#b!KE9r+HRE6_%{pwp}}QbvYHIuAo$A$-!1rVgEtEPguxF8 zzS-bSg5P6sOYqwb-YWRb25%F*+TbFcu)GG35qyEc(VnQRIR;M_JkQ`x!QBRz*{79e z@KnKv8(fYKTTX+sfK^r>gL?#zF?gQfM{m$&uMoV|;Bs!(I%M!_!4DXGt>AkNzFzPK zgWoRr!v<d<_$GsI5`2TfHw(Vr;9CT*HF$&IOAWqT@G^rp3Z8H9je^fG_yNH^25%Dl zB7<9kry9If@WBRe6Fk}ABIdH<3?3u6GI)aEpI@)(kSw@maHrsJ7(7MrMuVpczQf>Y zf^RW6q5)++U~rG%8x5W(_-zKCE%;i4=L^2f;0pw=FnERFMFw9g_-un$3!Y=}wSs3D ze7)e~41T-dDF)vt_yB`%5<J1+n+1<F_!hz2mQwZ_`wj)?KT6u$dUsEH{NL_G91~@| zD8BrcqOvvqIb+jcY}f&g-)3z7Xl!O<bHvzeFgDy)iT}vhtP>lZn(kW^HPoJ7b}}B9 z8IJ`fs1ut?V>89rq+qka*o-$eXnlyk#@GxqHfh+*FgE>+O$IiTjZL(%@nDl-Y`$2c z3%3B9%Z$yt#-;)rx3Sr8Y?fkkp|N>N+vpAm%Mr%%cg9kBA}pQ8@~6g9x+E-n8_R03 zwCQfn2S5?@&$E{%8|J<N?zLgou%ETBlOOvjQ!$P}NmZf0Bp00|>s01iG?D}w*pSou zNIoLCujkrC>z{ZwSCF3JqS>>diBbD}gUJvNhszwO|GKb=>-u!R@M+)WoJJ?AS)L=? z5Ed)n`|GoLl1KkmO|I|Ly=2up0Y}NIui6|-o?|kMf)-fhY2Q=Xj|YzF--?`w7d<tt z6bwxfW1r4mv)zlf0#APyeg^{ESqaN5r}jnfP_{bH^lbYe0lYtWUmJIT_b}FxwTFFv z*+sAen<8|`KP&npuX%ne8D++{ejQ4q8i;Q0rfA0REx`=67XW4dOa?e$6O$A1tmnv! z*<<%-pZSuPIaOX8;ii)GC3ZG003T)JgCu(<OR;2WD;sxV9G>RyG5z-&{r9N;`?dc2 zmHzvs{@d1RR@x!|!$c8BOywC;1%1eW*oBd?zTrlv26n!W?Wv1zAnf3E7<X3oTIa^6 z9Dd%;)q1G9o|$O4_k8NZlTHj*p+10S$~45614{dJ$0qp3gVMU(vB|!XGNBYT9?#3X zBsf3%WiWhyU3WNtEK^u?Oi`7g&mV`5j@=%|9#mGE)I*%rxqc+mKEq_~bs%LOXxNQ{ zz;UzWjNN7M+~gq7z1@k?_IF^kXLR0bteAF&TZ~qc)&Oj0v)i_oI3Z1tYra3Pt(9OD zLiVYw*EyE$@voIZURq^jV1J9UuDlpijn;jNA5VS!ex`JRq_G~X>!L)txN#+py7=W{ ztczb^z)AzE0XhwT{6et_3^|6hUHof(zoIg&!vZyxr`1JST>jX@{{1x{aC!Y1@&n?X zCx3F~&+M8HBD~XUK8W;=tofju_msf1-gB)lZV^fUDR{P4gSK#|YseSu{&E)LV?eWr z60!QHv1$RdEW>=zm|qfenKc8Y!sgJKIi4d@==NhkIfYT@&*Sp%6_N7F(>4~_4W4aH zJjVL8oCvaxGgd{3w{XsF))&O&`iBp0agy2`liEx`@G?PuAnD^tvJ$bfMWdb^c|A&2 zb2$?c>#EO<u!;~|?nN3DgSxNehtP*s^L30jvF7U@UY-t&<WL4;#*~)fIsPX%NfBj{ z?y0#?aD`7_Z@2%^&EUIklD|TQmMAyt$9!?Tz#o4_0n5_;$V#04sHxx)yVLhCKZgfj zv=+IWHWGl1-`z313d31yr$0UgPc1K5<L_icvo3NlIg2J|D;`8ue+-_}-(q{=XOfnG zABtdFqWsSR(%(X<K3VQgmK|%7VWFHlo!|7g9BaB`bl2%zHh&{Ca72&`f+t{)d!!TQ za#1p5JO-LEL?5fHpUmA~HpbXJLYfpvx+RN@*G2t;<30et0Ct3;>e0~1Ywc&66Jh$i z8GIO{<u)SO2<qk4=V3mz_R%KR!$Q*uA4tj~&K!Re=5%d7SJGg6JAH>^^)H1`{<iF4 zM|0}SW2nm*$Lb$qCz>{Ari)u^cKS0_Gxa-t3?LrI#70j<BWfHf6UEOX<XuEw4Zc&g z?5qBArU9>1W{cY$QZBldi#*%7`&mDrO>dF?3F$3G+wzbkg3hd8YcuY=29b2Dar}vP z{JX?xIduDGKUSY95j9G1j);0g$4N{-&>~eJI!uln2rzUQy~nm}+sWC3`H1hHiq*yK z5lA}QPE`)t@{Ci9M4u{=YT48D&~`OlOdj&wyKW-Wa_^IyH!eTxIJuT;wf<5U{({r0 z?$cCstl?w|Vv_iDHu3^VZ%P_S>qL(E6KRt5Nxg8;R2U>~;&6jF$hpj)XKEi!*N7Pj zX4L6K8c1prYjIy<+&6{XyJ`0WLHAk4eL=|m<9j9imZ1CjASfOo;`eZndO3p(4Km)5 z8wdS41fhQL)WRA$>Q9371i24{M^^8b(43)|$H@jSr#8vjp^1{m_<C{iw+514#w-lS znWc*)q4NW;2td4yjMJrGwvbC9X<E$5^|&vH#T9rNFVTlNFU`qFZcHS#WDw^do!UO{ zxIoehNd-S=%Tu0O@H!9=F}8=^=)<%<#Be6f`0>ZTc8?Gt({@SV2sUCiF1c$j@K=Kz zp!UdpoS|j#4@cL7NByt9%GQ^yudT`{$rE(YrE#Y=cxqsWzkSNbVVy+Y(UZ*s6wiGs z6TNPtc&_F7@1vdW9bz)`!A;Bu|G+qB`U_Fz*eKWEQH7`fyy$b{0gb$Sn3ORW?In)f z8|>F&=~*e5^;3yVh8J$>59*LbL~LC8&F1ivZ$R#_gB%(OFUhQn?48YShuj_*C9<#P zmXw@f`!hL)e=4tRMP$o4B-}&*=Z%tS$sv6kAGiJ_=vcFe9#Kcxqoi)m)MFeR&1+dN zxo`xF)a=8HZm%5ub=G_tz9PQn%Lv~o{-`|8bG8ifM|psC@e{?=+j@0fXml(Bl|xn1 zu=So*NM`LcH!p-Jv2uLtcVwgG2SW5{Yv;A#b38R)H7&`6S*}IAAgfyVNN#u{d*Rd* z(&|9c1uo6I@RzUrf~c?WWTHyDf6m%-mp=G1%v1Aq)8fC1&12YD7we405tBLmlq&sx zn(05RK{)Epe82>Tlik*yI(E(@TK;Cm1RWxb!)EOuhpGNz_Tk#gB$}YPPa?cyo-e(m z$#dkh?DPhnFWpA4(DS9^Q4>dF*yD|{?mbt^Krj1}oY{I+4@vs0*D0dwAkj076LN9U zQsC`Y9Rr^z!_(bfd*03b#u@7VIIUCvz~DwS5^PEB&m3jmp9sdDh(BumDiYH-;hm?- zNghtVpx9y%SFt$sodp?XO7LDcJW&w?tr6sTP@2_EXI)Qse!>YNDzteUescUAV0#z! zE4TihQDNIr&Y%BdpeXH?^J#gxoC0^P^E%RGmXMzjemJA?7$+{n^|?#V!E^pY>udUj z>#*B__P%(u_dTbz_g&kY3V6;Mmt?k`o((5E^-&{8WU@c93GdOOap)net=oRC`*QU8 z&0#j#AUskZ6@kwSuIM8<VK3F;xNSS<#Hc&zxR(<ONj|6W4?Ai_6c9){da+VafPL3D z87SstaXPa$7Z>rerWU?i$Dz&YFJsvm#XW}v?qX^wT8mvZ%lhUiuaoCO`{u088C>9! z1;1L0#!**I5l*6LFu#Qx?|ZEKlJ$<jxNNF#*!JuQX4<?Q@uNQwzn0LOpm2dT9H08! zz@Np9qo)JxopLxtWcgN)pod$;0~^3;`fsYDQ=G%PiMNya!<A#4)z}wh7d1*K!=g&0 z{eh%sIRv5A>NsjIlPCzs&|EawDb#yLPaETQ%aKg>+bDn#G0VS$_oE0WM3n74be0eM zCIZHhmnmmEZbsL#Vn;X!uAuVGOga?jb;QZ7*8F(Q9mhp%$`(j^<suXJPI5{-v%?%W z{~45f!*1U9y8+G#)0`9TJKgbE1ovUM{}Nk5c`{s%+jhtiOWA+Pk@+T|gZB#^j|tIk z;y6Z0I^KQrd9hXwJ`A$ePWktuzorN;g&{8_DGBSM$nNeluJoN%XElGo83qpB)+haj zd0}7|g?Y!d*6qlFE#GnNa!2P0!D*X0&0lKHdhtSx2bw>`plw?~pl~6fg%FzY;pAgj z%P{et=D6pGL-XKi5xmVXJ>Jd4$?d6s#7T?eu^aymJ3B*N>mmnd2X<T(>+7-h6c-nP z0y|mq@qcYML05elpdD4d;2Fe@l&5};ghy43dsu^95MxI%{`LE%?&G%UtC%vg*EKEm z?(x+BRQv~$CNP_nDj&rNKyBloBk~Mu^%OFz@}%!{+#E;#$=Bm@^2ub*v3e5zn?Hjd z(&Qa$4g?D&k~{73WW^f8phmfBc7#g>`*?Tr6c-gHcZ~JW%<x=N$D|tLsxOa83AdlT zgkRqG-6g!5N|F-h((|6Igy&F@&LvEj63Vkgy0R+7hkid?+9;dE?G-iZ_!7mzZTcxu zIiet+y$8l-(k4h=xwB)7meyP`jJ61nc03arbIep8mAzvaigEV0p~E&<C#G?Kbb-_} zm)eXbI?*vN)oq%0;R~Mn+v25av)FX3k3S&uFjzqR&}&G|`{QEV!*;U%AReX-JtCOA zyVH-Y+|t5KU!@60i!q7&Xr{pQ1FrOAj@1zmL~{|RP}ax_g?@HU&DT-BORZ<v+%^}8 ztb?HFq1^H%zLOq2U!rT-BR!0VKA2@IS;*3Jy+G1-5|d&)bd*V&+(v)B<sQa`EyU2g zl<+}5?yU<ExlNA@8QvbQ>g5WZU1RWKU8++aKyIvj&>E*|9*_Mn+LY|N*2^#`^T@Xf zB)$!U*D_vmcvObX;C}mDo^jRk1J<oE!2_|ZFgX6e;MsmZR+;#%1FM3C)kkj3{n%N| zXgl4HorBfM?#K2Sbi(~u9@OE&SMN4xA@^e|L#bFl1f^i+e(Y*O>ie<R8Cxs6-Qz3l zHQPtrySN|Q=?<9Ib(LVnhJrW$O6n8^S8IUj<Ja6xiI&R&ew5DJ_rI{ROT<|xx&LKu z{EFJDiO$gdFS+qM46DBk6y{?kvJN(2?!o1@jZB8j<u;fn$@&8sW(s^0z_5=g<DJAs z8GBm`Lk`wgD??>7%S?SQ43$GU_Pn#>-Crk~in#piKbWzunb{=TrZUz&A9&8%FPF<E zpy7PY>ns0Z&$7C_>-X*YhR#_kO!Zy*hQ6e|ev7`LtOD5gW=h3M##5KIQ6vh(tsAkh zB~LNh?L@^rGCg}8p{<K|A#8m^`?&_(u5W16!|-~2(#@;!lfKiN(m~(QCOl?;yS||{ zcnRqn+W9^84eeMF%Jx*yuJsM=Y#vOurMRMQK<3c9&^d6NzM(8s9tHIc9ikU&*EbYY zO(6P){(?&<eM67l9J8MDNA3EC(1IU_f|CYL=udJyTHAdyuC8rXq?=k{_SP2TsFg9y z<=@S;*il<Z&g2;A&4`@@j<exsw*B92xWR_CWI+@V4VJ9@`xOvHXV>iduPPuKTq|^Z z&Wf|>SO3POqm$Yo|3JF;jtYo&eX9bZH*0isT`C|7h13d&rf?Fbg94%_Xw_6cW6p63 zh%WhmO##u%v@7WO?^HlEL8{xTLN2BW#z@Z)iCz>gto@f15NY;l87Z;qSlSg3U1Agv z0YVChz)?VS$^U;85Y@2NM-RMN#8}aY2#!}kgiZXXt5^UF@j5CXsvQL%{I?Vk{h4Ta ze@@5Kl>(x5+I>Jr_Y)Klop*={gVBpa&-Op6fM_Li6^}n_qfF{DWLlipK>^Vpkx9U7 zCs9D;mTAtvrhsTUlRVuTzK;T;R8kkuwgRHVZccliTmezI@hxOLxdNhFj)VwJp*6E` zD0;W`<!qf)Pyvx1+uSnU4rw47dl6d_>(0;`h|Xnl%7EjIWeAE!?HP3Vc7;S|%`y|$ zZ&OG#9)&jxyd(J=R7kX5wA=J(sjI%QjPufgr^Oi8%!aur!bxZrksye(xfo=fQ9y)J zqCV9(h)yC|v`7F)vy71FBocd664~~sBpNC9MJUu0Sn8-fU0}JR_7s7rB<d*;l|<bH zqLN7N9EkRu{Nq&;ox@<-l}e&>&=G6s_?;?=0uO|0rFj*pKm)CkNcW%!rnE{TIsDFJ ze!>Lq=1L5mRT5pJJ=iLVrUs)yC6VqpX;)e$QJOf^oLnVQvI+PtDv1swU?7H==8p^# z*?h<#Va=}#0@0(J_ZzG5=G`DdwJuc>nbH`QM8C$P<wA&S&m3Ry+A4`|Jlydvfhd09 z@UUojN@G4Spb!0*-1A7ZqIB5q%=<meE>S~^4_T95B+Auf20we4K1-Y?-jV6QcD79D zwNj#3g0^rUnBxrFnRL$oIdO0wLM{k&R7xakxwPZ9bIhLYcdWT?rX(zVtRkSTq2g9@ z$(n0%`uKO*JE~fAoK7MOtFG2u+={g}B24I@lc<;0s~glwM7Q74*ZPJthW0wPmr2=U zRwQvkE0!b!tgrAQIeM|(>s(Nwn-s6py36bl1fp7Rl<=<^RkFQ*jDOJ{3kl<S%_YWG z8QanuL!{`I#UflPLp;gjExi2ZLA3=NVYW_-nlF#};;qX<d1#pkNk*o}H~tio@IV== zHj~}}KmKZ&)QICrcMQ+JWVH0M9HHRW25xO2GY{?0C5z4#r>!s~1Htn7*Aki8YD*PW zv*`SFJoc$$&6+St<XP)4Tv_7r+vLTFjq8ULkTk5~Jy+8mCs~4|h~X#V52h+KuP4-E z?C^R*Zp45$S|W1%Z}M_N+TfKJv12dlI3?hfIu<+1+>TLZ93SQAZ;z5k3LY2I5@oa< z<!CW{b)U&4FEH%0KEePD=JM|t{g%At$vd9e5yRg&oFx+KI*A7X>R=iBoG8zG!L=m{ zJL|<H5%@_jzeR2yH;cy$kkYNVSWe6j=7EQ$=ofT|4tO4^h;}^6Zf6539$I>GA&soP zYBeGE_U~pN$op5Mx`AiX3B7EW<FTD=zZFiA<0QxGro>R^XAw_H-RPDiPvIq4Hyo>z z*DaPZGDVlvv2_}a${>9!{8h4N{q-~{Ioo|A64{$4h18EZm+2GWTnyK`wEXeer4#^m z*c0ZtAbtkfM>fu0udVN)BEeI)l*79D&YAXmW{7Kz9%wn?%DS$%oL%YZMk&G&*#wD1 zBsR!w$>htH%mRIzNu;lG@SNA#nMNVX-*1hcCL*S*o3bt_?BhF=6)`tiAEh7>?zG}I zt#r4wX5((C`HkK$YWaiXQ3pdxlhuTsEaT{XC}3`r+g~TQQCu}&hOJ0-rGL6?n5Y4v z0Nfb)X#*mG$GhW`jy-sw|C7NcAYzJMp2AfU*puE`d6qkEewf$k*A|iqN9}oxX(SPR z*uMEJ%+`)_={U|I&J%Jf%k^;lh``Y30MdD2gOy{>yL1-(T%MJC1%6LtAgP#~P!xTT zq2)gI8Mz?VT+Ps;`;rU@EZk;wn=08r-0yZgiYlbF8RU2(qSY&gsA_INqFLHL?4KGu z>|e7ZgWkj5w+zO^CBP>%AN=bvnZB(nz0;>yTfUZe|KNSpo%y1;%iTfI^moZ@9FN&D z8^>cJvte@n{bV+ry9mjE<PeY+;e8+7)tQ{&AX670$L*lJ`ZUrN-Tlamd`Y6cy3f`L z)UOsN{Y~FdLxJ_)@1ek2s<yK{$;o<->-J5N!gWyxive1m)X4H&8j99mz0_03s-Ql1 zy-{C{%AUb_@Jj_-J2EBFI;>^KNAB~N@wu%}FM}7;7U~HpE1E4vrZf}_duH%(nYf8e zX_IbF8|~&KOge|<ChrMWOWS=8RRt+r$IJ46mBsx)L^4boGD>)l(@{GJf5>GT5I@yl zc7?nCnnBrU+RCZRs+I>u+Gto1@|hCXu<ca-k|d<i?~FHgjz@E1nobbWY(qrDuE}5V z1TV*hxwbVUrQu08S}#(XPb5PB9v*#j)K0dgGP&4^l%~x#-)qD5Hq5f&P$R8blV@jY zYY{cbrO+SuVtD0I6R53KMen8YXjRcuHG-;Wx$~n{ML(#K>5kfM1l8)IZzOC@+m+ra zT3z%8?T)%=*)(&bY{UK32z-hn*fK5|i+Jepjtn+f7#Wz~9g1<(9H!Pwn48WC9^1-k zPQukzGo8aMHBY7n7X)=pr|K9baF41}&^zs}FMs(CxxnWZjnnJ}wA|u$Je7u~N|_G2 z<yFhmMpa5BJ!kcO#jH;JZOwC~6FRa(>z<Ct>hUfwb9>M}%@D<t1a7q5@8q%tX=l~G z>!_VhY2Y5}pB?$r-o8#^6ZOwO>W6oC+9{6O1Q5rgXup}c-YTHE8_^CbYj&EwDtCHd z*(=Q-$eg%CqOgWmrtSJG2|xwbNxCG#l)dBFT`gjPwcfpU#^B<d!fNS?xs$tIM%p4; zL!(tCYbX&UUEf2(mbFBd)MYiIqPj85|4s99QrwlbR!5%|(Xw?u>1<Kd8P7MfO1-+# z-zsWKMRT?5DXK@w_L!&nSGrcwWG%CN9VmU<id|bv@c_eUHOE?`^$skymfN;>0Y$5I zf!1pMdkN{Yo!%6G$cZKNnlFgF-u0&z4<t1u7pnfGLK3GMWo8){*vA2t1W|k45YD<4 zwb$FxgGlW*|DNf6P^a~WMyIvWXASi#o|K|x)t8Eb+v}H=)HF<Guq_)rNAz0@d9P`? zHmKnG(DhTbZ+DOPc^kxNZPj$Qy0Z+`6m`^ALlTCSjI8=AiSk_$I7OrJI-1?7GNEbn zdXXSPN~7^wN9g)%DlRM<g37O(coWjrdQGqT_@TH;ZVT;<k@))Q6s1iB6<`lA3b2#3 zT?Yl&?H)U7!Tt~}*iBjsHnASB1-m;BZyaH#YRWM=lUN}~DC>W<k4&FL3AVFKCD;+J z2wMyGOF2ZtM(P@gLzsjb32diE+-u&4|LMYMrQO|W!yL5{(w_%7oVd%qc3ATlGzVW| zi95a7H^HSFdGpVy!}K=SQ+Gos$CNgS4YltphPJE0{)X)(`fL#_IBFN*T}z^58`aZ- zl1jw(T%U}e59@_mD&nYbj6Up!K++e;M`W;&<6EizT<-hs153e*`3^@)UJ^cciZ1M< zwk~X*S2l{S&mq!4(!)A}nd|8`0*$%_=n@3AVSlqoJpH(%C*3b)q@`<>*dH>9Wsdlq zb<cjyOwun!nZ8hZ#pVybq9-`KBh2gA!eUZ4{W;BF8Ov~QZ+*p17<Nwm(znTJPD^)+ zo};a$I=O4kJ;khHN8H1X5KT}UwtqK;Ll=p4AL1FhjV&Qz)SM2&s5fyWP>i=fe<OWK z+S68HT08UtJji3yjBtS!1t>j4X|;4hrsK(B@6>ce%*}b%;-8=E66y=xD~5=qVyPTL z$k)d*tV1livm?Hd_H=mV<2u_dBQ)SHxeTK%XNEGWlYdoK&y?J0oh#YkoD81Uyts6( zWY&9y$*i+IvwtB0&6;?1{Y4xk0C5`LnNEiwf~ovTtRdhYe8~XLa4p_UfaY`Yq~kE= z7Ew_2Oif$1H?O8`fj4t&8L^_rBYEp=keaq7jx~vdpe=vcqd6L^#C1W8b_;2${xGij zW7-K_LqhX=AdE20a^Fb8I7(bKY3KQP7`0|;xY2qYsqLE|#fLbKwH=M-YjOPC(R>Gv zTV%*4HHPbTVw4Wq7)8Cu7U_wNQF^B>()-qX-ZeIJv8i`CjbR!FFeVfpFc~OWg-~(k zC=F9hIykMZ-WvRcu7u_n=+4R7H|O}6327DAy1=?ylJ+a3$WhYsA7j+?=*I}PT<NiA zY*p8u<^wpp{93N$X?{*;RpJ|N>$>g`pDki~Kmye4Me8;EFkA1)(it1&*TfrCeqAlz zs4y35L@%ysJJUO6tF$R9?98n)`vB>q**krksiav%8q+dWqHdYQ->{Ypp?@@b_G<Qq zw~Tey&0H%qDU&}z#n<ncl9@?Gg0K=iq#xUrX`+r;ripr1xTa00##*l%v$km8c!ZjI zhMBw3UViwW_W0{%dMiuMsS~BKZWx@(w1?eznFe><jkkRBLNnHI(5_~z9MAisITzP) z-Y;{0j_9#4o}V7Sy%u4}Tokq<nAiu-Mz&}#WiMMan6h~K0&&+x(E(q2&G^f%L}86@ z2n9F=B~(2)McHpFtvt{Yx0QkgTB5en=s3}^D_P=^kaYt%OUFk29`<o<nbF@tYn&Zk zXzX%t+2mI%Un8H_rN{S|e3t5m#zzd*`TSaI6$y~f*Cn6d@Cu)7s%Mei<N!53{?}JX zc87MzZvQT_JNCsu(kUjx-%!-J2xL6uxNm!ohj*1@#7wrnjueqIC0X5!FYE95!J@Ws z#B}NC^!WT5vVOLw5ak5%W#Gr_a6#U*?XWw6oHKMqCLld~f*7EXbz3MVYY?cGo{8|O z3mJp!a$Tu~oQ!=}4k4llDx8!;QoeET>k+nQ+1NPc8&^N2yETE4biFa3%3^tJg8feX zcEmCqMSt<kuLAC|app<+-m4hJdBN{ef86`{?U%rQ4Bq6-fE+z%%t30oY;cAMD?B2A zbD@nEzSAYXVRcs}CYl7UQVlsOGQ*SH2goo@>3!ait-nT8_ugHtH8Mr}cj_(?o9oHh zdJde{NA)HdI-J2Zfec5zpWZ8{@W^EUfL0M^)P72HmsC<Yq}J+*Qav!HA8^#{!TxY& z49^Pw9<1g@h;xxCvQr|~7K1q6A0*Cw<QCya4|n~7FquH6v_u3lZ6bZVQrh-MKBnK7 zLZJS5m8j8@qRqWAGqt625Kj|!;^e6t%X@NHuHs?5VPtg6-Tsk}TX*?KdXBVkq=ssY z%tjcq&6<!C(d6H?ttkrCL0X*{Px;ntM~M1@6#P`eHxH!Qxzpcwtht491a>vcje^Hz zRH~o6+uUWPt4x&zQ<bOiRZ=}v%@nCFvau#=8yH7H;u^WJZwRxk>eQVXB1}!)nbAGA zCO?j5(J)&E-_({@w*4bYrbxU=Vk^6`wcK#lrC}#h(=a51S1~bTg63w5`492D6?!Y{ z`4!ABC=fi8FFa!eT(C=qIk#@kMl&%-a>FTJBQ?uMH!AvqjmXSrL}nr_3m=3w)aG@> zE2fB=?g1|ULxh!!ldL&cw;vq0<}ki*Z(*@ClXXpQll9rfMtbI|xv`IOtobuBpj;|# zD`FUt!z`XGNB?_?GMIRz7;+5b1*`8GBnI7x)kv?buZgsJd7JVpkq?BVT+&%r6AeYm z*XN~(37Q9dXIpy+Q9t(#j`7R_LqiiXGTBz@5W0CLW=<`NJa1P749x49Z4Bs1+FMpo zrq>*Wxu!UUA@fqi;91D#WYa)vK+37lN(&x%h3+_^p9XzQy@YGMy=#`IP~x!?ABp^i zbKSq<URk0{U2br!>96fiD0_djfmpF*TA%Bu06)9R6y8yL4@|~{DwMO^#9Z^C&J5kx z2yH||QK-LKfK0Rksrgc;evppW>g8oTR^<M-<+*xpYM@<cx3!kG$Gl$7R%#x}M+Xjc zZWN(&nRG?3d!3YL00mFcDm-@j|AvYgTT#z6O54(R*a59&tlo3X;n}A3j?)jgIpU|U z;*`k|zfM}$%{ZCN(4Nro3^@w*$A0AhD#!n+|4mqpj{ch~L*wo`(B`kGsvQ3y)W{l@ zxsM~GK~AyPI+QM~X6d!cv*Ibe$w){_E?5xm@t@nefH{_*Cwy<)<w-yH15Cd1vFs9k z%$-xwd)sm)Cp=>idSB4f_eG!~q|1KkVxbSsg3b-qAN8K@)|-e{sR|lHgSWqD*e5cz zU4wi_R3ft_&%nZ6iw2)H_9IW-D7tE-X6If<f}|5X5*0NSGi;wNak#Dfe?yFQQDyUJ zxrH00Jzsylb?dJM@m5%0UJ;~$-qH#2ef!-p&I__k@J2G2z9mVYS?`IlF81k2|ADwc zQlZ7CKnF`35Br>2Gqu&vczV(Hbf@vOU5x&ZrFGuy@psD|_MyjrEPMYq@<?h$ZXs8a z8@yRh3h8r2cYUK&z}P$4u-QZ6{Y26~@q%#+9JRl}2WT89+hDX+p^m8b_c5BCd$pu8 z?3mp8I`S6d4%64Qa)U4Df`v3ih8UDPvF6G7LRn{BDE)oFTat4@*%!)t8Y9{lL>0yv zWVy>)C)1z6PVMNk=yZchRz-tvqod|liOV1VVF|OkE!32<{vhS16gRe1l9QKkuyfMP z78JMlioQ^}bt79io6j+}uL;4^R^dn9s=p*WeV5~AFRd+ylUyRHlHb6b^ae+b?AaQ= zp&QFF2{5^rmRYzjr*80W$hSL&XsPM~QgmOyE{E4A#9Q~PK;X%6$z^?9H`b2f?DYxP zk;9qd{sY`|r90=b?>^nE=;gv1zNsQ^uP~OE(3hX%iFkz!XFIa~7D#%kryf3gvR!CB zHY?bjO0#|~%@C89-q>@&K$g(fcGovDuic{+EpoAws&-nHm$O|f-tINtnty?(PIpi; z<N}J;1?6=4zvPIjbrjE%wG`P2aMdo0IL$W@R!R~(XUCm^Gk40>Dhe5;cTc+7BcKn- zlkS5NSSxMw?{{sDgiw;rJ<X!pjlKlRbfx!O&uBgV55@*W=kX<B{!gt{Z<}sH_5$;; z3ukTnf^{vnvhnO4@1f%v#yy$W9Y5MeDuJX;45zNAL}g3;EI4jAr<emtcgvhccQ(G! z)|Jr6T(hyJfckOivfp#Eptu@M$B(OOrgJY?e<ywf=WhS@?DV%h{=a28a(7{U_g;n^ zvJ&UH-Q;9N|CZOSBx0^fi}LlbT4qXea`N57+XeE5%?s8~bXLF7;&R&KZkc8u!PGMI z`l}%nk>ly6CR0fBW(yX7U^#*3K+*;-C>=TA>Ce5$x47l#sX<sY#9AFn$oe@bg9PvY z5UFhYB52h|Du`TOf_=d{I~4g5_?_8;06o{tDdgbeX>Tu)zCu4MnQcES$%TaHCa!ab zrEwZ^PFPHMgKO2hPzI6vlZ~$ZU!mzJgWFZJf!KOQ^AV~gyeR_1mDec{ZJnNp)j44? z)yy@YL(`#3TZLJrg|(!1vR|$3!&{Q^6&ACyB_ZfeCa_7XMgg)fTI&er5yB$}`!@_x z4GN{XWI`%5hDkQ#ZHf#_eXWui!7kbQY&w^oPEim$)*tmWQi{4TC@xC}bKmscZ4d$$ zkKHPstV0+NM@^kWA$WC9v;E^t?=xKWo^b0iw$QXHVk@^)+L@hRKkG1w*c&D_prO@? z){_|jL;-s=C~4S{!X*C_`Zv}CdKhjVBhl<FVU~v!m&t-ZzUeAq92QY=RyG|DHZK^P z0Hv4xv6dm`<h}@bxO^c38l6kt0ip6K$ZL+rkj9dls6!0)1!aSigO7PI!C?QLHLsP% z)h++@WK{GWetI?9U{iG|*!fT#D{$)6n$wtk9e$d31+8A%^$ek8)7Ze_r^CGc>TZlV z{B#0x7A*C#gLjT`>Y#3VvOhB!x0<F;YIcX$WhVbtMDo5-){oB@+BBd&<bb!QwaS?C zG5LDHqch*qy(X>rIqQqR2LeYjS;ES$iwrvcVIKeVgkjevp!Sg0u_OGMgV7eoyB%vj zTG7w#e}?d-jTEP?Wme6zPO{K^5q%G@iJ`Lj*fH<vau*k&W_{8TFU8}m2}e$}LduA^ zr(2>~jQ)5g1$A-ltgm!A`r6seZ%TGWVe5y|S~yohC+=(+@K-8^kzmGPA|+`oS?XCI z?33ivzj3U265j}0^z1%E)Twtkf8M^nlirW@BHQ14yg63N&l#LdydJjrTdm$>B}qNR zjP%rBj%Ih}j=QY~7HcB$bil5bWWx#VgMu}WomqK^#Po0onP3C0vR-%<LlFu(`NM=+ z&j{td2Ng;Lk5i%yH<L)F$nQl{y1J;#kr)u%6MPdTK1*A0!XQo<)Z2}9T{rC|WqV-A zQqaJV8}wf}>J00l`;SzebnwjV^Q;T0?)60IL|vhFq4468Z#iw3)Q&D&$%V4+z0L#* zIoZ*rS}o^wiq5z|yZ!zc>y}@1;ks3NWow!pWhfsKP+w-Y&hOGmhZ@kqNy^q<I1}_} zMHdOy{I!}CSs0ng+<~tA=pBCRuU$EL3UkRD^Yo<EFs;Ym=UL0uq0~AX$K{09qO8g; zqw>f9ak`9`w=*~&R|`^lsh+DoX)k~sbBFrlJ%Uwf$le+pw{7$DuX8=tEJyR}SQeHQ zHOt4LvDs6|9bT>fmGyNkn}Hox#zy~ZtkwLnN%6S4ty!M0w6clcGmAeVqt>4ME^Pg| z8P*0nvg2!&9#L5ZUBzT18<RRX=|YE!Y?kR~b#RxO{J;BG?Gy%3>PI%*Xv06+aJLN) z+VEo=Mh-IJoHo43hSO}gz=pLp{DlqwXu~IM_<{}Jw_%$Nm&rRr{C;4=;j;71FU^K- z8_uzz*M>LQ@OB$MV8h)ueBXv&*|6uCCf*bqUSz|`HmtPaY8&2a!%a4P)P_53*l5Fp zHhkZPZ8q#S*reCThNs(bqz&CR%(LM<8!ootY8&2W!@F$wunqUx@MRkwvSF(Y!-tsk z2iWjD8|K(>o(-4T@Mas{Wy2?I_^b^N+R(CLn+;>_dOO{QBW;*r!z*pL)`q%r`P0X) zm!SD%@FJ%ueV6y74XpURZC+zw=Ww$>F!lomb?x5K|K@97zEaFGwC3`)azV2-!qBZL zGfbyj?KZGb6{;%y%v3YfBsD^=HtJu{JX)Qna#WUWEB-E1*(y^_QEqMPQ66=nTFAc( ziAQ2GzanM+4OdR`VE#F^o!DG&|C9XXs!`g0l(v)5dDzL%WkbQ;s+gP>lg>Q;R*IGW zU8c&_;x6o`;M<E^(D!uwRAAFN2AA@w`FvHl$!{`v89535#Jq@5!Jms*Dpe_d%r93J zU@lb1PV{dQe&=E1)Ak+XDIlJ9TT>ndH6{NFdP;s#Q>XJOWtV&f^J5@;%TT01=g#EA zn1vc9UGXRBNIV6^=OZUYb_gu_P13n<x0^xE#aC4)f3wI(kuLf1E;I05+`)G)`Crr_ z>~!3ZH%mT(=_<HP(o@RBFJ_5P$|3Pcz9l>(zvse*3oon+F;o%1;m%xsPC>5chcCkA zjw&h|Wej<+jmxl(au*jCFPv8#VwB6u7awPyQs^xg=jp{2-k^iaH{Vx9W+(f~bmWtL zi*&`iDk@8*zH<vI3q$o>Jg?GMP#LP=$pwqFk#rSlDdLy76>&;@e2WNwy&^7&M@=f8 zrwF5_7kGV@ML6)AR9R|c&}D(IvMOYPUd2U=iaS`$@EKEX`6BIWy3d9MUWrG-OBjVe zg&&2xB%#8>BO;@^MaOiH?GYE>(~*$at9PHIQ~D<NJGK9S(@r1g9CXH+gNK|oH0A7b zh7BJva#ZT*F=NM_d*1nJ7hITr(fEreWVj|~y0a!-;>n(TX-@8CQ}U)xn?3_^>Fg`6 zylT$X*UZf?m{(X-Trz(_=?|_gTezsa;=0NzuW#{^rPtqZ<Fe%|R;tYM%B-cO-n`24 z!eXi2h44}#bzcb=6swVNQkiaB(t;MjIi>h0rpJ&rU#a~$bvfdd%yWc)a%el#`Pb1; z&{g;;n>KdINnE90nF8;*w6CsWm`4AXs>bq9;v7LdE^=l15$R8yeC7O=9z^n)t5eJY zlTsCFyAqxAh1%}|N>l|_z+VX={h9PP(l<&wETz=*F)h;Vw^a9S9pe)BQqnBNy^Oy% z*#4yT#Ol^%;un8KxEE@7X|a-~lhmYNapJOwzt@vTNmbk`_$M)%5T&>*qCT8ZMoMX7 zU5KspluqsQTJmr5?xj^r>7^E{h_OujDOV-fNqkbL!IDY;)J~@nnobKzTl!S#bDS!L z5up%Mr8*l^3Gpq$EM=BFiH&fA&{IluBBd7TJPHSyF+j>E9M&<UTjxo7Q_0szUAw|h z!TKH(s_#XFl@b@@PpCDYvN}njg0M0oNvtOJGN37~*h;*{Wg$L;xo_u8Nv%D-(V_IZ z<}Zou_<EN#f^^R$-!m{v{YV`c7ei^GndEcizlA@7<q6U)HB^pZo`Ur2ssu$Lx*KW) z=`n_RNU*(0?HA})V#+10t*f}4ng@lCgL!JF?-+G{D868RzF&PVA+4@c?7B`39mddW z1oQv>)037ZZT7#C-npUlD&SGW1B;2Pk~n47Q3lmcY)Qek*-o)w{>O#l`~LZ#OU`Ak zw3Kwcv|*u8&?Fogti|@!g7rOGT@XsItNJddR;9j7PblrXT=y2zYZlW-O0QL{V+it5 z5SsFg?!-@$D~VD12h-<B|0TTB)ff<rtDT=lci<<<?}_m(gzC}@3MCfk`Y6zSo9QF2 zJ!v|@{Qg(?=lGOljwdwlNbPodx3^QN73np+^t;mEE+CAI7BX`V(%kgmLaF0p3&xk) zq5i%<zewzcM}==>oR<;*_!JC1QajY&_m5v@<}$Yr#$44Y?)LgjRqg$K3H4U4X(zpm zjFlCb1(#7kMmHHL4aH>iF{6VCBiwjAjbsfbzYJy8Te8z9zovj$$BE=we$}?w%xaWM zwasku=wIV8<DcDn{j0Fey==47Hutv84c{359Bk6RJlovQHY?kFs%>6>)cEgjo1M0q zldSsJ__c9A-8Qea%>!+716w0u;7;3|XPXDv=KMC}zSK5n*yi8_+G(3_u-%nyma~KM zYdd1X%P|f49k9*0y6ww+K>CCdT}PK=C-r1{y-YQXe@;e7X{pj8&5SY!Ojc^bB_<cK z_MB4UAF2QGZZUN&vCr2&WzHd^k%>X#yH<0+68@q<jbG<fvIuA9t%Ha?mbGoi*e(pw zD}@-O$0(x>$}eS+udECdv2r&Rrr7L@=%%`bCq!mtWkt#F+*INckIuBb+0ilT{M6K0 zdB~5QPR(L5`3v&-DYdj>DZdze@G@ge3?PPoV*Jk!3OG;rmqI^i{+;M{qK$`|`L=(x z>coG?`(LHn|AndV_pf6Nt5y5IaAZE;=U*_q^FKUrLjB7K_&>}6VXH#_j2is!{u``8 zfvdyX|AmKrzkk8-Cvx<^YV%z!KvL?%zhH`DYR407#sA-3V&kK;|L<4Yc3%mq9XD7Q zy=(igde!Qh+BG-*aBbZ>|IPJ3`tkZ(ZvDw^KmFOyZ@=RgzufSvJAb|LH+S8A&%O8E zzv;KX`~3rd_~V~8KltZ|9)9G}$F^*J{4Y=Z^~t9iwmrRl$1^*3?cVe3b9<kEVPE6^ z7hih$Z?C+1;I)IVzwzeZ-)egMop%qt_x?Yu<_}sv{OIFPT0i~gXP<v@_(<EAUwwTP zRowq=0nNz;FyBi+^S@pG|Lyeu+w}h~0olpjwSeq@yZlk?cgktq;O{ida<(b><ILP~ z=6cK>=Mq2aWd3m{^ZHI^&MO}m{?<<BpL8-m9Dcn2M>?4!$f(Sz8~Eb*E-4Pm8fTR* zDk@(x-CN)-MIMU%%&OwbDf50%T<FbSR8n5KP&>>bjQnuVDX8+g3caO^i}T7Wd=(*k zV`rjMxkxb!<`+*aUur_mME;k>EO0C<ijhbcQ3Y!P+JC!MSKm~<s+tL1#7)&Vt*-79 z6~&Bh&6+h3J~g#EuX-)Bvy`D}d9$jSuQ931%UerOXG-<jYC<Wdbqf|Oh>3|_T2Zm2 zqT+=4ob1e8#wYtXgYiG9z*|t}EUv69uXL6!a+VeN78NciuDsAWL=<PCX_Gmy{3aEY zmK7H{z2(mGisD7i;-$rfK5xOiGA#hdedZ!Dh<gcibQUaf7F6J|h%h1*he#uJJnjA} ziwlaJC6(n131Ol+bCB%qxX76Y8qEfB2}g%Q=3YLJ{DrE)d7ZDg^7_(6^PMF+V<)&* z6??rMoK=;#h~gFbD#}U=bwvgP+VSIF?(?491MU#%<nHa|Dx_fEVrPYsU^{(Pl8vE5 z%BqG+Qtfn{U+jg9rCw)Yc~P;myd)UHWN0KS#ie|~-zaAPRn*2P>O<C=qx5Q6c7~4s zWi73MVNFe$njrp#3k#?dYD2OD8HSFe{)P%xwV-%j0hVQ@i;Ai9G9>QicS1Z%7L<C6 zt11c#i=71}-r`E<&{4js%2D%57mX@jw0LMRa627z>g{|Yso}A-vV76P;ziz||Mql> zD;Jh7qH4$uRRJ@NxXxD&A*u5Y?DnmhChIdgL}S7)DfKRps;%-CRO;COrD)shOP9x{ z7w3aI(;1TJ{F`>vk*=Dc9sL&->niW)$7Yk6GbW8NJFFf3>y(F{In-HTmqNIuV`x%1 z(f^>Kkglw(e2L~iLU*d}lhpI^HP$JWF48HeobQtgt#YOmFQ#WGEpZkvtnglc_IIZ@ z4_2}}jRG=CyDSbdt1zT<Ve!IpdkgIhHH5Wql{$m@xWSy@o$Xj(Pj^rM)8Jpc`SFOK zT>6vWW<C<T?WdQ}b*jt@=SY8EHRp1e?D{$EFG<H<HK(d{VMST-++e>qr>L~bJI8z8 zxRDh_rsFeYI_Y1T947XTQN4@eRPS*;RPSky#`uOF6>p3&`|B?vF!_RS{RbwBufTgE zGzpsfjfg*Y;0}lC@9nAj7R3`soN|nft?bqm*%;0O-kVRqPtdT~NEJH{2|;DIim)DG zst36X>l3T`jB}_yV-i|>HpMl@HpEm!=Xc9X>=�?dYNUd4WaURX_A__M4W}D0!0n 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..9d4bfd3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py @@ -0,0 +1,1756 @@ +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+) + \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) + \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.split('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' + r'\(\s*(?P<ver>[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,736 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe new file mode 100644 index 0000000000000000000000000000000000000000..732215a9d34ccb7b417d637a7646d9b843ecafa8 GIT binary patch literal 89088 zcmeFae|S?>wm*FGqitH!CO`{C3REl(SahnPNDYM`O{q#T7)Xdvz$<hz5gjb&0FD$| zPs=nt#$jgk-tk`NUb*PJIy$3wMg@OiORy=5PEkZ0P^;6cyPm2=Y8#~Xyq~pC(iU~@ z_dd`2ywCg3TS)e=wSTX@_S$Q$y;FJf9>F9Cf*Bu86NCeB>CeT#|L3nblC!40kR?2m z{>H@z3`^g*ct!B1Tk<#8{Ol(+x7?n8>n(TO@iQ_1pEl;#NO$D_^p5<p8@>6r|7^p? zD>5@P3KB)%InlPUc<U{5lb_$uJ2!U@!dIxT&CTYnHuoCtzCL#`-1%8w%`JjkymkHD zpYr&>Cg9H}+(GW%^wV2|ROUbGfyXTfOART)i?<!WISJD#7!6|#8G`TvV*Xu^z32+K zc6>T0?9%;4K}Zn{6fx`yPa}*$9C+R!7zI~72c&$InY+UdMGBkF3c`HyxD3K09`bzW z?_q;rO&5ec#{?noJ4vI19bbHBt~vx^h2FH$V8i|^#EsiUg#JboP3@w-(&Uf&%NK<8 zSJZ5{MZ852W)~s>WeT(LIf&1wKNqULLI)GN_(-E-D)X~ZK=1;t<%*guHMhdg`-(mb zHzDv1KBN9zR9?--O+N$ReOXAr81V9z!X5SJ5`=3<1^<8V|AP@&sr2}Qvp;hQT24iW zOHg|EiZd1ojV;oo#(r^ba2`^8T22{~_UQ@YMZp7O1R*2@?SerFE~TuJB_wDaYC0h8 zfONF1t%{=H`W`bdYp+>YBsg9Ty9ec3iy+O3xa}TIvPK#Q&udyx1MvwG0(#iaGC|N| zJ#3?<Y4YLRkU`54s9BYRjyISA>){9$tW;Y34lPnX=&>D4X~|k7c$TwEfOzs@Yh#Nz z`FV;`(w!E`sKg@`2E}bDY>ku^4XS@tV(WO*<eu67;0Clk;vRHp!Qf<+5w0B!*Y>g? zYH=KK#%%Yu1~&m>IlB^#2^syGG|2AB1(}4aOcaC%!)}%`I7AIC2(Ro3yW`GSttng^ z_xb=ECor!L{-PNO>_ulJ3%fm=O0X!s%)$GZ?~I94l-^KEAX0n$?4wGpr7&i4#~)OB zQD%2NrWUKtZuYT1Vnu}AeF`cSgx>Rkk@}Lg{WltgT76VeA2aic`cTnpXrt2WXmJkM z9%u<Rp-*9{$HQ)>Xm?McyDyZ28Ux7mpxy?mnmvzMMr-85vkRrJLaDRx>|I7je+cM+ zj{RJ(3Vrgke;W@#D!y%U%fQLtlPKTAzWtVuOQdXpwsy6eRjt^cZ%0D4bF7$F;f!th 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ð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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe new file mode 100644 index 0000000000000000000000000000000000000000..c41bd0a011fd760ce20ba795d9e535e0d2c39876 GIT binary patch literal 99328 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 B=L-M; literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..b04bfae --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,988 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))? +-(?P<py>\w+\d+(\.\w+\d+)*) +-(?P<bi>\w+) +-(?P<ar>\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile, + hashed_invalidation=bc_hashed_invalidation) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + sys.version[:3]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distro.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distro.py new file mode 100644 index 0000000..3306163 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/distro.py @@ -0,0 +1,1216 @@ +# Copyright 2015,2016,2017 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is the recommended replacement for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.8 will remove it altogether. +Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and will also be removed in Python 3.8. +Still, there are many cases in which access to OS distribution information +is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import argparse +import subprocess + + +_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + 'ol': 'oracle', # Oracle Enterprise Linux +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release' +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file, appended + with the value of the pretty version ("<version_id>" and "<codename>" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "<version_id>" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "<codename>" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +class cached_property(object): + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + def __init__(self, f): + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + assert obj is not None, 'call {} on an instance'.format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file='', + include_uname=True): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_name`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self.include_lsb = include_lsb + self.include_uname = include_uname + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={self.os_release_file!r}, " \ + "distro_release_file={self.distro_release_file!r}, " \ + "include_lsb={self.include_lsb!r}, " \ + "include_uname={self.include_uname!r}, " \ + "_os_release_info={self._os_release_info!r}, " \ + "_lsb_release_info={self._lsb_release_info!r}, " \ + "_distro_release_info={self._distro_release_info!r}, " \ + "_uname_info={self._uname_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') \ + or self.uname_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') \ + or self.uname_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', ''), + self.uname_attr('release') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = u'{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info['codename'] + except KeyError: + return self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def uname_attr(self, attribute): + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_release_attr`. + """ + return self._uname_info.get(attribute, '') + + @cached_property + def _os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + else: + # Ignore any tokens that are not variable assignments + pass + + if 'version_codename' in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props['codename'] = props['version_codename'] + elif 'ubuntu_codename' in props: + # Same as above but a non-standard field name used on older Ubuntus + props['codename'] = props['ubuntu_codename'] + elif 'version' in props: + # If there is no version_codename, parse it from the version + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', props['version']) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + + return props + + @cached_property + def _lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, 'w') as devnull: + try: + cmd = ('lsb_release', '-a') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: # Command not found + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self): + with open(os.devnull, 'w') as devnull: + try: + cmd = ('uname', '-rs') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + props = {} + match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == 'Linux': + return {} + props['id'] = name.lower() + props['name'] = name + props['release'] = version + return props + + @cached_property + def _distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if 'name' in distro_info \ + and 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + elif match: + distro_info['id'] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = ['SuSE-release', + 'arch-release', + 'base-release', + 'centos-release', + 'fedora-release', + 'gentoo-release', + 'mageia-release', + 'mandrake-release', + 'mandriva-release', + 'mandrivalinux-release', + 'manjaro-release', + 'oracle-release', + 'redhat-release', + 'sl-release', + 'slackware-version'] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + if 'cloudlinux' in distro_info['name'].lower(): + distro_info['id'] = 'cloudlinux' + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/nir0s/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +<https://whatwg.org/html>`_. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.0.1" diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a18a65cc62c27c276889727fad72399184f73adb GIT binary patch literal 1321 zcmaJ>&2HQ_5Z3;9cdgyE9l*KtMEH~~VkvHGG+CrU8=z?pZBd{L7!Xi!DUs6B;g3L4 zE8B-YK;NW5AE8g8YfpKFo;u_@ZtMc3pb<G5&G*fpUeD)o1nW=o$uGYRqv$Vx_^?K> z`5JD!0YRfIqCMIdJ=xFta*z$=FdOzFI-o<bCr8;xj<d0xWRsxV6Z<mG;;<iyshnlA zupf)LJjf1UKcV|Hrc*kj^J<hG(u3@X9{wCHj>sSVD2m^%e)t~M#8|E>BzSI!xkfp$ zj3TX&+c31gc>B%j;yV;9ZOsZ^@`5<7Rs3?}Ty2+W+HQzzt3;bB-8d;;t#N`@@U3^u z4B{41W_hK+tJ5fFsL-+oAGu(t<!%$RD{h^q5Kv0pD2n(FzvY4=;?J@cOfuyxYMBtH zl$G3jWX5QN3@h}O0eJ^pVn7tcR7_kyghEnNW|SxN&gmLl<tR701)esE<8QBshe3@c z6<aRj7{MxymZ;`+g11aj00S!8IOJnJhol7~9|zJkQ%_FhHKw{~JlDkAoIFJ*CO=sq zVo|va*50i%jG?dYyd)u8Ps&9czX6OwD?sB+73?Vl1rY)B2B;Z!%C0=V4fQFt5W4lb zQ$#Wgls`qwvQfoy{cAu!-&JAfe*M31-xyMP*1@U}#M*~We0_cjRlVoQhmto?DWAoP zxfPsW@6P|RYl(RGk=aE!-m`*Qa3c5(Gs)d{9lwY1h!%tHkmOd2#xcArLpPy(%Plly zcho3eKz*^`ju|5C``+%G(C0he-CoE?HxG{w5ife(!F}GKncr%56hX0nN5}Z7HDfO( zUhI3}XWUFd-0Ynt&yuqr7mvCz_Pu~{7h_yDt}zT_1Ctk-ffw*Ih`MQLq`=2KaNNy4 zPHlkcre1ZM#emtx|MCj>9+e0Is8b9*3)8I?#=l4A*kgL}w@GWmx5Tk@OH2w)<V%-I zljfHgKey-V%Psw)!1eaCXRdr+T^ey#p1*jJu2L9;Q?9H7fYYm5wVxN4H(nX;+X)H3 o0Y4fk#$0iSaZ+D*lb5>|e)Sj_*dq|b{&D}fH}hA2(whwb0Z^%+hyVZp literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8476bd53d9752d6b3ac69d1fee13518af3ebb7bd GIT binary patch literal 13768 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 Jy|3Q)e*q3)<%IwM literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4583b6d22cb2d59883c8d0f5cec6682987ad760 GIT binary patch literal 22659 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c58c8d6a901ebdff440a62c79927d409698bcb8 GIT binary patch literal 41560 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 X^`4e%;yL~Y2ljw3u~tleXA=Jp|D|jd literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4af0b0296d981a8b6215ec5cb4b5e9dac24cc10 GIT binary patch literal 3313 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 BEq4F_ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cb687c26394f7be8d3656730e78bd41d52c43b6 GIT binary patch literal 66225 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5b9ee7757e0374d0d3dcb1336164f5c5523f701 GIT binary patch literal 97822 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ba005f11cd1727e8d153b53136b000b2ca15eb5 GIT binary patch literal 10838 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..4c77717 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..a65e55f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,923 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type, binary_type +from pip._vendor.six.moves import http_client, urllib + +import codecs +import re + +from pip._vendor import webencodings + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import _ReparseException +from . import _utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: # pylint:disable=bare-except + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overriden, we've been overriden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from pip._vendor.chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for _ in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, binary_type): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py @@ -0,0 +1,1721 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from ._inputstream import HTMLInputStream + +from ._trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,14 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +# pylint:disable=wrong-import-position +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie +# pylint:enable=wrong-import-position diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..780f3015341ca8a16f26733623b58c83047a3540 GIT binary patch literal 434 zcmXw!%}&EG49A_cD`kA`uoE|qJB;u(F(iZlfdm(X012psqHf6`BTXweEsQtf9e9#n zIq?ddNG9RPKimJriF3NL(gtT=>H5<K0r>XCzr`*&c3$2%2oOX=MiP?Igl0h!5D-)Z zI?P&0L_kJKYu1@73r>j%+=J<cAQxZTctOCgM=;R?$T(?<@D_TlA9pYGf@UopmAS60 z<SHw2v`s8jtxA=frc)U;&V}S!S&6AGf83PNBTaaRN?!HaO`G#cWh<1NBXxTic!UlO zEoK<`B)XpY<4Gh^JCA24zHXK-=kJ{(=J*M?<U2in-&ujGPOW5hifoc=A+cl`veA_D zVL34Swb&c;qTboEli~9e_4Z_NaKP?Zp^CmTrA@W&zZd3hcRc;@;@o*HjmVL`*h~+! o8Zqw2VVo<YEa#iWtcee^TvS>f`G1zH4qduT!+??wStSwu1B``q(EtDd literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d25a4be98fbbacf8bbc7254023af69e548b21622 GIT binary patch literal 1517 zcmZux&2Aev5GJ`RX(h`}Y8!1Fq=A6uvWIBhBu10KF#40WhoZjNK!61TVzs2~wYfhg zDMc1Gm&!$Q?i1L(^&R>od+jN&kW*(?wrdq8z*#Oi<jnVdLw>)!+#%5Zj_$wt(;?&^ z{JCl_48DbKo`DfWP(@N2(v*cPbwY>Y98+%E2pg3AOoSucGa_8sm^oonH1>$!{0KXV z?^Ji9fyvd#N}i-eu5IOsWSp2J&#JqlEQxa=xk{|mkupB5TE9j`kz@xkZog`n4mR@= zj3glyBxHhyj#zq6hO`df4qed@%`*}<L`!(^ZHl(&z_<0DxFqx-scz-&>qJh!{BB^Z zj$+#zL`L>v6&ceT=DKHL)$GQsjz$R3a^1}){8(aXNoMSvU66O|1JH2n>4(-S*^KUy zIu|O~nOCw`1ZR9_H>Q_|;h_!aYtYSoFo&chZ&u&YlAe<f<brCqq<^pzcaQu<fQgQ= zk+$Y-Vh?>*vHoU7CotVCv>YZA-GUQ7je<fa<H*Wj9O+<~D<QQBQXLGAIDc-ovTw%X zS<H*^lTAB(esHAK*TbzBFM|D`NQ%cv1|gJsJSnobPvfI0PS%}|WhQbR9NJWEsbmmv zBqrd<R=+s?)ZRAI#(7%o+(j^mtVyO1klX&TJT?7omB*mxPXF4`cdLdO6;kUacvmjE zRSp~jCE^;XhI$F+^&Kz(vdwud3g<qZFLbX~+b}R57{XSVM?E%eU&mb#4vXdobbbV8 z@~|Z5<bu3H##zbEfpuWKBS55+&TFXVTCDw_d{*b6F@o>t&)`!hP&trsP5RtmKGphR zWH=(>s1lzmvkEKo1nCOxV1gTUg17nJp71`LP(qy@H+8p!1Sc;oTtTQjI-`Pq0rdwk z9svxv2PIn~zq1V}CGhUuoB?3H*TjO?jQ$3m0Fdo|#A*b}8#>AkWaTKCRo*Z1^hd38 zy?~b{|3|x`a@b?+CC&}Ri8K)EQJ3ALt8|r3*J`Ybo(m}PPSvt}4g(Ygg+NJ4z_LMx zC<NUF+3|`jWYkhOO8<rmYm3o1JSOQ^u-Vkl21qcycS};W8%AnZ9_Lw<O3tee=V>lR z3ddc}PezftTxoGG@|g2^b*#hjb%Oc<jH>0!a*d@@;DT4PHh==FLD$8Lb&uWPvx|(a zw7r(ssqe$C-@@3#ksWD>t?@=_WJ)83YAMc@lCgzH(`bA{>P`Q}xj}}vJqNIZLe~te Hv##?m={#Wb literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93b0f7d0676053072c77238e06c85924116ba479 GIT binary patch literal 2036 zcmb7F%WfMt6eZ`Sku2Ma?F4rEa-XQs#_G#xQUpbuqzDQW+SI54AptQKDSMQ8$Rwr6 z#&{F^E4s3m{fB-Dw_W8Iy6U|g$(0QwtvTQ&=aO^Jxesz4&(GHgv_GS}FMjt3`3qmB z4c^Hk=;{{`oN$_uly+$9bez=fxD<6x;-!8kuyZ%5q+ut7xd-|x=xdZbBi!e~DdB;r zowyyJSAHeU@C{fbP1h_&yDCqHTCg}B<WifE$D>%qd1e~JEbiu9uq4((Mu}=t<88}W zz*yB{teHL>h&L1rb<x_ixiEPIUHt|^kPhXf<8aEIQ_^v{%RLyqk`uDwA-o5?%4;xI z_zJJ{`BT~n`2t@AO_ewJEf{Nji7&%A$LE0mZRvyYt^)#F038)ipsNuGO-{(MGyb8V zXY`yrB`-FPUF{UEc26Ajnf5q6p|9!qPT|7Z!m(F4XMW+GQ%VlL+#v^z9ijv7oK*_v z9Cj9jh2!_ZR@K^CdhQ&%$9~}#q#qXULvrwZ2T}pF-1gDxR+6m06o+a(9V)%PE7p~k zaki%nY1WLZgf<>7n;JwpQ##7JLLz@t-G*@fBxNp*8*y%er&}0p<Ms16Gd|;yj*Jhv zNL4d1o)SsVc%`ztA4z3guxmV=8-ElfL-7ZZt6=%>QEMRMQKUs{6v<XEPq>h(mCDv` zpRxODGy8tTzw5HW=$o%}@BUt2CSUh9A3SJnw+8Xxo@JRN_r`<l)wkXL5h`tGBa!i3 zw)S<JY$ow;i-D)21(aae7#y0Au{eu0V_4#92?U`5U7$4@LSJ$kbcr6#qmvucofj#^ z)MB?O#qSG9L!Z11Ak4Jgq_P3JrX$g+yo~}~EyWtlOr5cAp6LkaGj<0w%2o?Kx-|j( zceRT(j19+2pqc<ER6q&p7&j4FiA+o6E1(s|U<YH!V2W3t;Ms*sPzZP7AC~NEI4cwX z%yK)|Kc|C4q$1OT+rj|1t-n`LG0t#A8GCmI_9Cu!<t=fAs1|f>iu<2&onvfIXe>j< zKA6F4Ox(O!Y+u5}TfzEThY4o#j285K8d!@eG0l^dnqVMBFCJgXs@?L@3~JS);(@v; znpxS86vHpst61-|5^q{j9|FczY{dO^27Aq7UuWgUTo#f%+Y?Iv4;CK-gU@GJEL#?r zzrQj5^5yTboYJ?2;u9e7#SDqnYe<wv;H=j1BFLgtFlK6ur8yraIENE@FpQFNMcxH- z@*NcKp}^9T>nN})B*tE%>k^@7GGmVd9yj|(sKUfvG$9S^p<6yRJKFVja}Fu=hI%N0 zg2clvu{0(AYvDI!?=HJlE`Y`?!ezHHx#%_&)T6zseYP7ZVJcgXpP=K{(J|q}($OFB Pl&cWLic_a`r|$j(gwekl literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb22f8ce8602019dccc44576819814b7dd4195aa GIT binary patch literal 2239 zcma)7OK%%D5GJ_~tz_Aj)6|LkNL3VVp`ww}M_xb><k6-;5%^N01%w8~TBPiicUKBY zDYCG-RQVzCv45ba{t{k$%BlC9I>WV;*a(8|Vu!=w><szMgAdl%YXqLZ;}4$v8xryl zPL_`k%su$@V<3VEnv#rmX~w!N^ST~I8B6^v=mw7W(lD!ZE5Q3ANTaOUtx@t55uvC& zC!!*23$I%h(J!P`eF+vx%d?yDz8<DyBYBdIhRWDTB$GrZ!`wE;dD0sS$<xG06{osI zZPm!B;pTWGVY0TLXxTG7m3{M)qCIN;J(b8F8ecvhF!$iokAO(hrGj*spn^RoT~Bzz zhY_|bLKp*45fO}`sEQhl710oNvHqNPBe5YiK~fcKu>CC+fw3L~f)9>})kFC7&p-@d zg$@e(f}W5c$bv4YzG9g07W5BV(1LK!_~q&XXMym6h9WSP0(AQfW|1J^D%|bi(ePQi z(ZK7=Knn7tF{cLH7`kA;5=x#j_Y>W1F<S!|b8X_hCshF2AY$!nmQMd9st)s4sxwl_ zBsQ`$iB+dROoddslc~=Bfb(1WdVX^vzVGqT<lAeef9qhN(r^0LZ{P0hbw<hPs<WM@ zSEr-=*>}Cc42ACF6Pb&l>KvLZy`Cof9c~~dozZc7bo{D%=RoFiI#PGn@D$~dW=)J* zoAV@34Cn1T>97a!zS~|Y&o19j)8>&p*3E3JO><v1HCW9Lv?a=gzG}TVO|6eQwz>xy z@}p8iWdkl^6WdTja!CQxQi1p4-k}5=)=On>>*ahjOmd?EC|}F8Z+-mLVO5fK*s_h5 z+r+xj2qdA~G-4s$pdp>DpE=5z6v4x~6v00+2?pdSgb+itsCo}%Ev9y0upaF3yxThG zy<u)*fSq$xcGwX*+d6gldUcgB2+SF$kSb&V`Bge)>JliFo~iSE-f4wHapjzEzu~Wb z>d!6wZ&%jGB7T=I#1&LHM+laOTcPPz-hn1yS<oFUnDc0=kMNKfr#FJQ#`%FX;4kAG z*O&epr-xfD?yh`RKn=^tMer|R3g{$9k=}-p9x)hU54vewToGa@Zz$t|cS6-;82#Vb zoXtHGpdLh@72d-4$=sg@d1EPEuu=l`Oy*(Xn-H}ZU|*R6a%K9p`#abnV4H&F7e)A@ zvXq@rN{T?Rn`9n5o&1JgpwSe55x9opqlK2Yt2SZx3eVGu)cY`4PfKHK&?}VD&k}Q} zFyIPXjDkCXxIBUS5~5WpGc+72*-xgHr9;aO6C1dHElt!G>Yqj1$vy$Oz5)cRrN-*C zMz>kRRgKRs&<3poUt_bXivSks3VB3*g}i{tvUb#lC~-#28K7|kM(-47XsCl=iSyjg z>(FqWWWnbCDYAh>c26*f7Owe#E41emED&#Z?-3jqOHF--<QygloCBs6l(q9Y3cf({ zC6X4Bvq0F3hp~1Ih$G6p1n~wa>I*;!VB$MuF0eY=0DiXP(0JQlnCCTYMtPh`&TWnJ zY$(Pl^3W@uj^ngkQ6J()K1PD@t0t09k+@KOh1~0HIu84syWy(9=nWtdjjEAXzO_qk zZMU_CPWxjsR^U`&qfs6bybA3mTnFvbtDvousk?$~SYFvKtDqO}$67jLwsQZ$Lp<x- Wwqm0@<<ah9L(_QmUW9ak*ZU8~1M6V` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000..a1158bb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + # pylint:disable=arguments-differ + keys = super(Trie, self).keys() + + if prefix is None: + return set(keys) + + return {x for x in keys if x.startswith(prefix)} + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +from pip._vendor.six import text_type + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates"] + + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except: # pylint:disable=bare-except + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..1ff8041 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2947 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring '</>'.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9631222b9a549cce589ea171fc428ccaf0daf88 GIT binary patch literal 209 zcmZ?b<>g`kf<1{+u^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{UXUr>};mRORi zUzS*;pO&AKl3G-(pIfA#locOuQEZxLUY25#9A8joWKfc3k)BnQW0+=YX{jHgUyxa# zo0(T!l9-dDTTzf#Zk(J2G%T|KjN{8v^HTDQ^fO9wb4+tGll0Rvb4oxa$H!;pWtPOp X>lIYq;;_lhPbtkwwF9}S7>F4Fs|7hh literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60f6fb6d1d57dcfb4ed18ce1de5475cfb35b7ab7 GIT binary patch literal 1325 zcmZuxOK%%D5GMB_tz_9T`T&}u2ObKf1{!Z)Mw7xQk~VFD9#o(SVqlS!rj}f5W$wcy zC0l}gN)EmB+-q{|f9NmSYft$J?Wr@gmGn?zXE+>^^Y~`C-)wIW35-9*`%ixl3Hb{b zn-PI<56J!qOcF^osc1&4APcH63n`I-40Tk+Sqw6fk?vLftPgT5d(TOh{6J)1CeMjX zR6H9z3$uY7JS2O=S749qh20G?v5lTP#mlN~jO!9vE=pTAb+<dO%e;|_>(VJBw0%YK z4(+0eunOj_pNv#S$p>Zba@@m#Gh{)&1+pIiTSL@0J+(VBxL$=fNfAIC(dzG?m7ANI z3HaL9G_5IxQ|weNS<x7;cFvR&2+=Dn1X<Q6!y$ulf3s!TR4fz|tQM8Bt;iK~Q{h++ zW+#fN(oL0N$H(KQR>#K-4KoX7>yv$Uq`WOSdJ8TzRVxhM20CxxaxUi9ua~z#FUz8U zoNLG2vQ_qDW*c^{;99*<#(6`py|@O$S5@nl*Unf`8teA2f;R|NM@$UUA0Af$>6ig5 zJ^Sa^6u?*j8tFoqv}iP-ZPUu6lNslC>_PqILVl6+cJbLKuDEkDGy2ow;O^b@QQDU6 z?XtE`Xnp<<OKtXDd{C;tN&F#-vkM=>uI((xTK*V4DivPQ^sIG8Y;{@u1uNcG(R$ zt~nGXf#_@ij3j0RJV$XeP=61|z6VT^j7pLPl4c=xDRg5bBdB@Y^}hEWS0CQrcw8yV z-njIIR$5hnvwhuJh!YaJv=Z3GFOJOU3+Snr^Z|J~zNBmFdo4Kana3`CMlOSkk6Z*= z=(iW~OX7Mm`YnL7yHA44@G@FQ>tG!olC!Ul2uN`5kgVxrXyUV-BY003?YN7u)O$gf zJaodiN8+SQzQdxT6iML(yoC_3+3TAggk`pYbqVMAY&bW4T=uYUmF!|rR@OrYKtxvQ zqKjQ~s_HIA0Bjdw3wQBC=(&2+3}y>0zYXkNAiE2U(6{J__UI1Xg*l<C8&|OIZ#<8| z1B8M0IPZp>SB;!<-MO&4s?+>2ofd93n;Y|8eO%(fh@WaMR-dD4`McIga;+XtkKb z0|u)G%Wpztc+6m{ctE<XywO_a4*n|E!{PJyHvZ3DmmFS2`Zc}~i+0`#M!_gdw*Cdu CA6-QN literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9a3faabad366b635abeeb9345b935131d399760 GIT binary patch literal 859 zcmZuv&2H2%5VqrNHuOh}5GM|tIFLgd{#LXSLKR4G>jh4ckd?$v@yhwZb^=s;+rA9% zz?0<4iC5snjMJ^Qh>>Q-jz7;g-#Bj$5BCVz&-}rshm??CxY=3=i!*Th7=j>zYEsjT z)<G83EMt_sCn6B+iU=md4a;UC{6Lb~Z$OiTjf=dnt?r%Vs_t6j##pF9S=Bb<-M&#} zD<s#-Nt0_^;+?Gpus8#^k03~rQ9-gmP!U{_j0q+}$f1~t2=YwKfioVXcS=L467Qm6 zMt=)#QR14e2?rH`rsoMABir_-lu0m#R_e+`fcZg84C&91c18`klj)F~v}(1G#-_DN zixuZ5cG<if#EX)5!?P!@I=NUG{j^%1o~9quPIX7Bu`bv8=v&u(eO|6E@uPP>$VRj# z{p@PJ)T&4;-?L4N+{)wb`xtYs8s#{jVb@*?y<AMnj<;teJd-!fw<J2UCM&w3lSB}P z!}Y=vYUY6U>ZWi9ww@0loTKXh@cFY_BV_>eBRzn{#J8rKV9PkakS=%bnl$jFW7y=i z{Fi#4^J^^U`#bFSZq(i!pC=J^id8rt_c*Ux(Q8~EaQ>yw^>kwJl@0b~78p>|PC&s1 z=Zb%|#n+B$%wp!hAq5n!de<8$Y;ddwwHic^QCqBJ={$6&q-U50`D*IvHNJ@-<bC!R DeO1D$ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50d749e35dd9065aa0e2f974f3d5ebe84e18e465 GIT binary patch literal 1879 zcmZuyOK%%D5GJ`#DYC7`PU@tWMSvc3aMYLEBu#>#c_Bcd28fXqiv;vqr0kXVC6ZDc zVRa~)-hJqyC~~lmy%jwgJ@yCmyoX$R%3mmoqC>8nxIrjzmgIahoEgrHzFJslA{f6% z=bwCc3ZcLB=6Kk!xB*js4um0w6O`f*rz9k)6<QcE!mPwjozTJPE@C!wo+IXPXXt)! zg)Va+ppN$nWKqYemZB}0Cu7BFoEEuImCxcyEaN<@+T$$l=Zw=NR$N4he1)|PuI#Ny z^1fDZJP0gqz?1<HjzY{(NEi++ZOU^L+O-j(Q(s=Wcj5$ePOsg|hP<z2u(^3P<thsL zJCTrFUAx`8`OU3+y}Q>pHv<)I2XUtIV24L6$Oi$-`{R^ns&Bz<dg!l?%1xMZ6^KGZ zd_YQ6;zNQ_2`g$b41SZTx+!?1xD2A8Hlo=K=Hp5vwgZ`uMW0^@)DEAo1C{UcERYHW z)3?w(g9ydhc8x#YfkXgayutQ5ws65N;Q^_9O5-e6lve(+1iXYTc`~Tn`hL*>;4etD z;Pdwn-9p3@FuFU5M0b!Uj0@RKMR#jR=_R?IeKBF5^=UEr<Rdk>v^^Bb$Ak6Dm%AI? zA}-eAOsXhJ*7l0*>8JhSR3Dm2Cp=@h=<cXASx@4v?!Y{X?8fF%sD2PSe~^pCGvR|R zdP*H?<S*jsQXRpI$Nuzng6N@>SNq$CDPO`V!!ul>A*AcBKO@^{X6@s>KNKF41FJ-b z_!ip7Pkx)(rOn7WG;>OaS-V8shrN9c9oUDEz_9<Cxih?vvmx-kU9yk=hwuUMFKf)) zy_X=@1Ucsr-9k?uJ|>UJ%$xbMM(KeC4e{fs9F?VS^qvB#BW+tPQ+lO8AXgD<&B%SE zQEUMaW!W(3MZE@|J1QTc(iQ)(rCM%RuiIMB*|{dRRBOrJ@&c?rD#3Pn#4P62((Jt# z)<XoP>oK35)>>lx`fQmwY~=+pe6VVC!T7&y{67Nu6A?1HA+~UXb>OlyhgeIQ+kSeN z?!DDgqklb#-p8Y#9~uAIS$H+fTyxW(fbmNE5MwmDP}*AW=mOvnl-2va&@Tk1x<V^k zJu7(SKTwfS8_{-UXHm*4Tk}FM&T5c<J1x{R!`69rr?Oe3qRN}++s3rHqg1iRN8@-h zZT0g^LBX$S%^lJMSbZ=(qxhaO8T{qz-tnRASYi<}PqZ~z0Rl4O416p1cE;e+4mknP zNgFnbTq<K)$2Z0IR=q;Ef_in5{3#ce0}U~il~v?L<wivTb<}AJo%EFh#in@JG{rN> z#~G_U&4(UQIi``Ao5K%wB1yH2)VN6J4p9@khK`slqCPh+RL&$y#@sZ6nk>LoLN~f) znDSd72-~=cZE_a-@M~kAG;y2Q_&n@v+`^}U+IR)d+pu=YD)1KJqzyda0D6_Quxn2I z8VzSHa<axv40;_`H!y7>1f)r6nzM1D*DXp%<0zSPJW8QYQ)=3VvGs)gx~&Q0gl>qs zQ%Fs;ss1U`BzqlCD<6#281jk={SPB_pBK9OROrp~yi0B6U#-o$t{>MltQFF-{sYa0 B<G}y` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39df5f6bc45472ad2daccb75cb44cae511f8a1a4 GIT binary patch literal 2643 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 al0rO%^HJ&G$JnqWBAYjw5a>A=b@Lyj2f+LQ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf24b83a4ab3d56fbe0f538342aabeb1793f97b6 GIT binary patch literal 2770 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 Gb^Bjz6rJ7x literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b208bb4f0dc0b0edbbefb68d7a0c36040cbee75 GIT binary patch literal 16445 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afdecac8bbc6a9e66632c4d417142f8a64428423 GIT binary patch literal 1363 zcmZ8hOK%%D5GJ_~?aGp67;aLhIS43n5aMK;v__mFD4Mu#ZiZ0>ZLo#0SS=}gW$q&+ zr8t6oa?l@;L(l55|Dos);k76Kg`7GgMR5==W_CFb&g<hoYqy&O)<5a3<9}U3{=>~` z!JhmGq)T9&a4JbbV_LA76;A9>lribXE_b*qy~2-uka^sfjUtGHB8)@WH|9+d{zc<Z zxbrn0i0}r1UF$jFA#c7Vyea%q`_hTqe2ur>l6al7KIyfuASUTKwv!HYCC5f2c~Mu& z*nsDgT<2A3H^yb2Ra_)8H$tUSA6`*(qShUxT3j*QFuSfYo|^PPib9k|+m5c&OzfYg zD$T%8TQc>2zoU=uW*Bm{J{G?N5<z0hNz6En9pQ4uof9TJ;a}35<dVh>?s5-O54aDh zH?042F5%?q)BQ@ywAMm*U!Ovbi@;rRo{8FY^RinjvC}o;+@wmRJKeP8U7e{Mlwy^v z12#5T*<@HBF3b)IQ`U1}oL<oLKMfhtIh#R)e<H_!T(BAAY@1v-Glx58Og)=Xy$3RP zo6N|_IrCA%y+`DNmPcUYgU!nsMdIEbO1}q>31}LinSf`oP1J;k`1OR8w?X?3v`x^y zGwxD<NtfCg`;}1gYV$XM33O%cP+{`cHE(LDs1G%p7wL(0%d`;6LzRC}aujv?pAE>x z`MsxI+q|Ay&r?1)sWtQrk^~`;B=(C%kB^klLQTZ=%(D-ZNEUkCbFHg|9L53kcVTKh zQ=N%Yt;2bL6ZI9m-p`_1<&)HiXp*XESV<0Wi3$}BMoF@#cgsf;{#};TlZW4!;oiwe z$p^#T$B&~IQJvTK@=}{r%6sQ^`TE;zG)3Wpl8GpJrJ_?)$X%HaqTvEAI=TkQ{rZi% z0V!+%>07`Eb?GJz;Mt^2)&kmM_}*aC&Ju0+S3NlFh1d}6D>S5;Bt^x?62DtX@@kyQ z51K}j@G1jwI8@bClv)_;%3K>2Ks<F58RoF)#V71G%CPM%AdN!^Ah|8JkbOib4jU1= zk49)|$eeNt*u?A24%HUO;C8n9M^E<;`pGW`&ktT&M~?@1e-ZGXhx`&8?%-*7uL)JS z?{%=i;n<876sS<69Ap^UG9?uL-WEu)VOHTp;1{qgFhmn~ROO{@WK~h;QmC)d8f#me g{z(Ri2Zfc};K{O|KVXF#;j+a7oCM5d-Pzp!A8AovHvj+t literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + +from collections import OrderedDict + + +def _attr_key(attr): + """Return an appropriate key for an attribute for sorting + + Attributes have a namespace that can be either ``None`` or a string. We + can't compare the two because they're different types, so we convert + ``None`` to an empty string first. + + """ + return (attr[0][0] or ''), attr[0][1] + + +class Filter(base.Filter): + """Alphabetizes attributes for elements""" + def __iter__(self): + for token in base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=_attr_key): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000..c7dbaed --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ``<meta charset=ENCODING>`` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type + +from . import base +from ..constants import namespaces, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class Filter(base.Filter): + """Lints the token stream for errors + + If it finds any errors, it'll raise an ``AssertionError``. + + """ + def __init__(self, source, require_matching_tags=True): + """Creates a Filter + + :arg source: the source token stream + + :arg require_matching_tags: whether or not to require matching tags + + """ + super(Filter, self).__init__(source) + self.require_matching_tags = require_matching_tags + + def __iter__(self): + open_elements = [] + for token in base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" + if type == "StartTag" and self.require_matching_tags: + open_elements.append((namespace, name)) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) + + elif type == "EndTag": + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + elif self.require_matching_tags: + start = open_elements.pop() + assert start == (namespace, name) + + elif type == "Comment": + data = token["data"] + assert isinstance(data, text_type) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + assert isinstance(data, text_type) + assert data != "" + if type == "SpaceCharacters": + assert data.strip(spaceCharacters) == "" + + elif type == "Doctype": + name = token["name"] + assert name is None or isinstance(name, text_type) + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) + + else: + assert False, "Unknown token type: %(type)s" % {"type": type} + + yield token diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Removes optional tags from the token stream""" + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an <code>optgroup</code> + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..af8e77b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type <application>/<type> + (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + """Creates a Filter + + :arg allowed_elements: set of elements to allow--everything else will + be escaped + + :arg allowed_attributes: set of attributes to allow in + elements--everything else will be stripped + + :arg allowed_css_properties: set of CSS properties to allow--everything + else will be stripped + + :arg allowed_css_keywords: set of CSS keywords to allow--everything + else will be stripped + + :arg allowed_svg_properties: set of SVG properties to allow--everything + else will be removed + + :arg allowed_protocols: set of allowed protocols for URIs + + :arg allowed_content_types: set of allowed content types for ``data`` URIs. + + :arg attr_val_is_uri: set of attributes that have URI values--values + that have a scheme not listed in ``allowed_protocols`` are removed + + :arg svg_attr_val_allows_ref: set of SVG attributes that can have + references + + :arg svg_allow_local_href: set of SVG elements that can have local + hrefs--these are removed + + """ + super(Filter, self).__init__(source) + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes + # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and + # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI + # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are + # allowed. + # + # sanitize_html('<script> do_nasty_stuff() </script>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "</%s>" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") and + not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharactersNonPre(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 or + self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing=token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"gotName": "body", "expectedName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name.translate(asciiUpper2Lower) != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + # pylint:enable=unused-argument + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + "inHeadNoscript": InHeadNoscriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def adjust_attributes(token, replacements): + needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) + if needs_adjustment: + token['data'] = OrderedDict((replacements.get(k, k), v) + for k, v in token['data'].items()) + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py new file mode 100644 index 0000000..53f4d44 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py @@ -0,0 +1,409 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +import re + +from codecs import register_error, xmlcharrefreplace_errors + +from .constants import voidElements, booleanAttributes, spaceCharacters +from .constants import rcdataElements, entities, xmlEntities +from . import treewalkers, _utils +from xml.sax.saxutils import escape + +_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" +_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") +_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" + "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" + "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" + "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" + "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" + "\u3000]") + + +_encode_entity_map = {} +_is_ucs4 = len("\U0010FFFF") == 1 +for k, v in list(entities.items()): + # skip multi-character entities + if ((_is_ucs4 and len(v) > 1) or + (not _is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = _utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if v not in _encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + _encode_entity_map[v] = k + + +def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = _encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + + +register_error("htmlentityreplace", htmlentityreplace_errors) + + +def serialize(input, tree="etree", encoding=None, **serializer_opts): + """Serializes the input token stream using the specified treewalker + + :arg input: the token stream to serialize + + :arg tree: the treewalker to use + + :arg encoding: the encoding to use + + :arg serializer_opts: any options to pass to the + :py:class:`html5lib.serializer.HTMLSerializer` that gets created + + :returns: the tree serialized as a string + + Example: + + >>> from html5lib.html5parser import parse + >>> from html5lib.serializer import serialize + >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') + >>> serialize(token_stream, omit_optional_tags=False) + '<html><head></head><body><p>Hi!</p></body></html>' + + """ + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + s = HTMLSerializer(**serializer_opts) + return s.render(walker(input), encoding) + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = "legacy" # be secure by default + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + alphabetical_attributes = False + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "omit_optional_tags", "minimize_boolean_attributes", + "use_trailing_solidus", "space_before_trailing_solidus", + "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", + "alphabetical_attributes", "inject_meta_charset", + "strip_whitespace", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer + + :arg inject_meta_charset: Whether or not to inject the meta charset. + + Defaults to ``True``. + + :arg quote_attr_values: Whether to quote attribute values that don't + require quoting per legacy browser behavior (``"legacy"``), when + required by the standard (``"spec"``), or always (``"always"``). + + Defaults to ``"legacy"``. + + :arg quote_char: Use given quote character for attribute quoting. + + Defaults to ``"`` which will use double quotes unless attribute + value contains a double quote, in which case single quotes are + used. + + :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute + values. + + Defaults to ``False``. + + :arg escape_rcdata: Whether to escape characters that need to be + escaped within normal elements within rcdata elements such as + style. + + Defaults to ``False``. + + :arg resolve_entities: Whether to resolve named character entities that + appear in the source tree. The XML predefined entities < > + & " ' are unaffected by this setting. + + Defaults to ``True``. + + :arg strip_whitespace: Whether to remove semantically meaningless + whitespace. (This compresses all whitespace to a single space + except within ``pre``.) + + Defaults to ``False``. + + :arg minimize_boolean_attributes: Shortens boolean attributes to give + just the attribute value, for example:: + + <input disabled="disabled"> + + becomes:: + + <input disabled> + + Defaults to ``True``. + + :arg use_trailing_solidus: Includes a close-tag slash at the end of the + start tag of void elements (empty elements whose end tag is + forbidden). E.g. ``<hr/>``. + + Defaults to ``False``. + + :arg space_before_trailing_solidus: Places a space immediately before + the closing slash in a tag using a trailing solidus. E.g. + ``<hr />``. Requires ``use_trailing_solidus=True``. + + Defaults to ``True``. + + :arg sanitize: Strip all unsafe or unknown constructs from output. + See :py:class:`html5lib.filters.sanitizer.Filter`. + + Defaults to ``False``. + + :arg omit_optional_tags: Omit start/end tags that are optional. + + Defaults to ``True``. + + :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. + + Defaults to ``False``. + + """ + unexpected_args = frozenset(kwargs) - frozenset(self.options) + if len(unexpected_args) > 0: + raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "htmlentityreplace") + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + # pylint:disable=too-many-nested-blocks + self.encoding = encoding + in_cdata = False + self.errors = [] + + if encoding and self.inject_meta_charset: + from .filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # Alphabetical attributes is here under the assumption that none of + # the later filters add or change order of attributes; it needs to be + # before the sanitizer so escaped elements come out correctly + if self.alphabetical_attributes: + from .filters.alphabeticalattributes import Filter + treewalker = Filter(treewalker) + # WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from .filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from .filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from .filters.optionaltags import Filter + treewalker = Filter(treewalker) + + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError("System identifer contains both single and double quote characters") + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError("Unexpected </ in CDATA") + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + for (_, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) and + k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values == "always" or len(v) == 0: + quote_attr = True + elif self.quote_attr_values == "spec": + quote_attr = _quoteAttributeSpec.search(v) is not None + elif self.quote_attr_values == "legacy": + quote_attr = _quoteAttributeLegacy.search(v) is not None + else: + raise ValueError("quote_attr_values must be one of: " + "'always', 'spec', or 'legacy'") + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError("Comment contains --") + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if key not in entities: + self.serializeError("Entity %s not recognized" % name) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + """Serializes the stream from the treewalker into a string + + :arg treewalker: the treewalker to serialize + + :arg encoding: the string encoding to use + + :returns: the serialized tree + + Example: + + >>> from html5lib import parse, getTreeWalker + >>> from html5lib.serializer import HTMLSerializer + >>> token_stream = parse('<html><body>Hi!</body></html>') + >>> walker = getTreeWalker('etree') + >>> serializer = HTMLSerializer(omit_optional_tags=False) + >>> serializer.render(walker(token_stream)) + '<html><head></head><body>Hi!</body></html>' + + """ + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +class SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 0000000..7ef5959 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py @@ -0,0 +1,30 @@ +"""Tree adapters let you convert from one tree structure to another + +Example: + +.. code-block:: python + + from pip._vendor import html5lib + from pip._vendor.html5lib.treeadapters import genshi + + doc = '<html><body>Hi!</body></html>' + treebuilder = html5lib.getTreeBuilder('etree') + parser = html5lib.HTMLParser(tree=treebuilder) + tree = parser.parse(doc) + TreeWalker = html5lib.getTreeWalker('etree') + + genshi_tree = genshi.to_genshi(TreeWalker(tree)) + +""" +from __future__ import absolute_import, division, unicode_literals + +from . import sax + +__all__ = ["sax"] + +try: + from . import genshi # noqa +except ImportError: + pass +else: + __all__.append("genshi") diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84ffd48373b59c923adc776754e18c0326e0f3ed GIT binary patch literal 948 zcmZuvPjAyO6nD}t?Xo{qXeUnL)aI~+e-qo(O=!}jA;E-1r9mXH+}druId<eYVdcVC zffM38@F6(o%4uJL6VFMvF$qV0dH;UDXZyXQjSU~c`bi#q`0gU~+Zxxa3(5=F`9}~G zC5SrI6;A3VZrVy(X*+2<h_+~3tfXGzfxa?xlFp(BJ`a4|r0bwFB)8g#tzP*0)Is)p zkL3D0#5!Mn+WF=Hs{0m&tK^r1&`2{D5K1z`bRGz1f`uxAiIOGLCYWlK21>HP*tFc} zVqyvnrV5BuX3n(lA77F*6Kvo2qX>YMZI6YTT<q@$*}}|~^!*@ch%%l<xMY$l9q=?$ zP+)FSu_O5Se>u^0FtXKe&bUO*n9S$ACZ}o=90dKL%|9HD6<r*j@Q1^=)`oHI?%N8M zXIyYWnFhcO{frs=3`b35&}TNUA6i64bbdGaWc2#go7y|DX$Svs)(C3@c>|2<-vAC+ z$3_r4BjVyN<Fb4cxUFu>H<!dq&c=$2!i_e#<*UyUhQ5CVgM-3Wb&rg5B?`lE^Ilb# z@{;FV$*NaKZu^7<ho%#eU%?!p(5YHExzt{xdrb-50rNCmt2!9NEikTpjHiVi0*p0` zFVZb5+8`=agKa7i0>Tzst-Y)}eXO<8l}EA+`u_vzO^dSP&zCsUyd;LjCDHLz+3w_V zs^jrF#=H5Bd|uLL6P%S#9+~Ox>|Be-)1AG&cof4tZF89$sJ4BX$xlxw=bx>!-pfI& wyKg5fwvTu{L@~x(a)WV{EvoJ?RkRT7@ID+T?}2DLTkg8+xvtZ5HXYCX3#}g@4*&oF literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c8c3cea970c12f6121f8d9ba705f1c6768810e2 GIT binary patch literal 1545 zcmah}OK%%D5GJ_~t=94*N@~Dv0|*6jP?1<^YNLr^7)@;*0whXX3vIHfA<#=oUTa?_ zDaCfBlk)@IL+|#n=jPa7!fQ{y_moRJT*-EV9!i0u;c({T%<$uWJ3H$m7=O~`-9KD} z{xXZJK|uKirhE>9A%<g=-~cBiAc+-N*w{#HCr;obZr~Pc3)ZEelz4%cl!J2O2YxaW z%)p+_oVO^bFn0&lOP7F%>Xx3Tdoqg$ig%(U&xFz*i-wVmvQ#e&(kRRr@5GVfg2u8= zwDWz7CR{sDl@hY<XlJMW^oO>#nyqbZx0|opy0rE3#fxSOl<k*W?bqKmLu`(M0o4^V zgn#)8tUWZwXZUD!gtpNc-u+@sMug!dG`2<-BYjsq8sT#UHfsr8V2sk`5f;xCX7)K5 z;S0>1uJt3r1r9{G5b+MYOG`)y=1nw^<t5Z5i)d`8#s;ggtt{rVnYUBybNd1^IK`)U z>?lXMBl{GOoG!V-2kc6ph<9wZ$ZQt$zo+Nu|2d~LLAydatN_+rpPXT_piDMU*++Zx zfL&4LNuD4VmQ0SfpaSd0@38U{8bRko`@g+lRk+>TC%<iF>5vOmqctTsuc-{Q9#7?d zR2Y1}24kIyUhNHy`&_Ko)IPX@?__Nv2C@h=hU;Bp52x6Xn!*UK1|pT~<^*7h%0w;e zULBVLh2+Fh+v+&yKqG%^p9&fRt)!mc$!W+xFxZSLs)3xX%YR^qTfi5H@pcpys!e;^ zYbLomHd;9aHcAtJ;{I|^j_*lr8`CxCEQobr?ikLkg6N?U+P(iX8RIcg&_#ye25`SD zK4-wGMU=W=gIfUxkS_U^9NN%NTNn<vuFkkLt2!127@iPWd8lm)4?;Ub8V~sING!w7 z`*9-|(U2<M7*f&bW-)_u8;NM_9dtU6<y!jnkgbNDeE8_0>OSrri1^Fy+LI@Zb|a7S z2T>{&jpGMLdHUw7@ZiK4i`g0Slx3o^uabBzj`kYn(kP?3>1Jbc$1C~qdw(O2qzbbn z-@FUyNb@mq@yT74b*4@maTda}-dwry6t}@kyUmoD_LjD?B;l!ox15FM>a>>+_Tngf z#<VAorQ*pm)~fs3rFjlniL!~d53(o~=Cx}Fz8r}ZCD4m*3D0QegC}M{)LrdP=myN- zM@l;?>+@7pjKe1&v}5`zi+)bTr^Z^ouE8M74G_q)@f`Nxw}5S2#WpeeVj-*e4(Qhw zQYAjF!p<D7S~hX9s6%|KKCAssr#k>D^G-*Yb_qitVS@-}racQY!6&7d0w<LfMVZoX gDk~sANZSxX6uEmFNyY{--!vqW2ILM|z@J(F0-&XdbpQYW literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46f01886ab5cc98bad3bed2c16780abd3e545951 GIT binary patch literal 1495 zcmah}OK)Q}6t?d>&t|G3lv!PghsdInz)+Z}Mir&g5iF>XGN|ZkMptg^w72nn#CFoO zN;V8XfS=H?L;MBSh!sD;D<oFKiWLi19N%=>A`QY<K0ZF@J5T%i(?+9;VEjbxKL680 z=y$VuH5_0*fhkXbP((3DDUNVzMOJD@Ha0SgJE<GFz}wW}Ug}4F8bkp`35qJScbR`# zU82Y6`Q2xBREz3SgVm@zs)!xdU=>z-gvL9Eh<eoj7DY|!_E9Hz3DHo;)@$TQ=6s@9 zoTNoAln!VzO=Oa1x;4p?K~7oB6U7AKvV(PNS1FMk0bU;TKTiw((lUN5{U)KO6RDo$ zf+fe<4NA8s*?*`G2FBJ5A13q#?ZK4qVT9)R5-kx%vryqntE_F~nYFMMHfZd*HMf@* zM&tEEH2ZaKD*t)m%pHo`XyMLXYK<)M*|<0E0dJ2y@x3xyr;U{R!diIX!-KusMnJtb z8d|G$?k%C;VB>@RUx4yohbki*&jFx*`Cn88;{OJy0DM6POAL7%>nd3PG49ct?5PT^ zzrf$%aS!TwUB%V8W$eDgW9QKHre=CW8*q-ziy!w0=V5>M>rI}FSUAWt#WEG1kc@IB z!XqLX4f8Big0VBgM<81*)oKW1n~38p!FH%l*lnE3!-)h*UIMPQMgU=^OsFtXx7=LC z+&0-<C$Ms|LTN{x7fkz)^MPUD+5~+?gnCMjb+Dfn>fCS+C5q@uMp7mVGGN*<tf<4~ z(B6JV0RxuRy%QqH0B)w#Ykh;eCGhw1G=(-ixmf=y8)f+!)Sr(SPzZa_sq2O`aUqY1 zf$3%;*f5#JDJhC1JJv4T_*Clk67^-N`(mXME~Fs>lS{MI?sH~b9Q1XaW%OoO9o*#C z+?5i#1wYlk5V_DTK>o|Cu7TuLHXUDkt0U6>RZF$EN>DUSV7IJAR7#$}4=H~@;w{+y zebFsMG9`+2r$lszIj7K`ZYsJ*r*Zs1Ze<@&>4$^3n10Yx!w1Kwg1<l9dib#Wv|A*_ zW|BcgoNvyG?Ck#F6r3eRIpZm$my7O+O8FK~j=JVD5lRZv{jMald&Rl-R2~D{fIQ?! zKu{3ib=<P5IDpS7sRt4dKBK8$(-v@+)v^GM#XDfxS<}@x9!}Imus9axnGm)i=CO?K z%u;^O1cg;V8cdXjqAPGIp@2+DVIGw7ki;9nX>UsSgh>$^^9s)ggddnIWx81gEW3A$ eylt$4M`=zcobAAagrvc4SanF#!5ffp-Tnv8o2+{P literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 0000000..61d5fb6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName, Attrs +from genshi.core import START, END, TEXT, COMMENT, DOCTYPE + + +def to_genshi(walker): + """Convert a tree to a genshi tree + + :arg walker: the treewalker to use to walk the tree to convert it + + :returns: generator of genshi nodes + + """ + text = [] + for token in walker: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + text.append(token["data"]) + elif text: + yield TEXT, "".join(text), (None, -1, -1) + text = [] + + if type in ("StartTag", "EmptyTag"): + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) + for attr, value in token["data"].items()]) + yield (START, (QName(name), attrs), (None, -1, -1)) + if type == "EmptyTag": + type = "EndTag" + + if type == "EndTag": + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + + yield END, QName(name), (None, -1, -1) + + elif type == "Comment": + yield COMMENT, token["data"], (None, -1, -1) + + elif type == "Doctype": + yield DOCTYPE, (token["name"], token["publicId"], + token["systemId"]), (None, -1, -1) + + else: + pass # FIXME: What to do? + + if text: + yield TEXT, "".join(text), (None, -1, -1) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 0000000..f4ccea5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.sax.xmlreader import AttributesNSImpl + +from ..constants import adjustForeignAttributes, unadjustForeignAttributes + +prefix_mapping = {} +for prefix, localName, namespace in adjustForeignAttributes.values(): + if prefix is not None: + prefix_mapping[prefix] = namespace + + +def to_sax(walker, handler): + """Call SAX-like content handler based on treewalker walker + + :arg walker: the treewalker to use to walk the tree to convert it + + :arg handler: SAX handler to use + + """ + handler.startDocument() + for prefix, namespace in prefix_mapping.items(): + handler.startPrefixMapping(prefix, namespace) + + for token in walker: + type = token["type"] + if type == "Doctype": + continue + elif type in ("StartTag", "EmptyTag"): + attrs = AttributesNSImpl(token["data"], + unadjustForeignAttributes) + handler.startElementNS((token["namespace"], token["name"]), + token["name"], + attrs) + if type == "EmptyTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type == "EndTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type in ("Characters", "SpaceCharacters"): + handler.characters(token["data"]) + elif type == "Comment": + pass + else: + assert False, "Unknown token type" + + for prefix, namespace in prefix_mapping.items(): + handler.endPrefixMapping(prefix) + handler.endDocument() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000..d44447e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,88 @@ +"""A collection of modules for building different kinds of trees from HTML +documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1. A set of classes for various types of elements: Document, Doctype, Comment, + Element. These must implement the interface of ``base.treebuilders.Node`` + (although comment nodes have a different signature for their constructor, + see ``treebuilders.etree.Comment``) Textual content may also be implemented + as another node type, or not, as your tree implementation requires. + +2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits + from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: + + * ``documentClass`` - the class to use for the bottommost node of a document + * ``elementClass`` - the class to use for HTML Elements + * ``commentClass`` - the class to use for comments + * ``doctypeClass`` - the class to use for doctypes + + It also has one required method: + + * ``getDocument`` - Returns the root node of the complete document tree + +3. If you wish to run the unit tests, you must also create a ``testSerializer`` + method on your treebuilder which accepts a node and returns a string + containing Node and its children serialized according to the format used in + the unittests + +""" + +from __future__ import absolute_import, division, unicode_literals + +from .._utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of trees with built-in support + + :arg treeType: the name of the tree type required (case-insensitive). Supported + values are: + + * "dom" - A generic builder for DOM implementations, defaulting to a + xml.dom.minidom based implementation. + * "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to xml.etree.cElementTree if + available and xml.etree.ElementTree if not. + * "lxml" - A etree-based builder for lxml.etree, handling limitations + of lxml's implementation. + + :arg implementation: (Currently applies to the "etree" and "dom" tree + types). A module implementing the tree type e.g. xml.etree.ElementTree + or xml.etree.cElementTree. + + :arg kwargs: Any additional options to pass to the TreeBuilder when + creating it. + + Example: + + >>> from html5lib.treebuilders import getTreeBuilder + >>> builder = getTreeBuilder('etree') + + """ + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..783f00f815b069d54743e5a7ad08bc70e2a07ef0 GIT binary patch literal 3329 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbd060fc5820d6b0f16ac94d7a5154ce2737a297 GIT binary patch literal 11252 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 bxd<e%m~-rsc^Trp1Wa%i*Rr!vUs(Qs6DGkk literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e7f6c2efdb9310c3819c9d342c25f8ce6305200 GIT binary patch literal 9282 zcmb7KOLN>-cE-h{8~tR9qA5ytJhH~}3^OBAw#U!N8rym}N{w2M#j!ldIGAPwEq4?B z-~~uiUEN8QsVYfTvrtu1sY=yUh0HFSEV7tYenpm8WRsQuKo+hn@||-55KXH`G+4NO zabGy++;h+Q&H+EJ)yf*K|7@N6a{q#+{SQ5)myXJZxWfqwPxC~e^@St)x}*0E#}L$} z2WH=LEUp_tp<i^0ecQ45*$hff$+NsdQ0`Zp3fhXEje6Coa=jE(`!%P=^>R?}FE|UR zSG?*&&1v`xeq&!ar#$nnwp#lZ6lkkPywKVVhrv$dyWRe1D5Kc+y1U)5I~>G~ok6!f z^n5qyM!swX;i`!1w|An}X5im$jYi$U{Z&0K_Pc|wH|)n|6Jwj-3R+jh=4LDOza@t8 zP-+hcVbmH#v_yH(>iglS)%NLWsXz2~0{>>K9S!A!<fl!G&_(kt+y?IOa}<yDC*l(b z&eI=4RFSrCJkdVU9%+w^j_w(r`Ox;vNc42H8)z4g^hd@cvtyFb&{sg8v2RQT3GSix z#Ei^+4dN&@+gLoivVHm$ntaU>p62N4rH;X`(Hym;=2&Ver{I;mGUQxL<ZXL3ua4)E zx8ODKTlP-jMT_Gf-S?yG!~VxR-N5tZ+Ld6~hG?&@eH2CVSKTmb)640iU%Kz&4oRmb zVxqZF5iBE`5M9v^{JuYkunA`92OU|*pnub313%x5*GICu+lu`4-IiSM4C!UzdS9+@ z_FVVf@U6i+yWTI_?r8Uo%Tedu`#l-F-g)c2_trPoN8Qn-E^Sv3T-qBAzJ9aa!(!bL z-|ntI@P=~ztEeBm6?8Y(BkB8_ikEO5YOpqX5ZkT`orqj_kw|BL#Q3Mr;d?Eelx;pK z0c|`BfS8K3iPppB9vFw(zEEN?W0SO#d5_C22(h~fZ4P5|%YOg`lM9&0B2mRDJTifp z<hn25>4y-=liEZST_)~~z+d121d2%P>#`B)--y9^kZbhJ18X7<#nhPS6T>Y`3~nt> z#FcC>?YN91$48{?$5ym63jFwVa~R#~qegq|dpD#UCT!M*Uk`kFec0ZiE@z=FeQY!- z5c3{eyRBfymrI~%)noz0CLKEYB3fdTgmhdY71s^@2$Jl(?g~b+!fB!`3VK}>#Q0~= z-@R=9%m!u}TvhVn4NN!Bh>gG>@ZKqEpS@j0*Tpc`Jx_!s>hzQ66U1|7h{-nVPiRws zGk8Q%Y>`an=#jhtf_|JM>f-Z=;>CU-N%9rEAxBYxcXu91M9ynDl3sfrNoutjtCNX| z_&cW4b*0l2aaQYDcQXwx$TLJGsg68L1=%9rQ&zfFU7f?1sFj4DJB(00(5O^z6<uKg zg;Kqfs9iSq*(|(_wT`h+PFeUMBj1`!{&Ohzd~%LBH0wW{@@#H%wL&I|j;QO#W!F_c z5%sF;Ztt`L)g#HA%4I5uD|wy@+9FAtE?=eMA{9ph=9)5jsehrTklJlw8~C%iH0**T z;kR*T7wG|A;qOr#cZ0sE93dcu#okqe3q0r9Ug@EL6D)fbI6d2|dNp=}b#H;3;3KUg zyoPt`q3u+>Mej7)s=n!0{OZ2$)E)`+E_pAYx9%-_XVAOgt$1hg+rTIVUy3mNFODzF z(Q5)BiEo`z2(s1eNY0@W!3rJd6Ikn>ai|OBS<Te5TC#*OvPcDqJhlgfY{-C;R;L=l z8h#{dk}D5?8<mh=r-{aV!<nP=Ii8Qsl=6HYxt1kpFMQx=naS0gah0@#@zk$By9Gp7 z{HhhQiDv?ThS~GH;FX}&-}G8n-^UoXtJRayo6egNaAq`!UJ|X#-Wp;SJ-9#M&;+;` zabeVwa9k|SxB?^zOmXci;Gsmc@Kz9bPK{Z%bizI$N|kKkl-8cF18cd}n=_6(QwVb0 zkf~CM#8JyvspY_cv(|eWsmP$pE#}0?^I|DGM>-YPl^fph_afTdxC)2v%jjdjGnBq0 z>N98TwW5}MgC>~~h9Bb;V1Q@RN*`fRXrs_XU6^7~A745F(?|0&mT7x3mdOk=I|7@d zr7ZHM>De|Z)`&{EhGNxFCj2t$aZ&mmV)7W}%+p_DK(a@RV!VE0a+RQ-tyARDh}0e+ za8KLP<x5OH>6WJU1Nvs9q?=5-Q&wumn^BQ|f4J+jmML};k3{So=i(i-5%NzwQ5~W` zk*?+5k+DH?&yEHiw7oSY`9p}6YCU}lOT@~i6D!2hfjQy&wti2$kDYR@l(m97G&P)Y z=7pFGopPru!$>hl#Iv@=<u;uu9+7NbTpIXaf69k1wz&5g>v2Q+N@{8`fAH5N2aae( zRoJ*;)80J6o*rLk2J{eyJDo24m{l=_gn}7NEEayqDJde!2*fqKIs>}l7qkW~rit<8 z6A(2sIol!%FbQ+8dl;iK5ps8LM5y6FP^58P`|@|c#WqciNT2AD0W0iH5D%V(P1`ET zn@L?igQMgbXSFlh)EwBVJ~gqq6awg;c~+Z{{V;^Ky~wQv3JJ)%Y%ktZ_R(re3VXg2 z?@K!Mk|e)cR1lC|{SnL}^X}Avx-)q+?>g1|^QxteECm9Rp%(=JPK_W%x6}1K_Gz;& zEUx8O2>%8XLYl9^`Ya<JsETFX#(}VP7~qr0d}g^BEg*BmT0j&iEjSP!EHLYW-n<ES zKujWi5DW)CDRQP4afKceM}MRr@<WX8;ZC*U=O@sLZ1oxHNUc~SIP|6i3SCe!ry@(f zixG2NYnjgH5MkRO>gT9AiS0g``D}82iuK4|K=o|75<y^4D_D_^ewW+RI$I3D1Cv5^ zz=Bc+6C{OVtPgXjuR>^~8XFXcj)?vglGpVU8T9;o%2g~%GT`zjR1p0MtQyJT2p;l* zyiRT8A>~_Cu+L#Tc7-0v>C0bI!HWDL)jp=;1`5R&Q_5-ponezfjx(nh^hj%mbPRxe z&8lIW<)UrcmR&@>R@PAx3Z{{5+}TBHN>}&|iWCJij-@P=?HI^DLHa8DgtX8yo`hHM ziVsVU#dX5Owo~9b;bI&3Sm9zDc`M-&Hnx!{B3w*~B87`9-WkTi!m0kFaB7|fOpJ(Y zb!9I0-9RoT#lB=k=%QaTaD31xY<R34XopZ{q#E&eh-`!llLn6iN2=7@ikIlr+_{}) zA6gOefldN&(!4`#P}Z;bwcpwT8i+0I=H7#&18N}2b+iF-%}df1*Me3UJ^&#JMp&9} zMsobD%}mcsH(~UQyU*}2;qw5GioH3jA?G5<AWu!j_0*bJ2ZD_5#5^>n1v)DS#$z!l z>@!4ttVJfkMHB7Tq~I3#44F+nE3rM=*$levTV8C34?+Zew>(&8LOaf)f_|xFHXe+8 z<WUobm15HglDDWJu!xBZ_(7^?xP=4=+vX;9-a!HF81|8k4PsQ<5f+0|6CPpR%*#~a zJiL|$O)-K4I}Lsse{7~3sLeIgdHK#P^?jtw>O+wY{1_RY^AM3TK~$q)ijnhx(gOmx znV#V<VbzV)vzu|l^E<7bfNcv0EG&??rlfa6WxCRIR`S@qo1kVTB(@ZnK?f9#PHIjX z)g&Ft3ig<UVWZH*qNwYC!fxe-kY6FwF>(aYbXCN1%AC%uI0-A)hJBToRsQ!)tndta z+iDck`xHY`pEVCM=PAw4o$(WdHF>khbEZ!9C|#P+xjd_|H)ZQS6Rh%Y->0?KNk%ZS z|Bxeg9t6k}J2QDkt{F03#FC^^IGqS?^C6a@P7Qkp;wgy{B`Ja0{RY*t5b>YzluB}5 zfS4yP7a-1%M%&JUBrSp<)2-%rrbIA7_$q>gb9C32UEr!QlF>&L{RWf&IY-g!bMQ!> zqS?h}c9*RAU0ROJ3CT-YY{4>0Z0|9l#1(#}$`$`1N6JZrlbbq2N49SyfHa$Oh-`|Y z$K(u3T*-08WTbkQ$N0y{mA}P`|MJ7hOqZSsc*!-exJIZ<#FR|Gwq?kdQ<CvXMJGHy zXhxKlH#x)dMP&8JHJH8PR#AQt*{Z%zv8U-4)zd+VMsdJK_?~i#=0Sx_LZ-X`U#DD- zvfKf{s!K*XT&=3?5&>(4c79GZ_6+3B;?l;AFE-rfo$EK`m(=qLH5QbXDp&G4TGD9z zO&YRB1?$|A;t|;SSKNt5FyRLljVhA)4T|9A0nyxstsNy1_;XWpb>TRQyG`#U`O43! zxJLzrWQt5ued$m^Tgtq~b#iO`L4zTMvgt%Lj68X`_!LmXEbLHbo)<gfj-<DTJ6u75 zsMM@i>UPy22*)taDA!COY1E9`W@h{{dL|5n1On_Qnr8vT34l1jxQC@D0+0Y78TS#H zdFFw5te{ar#b%k6s9+J=veUT3S79%p0~&pN1cdkobwl<@E5esiTJlq>k6!Zxhx^v( zGHURT2L*cPL@d#4{zTL<mpP}g{de4pG;7-1(N)i2iF+*7(-ErmsThp022oH11%Kc% ztfA=nUD9Kt=a1Y|Bt1pX&7`M<p8w_^J9}d}eIv#Z7qoU|OMfb4fk&3UKXUND5i(_7 zd7nnTjX5=nk*V%gqIz$ES~y^7(AtQT>7+FnpcMd$6|ZLcUhL7SLr^LI@4hy*_BzpG zbQ<HA_F;_?m2WVFTRM1Q0zRk3Ns(4UxjeN|)~2Niz4_mhH<$3<V((1$UNzb}C?G1g zJM46xitW)oZSRd}Wn%FgUPIh(PHpD4M$~!rGaB}aW*Dj5xBu%N0nhq7+EnbF1AS*f zTVq;=7M0;QphZvh?P?O?FEnFqd~R|vyz<KRJJ&XT^XZNA7sK-xE`}GlxcZ$qKW-fB zzB;bYv|JsRew@O~@nTlJlsejE_@zs<^rcHz$3;x1S4c_+k1e!b47u^j#qjF5jNXgk z2Rwii4(A+Bc@vK1G`O<}Qh$B>Msvd@f|Yfe1+CJ>%1$jCM+VGU&K_@m_R%LipWCa~ z?%Y0lDv@>koIhFqEf$e%5Q$JpCk(h7;YD}P59OcpD-a-O8ILfwWNUEWmp`K66dv;D z;68tJa!UMdog&$|5aNFud{4fIA*&UYRw#4_9;Kn1G?#$4GDp0M=*mB%mKRaP`XH2l zfeJpf>vA`4Ag!xBeS%SQ{yxC4KjIE)Q4QIW0`4+>M-?mjIei6B_2hmDwR3tEPxwPN zg|aKASi(~w`CCTolD;S|z<47y|I0bpVHPhO{YSxZGGkE&L?8$OMj&+AXSfoZy<vBN z9`fbP3ee3K)rlDetjPTS2ks;jXbV$std;fgybqqUBq0w)o;deeg)DPiQ2+XXx3#F3 z+SKbU6~dE4P+cEUja@*N1caYRLR}&|tfD}QN^iWna_yz}?YHGNo>v#?V_Ih?+L8FM zCJE6=LN1d0KwN1LgTQZ7Xd5zpadEF7Akgef4%W!D%fF&xlZp}*q>!9Gi3{#d)D1#e tqZWEuOj#39b({a6CFhPauNB)@)Q7#Rv<IA3TQVr2YNuLY*nh9N{}13WQl9_- literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bad562d5bc657546c23d93c4a45ccc45274f5497 GIT binary patch literal 11861 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 E1->+^BLDyZ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a89601d566f1326cdf3517cbca6068ea676423c5 GIT binary patch literal 11801 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 O+S8foqWdj(@&5sFJ>!}H literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 0000000..73973db --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py @@ -0,0 +1,417 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + """Represents an item in the tree""" + def __init__(self, name): + """Creates a Node + + :arg name: The tag name associated with the node + + """ + # The tag name assocaited with the node + self.name = name + # The parent of the current node (or None for the document node) + self.parent = None + # The value of the current node (applies to text nodes and comments) + self.value = None + # A dict holding name -> value pairs for attributes of the node + self.attributes = {} + # A list of child nodes of the current node. This must include all + # elements but not necessarily other node types. + self.childNodes = [] + # A list of miscellaneous flags that can be set on the node. + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + + :arg node: the node to insert + + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + + :arg data: the data to insert + + :arg insertBefore: True if you want to insert the text before the node + and False if you want to insert it after the node + + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node + + :arg node: the node to insert + + :arg refNode: the child node to insert the node before + + """ + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + + :arg node: the child node to remove + + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + + :arg newParent: the node to move all this node's children to + + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + + * documentClass - the class to use for the bottommost node of a document + * elementClass - the class to use for HTML Elements + * commentClass - the class to use for comments + * doctypeClass - the class to use for doctypes + + """ + # pylint:disable=not-callable + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + """Create a TreeBuilder + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + """ + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + if not exactNode: + if isinstance(target, text_type): + target = (namespaces["html"], target) + assert isinstance(target, tuple) + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if exactNode and node == target: + return True + elif not exactNode and node.nameTuple == target: + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and + name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + """Return the final tree""" + return self.document + + def getFragment(self): + """Return the final fragment""" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + + :arg node: the node from which to start serializing + + """ + raise NotImplementedError diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000..dcfac22 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,236 @@ +from __future__ import absolute_import, division, unicode_literals + + +from collections import MutableMapping +from xml.dom import minidom, Node +import weakref + +from . import base +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(MutableMapping): + def __init__(self, element): + self.element = element + + def __iter__(self): + return iter(self.element.attributes.keys()) + + def __setitem__(self, name, value): + if isinstance(name, tuple): + raise NotImplementedError + else: + attr = self.element.ownerDocument.createAttribute(name) + attr.value = value + self.element.attributes[name] = attr + + def __len__(self): + return len(self.element.attributes) + + def items(self): + return list(self.element.attributes.items()) + + def values(self): + return list(self.element.attributes.values()) + + def __getitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.attributes[name].value + + def __delitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + del self.element.attributes[name] + + class NodeBuilder(base.Node): + def __init__(self, element): + base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") and + self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + # pylint:disable=protected-access + if Node.TEXT_NODE not in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000..0dedf44 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,340 @@ +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +from pip._vendor.six import text_type + +import re + +from . import base +from .. import _ihatexml +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._childNodes.remove(node) + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): # pylint:disable=unused-variable + """Serialize an element and its child nodes to a string""" + rv = [] + filter = _ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000..ca12a99 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,366 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +import warnings +import re +import sys + +from . import base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import _ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info[0] == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + +class TreeBuilder(base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value=None): + if value is None: + value = {} + self._element = element + dict.__init__(self, value) # pylint:disable=non-parent-init-called + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = Comment + # self.fragmentClass = builder.DocumentFragment + base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + assert parent is None or parent is self.document + assert self.document._elementTree is None + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our initial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + comment = self.commentClass(comment_token["data"]) + root.addprevious(comment._element) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000..9bec207 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,154 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +from .. import constants +from .._utils import default_etree + +__all__ = ["getTreeWalker", "pprint"] + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + :arg str treeType: the name of the tree type required (case-insensitive). + Supported values are: + + * "dom": The xml.dom.minidom DOM implementation + * "etree": A generic walker for tree implementations exposing an + elementtree-like interface (known to work with ElementTree, + cElementTree and lxml.etree). + * "lxml": Optimized walker for lxml.etree + * "genshi": a Genshi stream + + :arg implementation: A module implementing the tree type e.g. + xml.etree.ElementTree or cElementTree (Currently applies to the "etree" + tree type only). + + :arg kwargs: keyword arguments passed to the etree walker--for other + walkers, this has no effect + + :returns: a TreeWalker class + + """ + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType == "dom": + from . import dom + treeWalkerCache[treeType] = dom.TreeWalker + elif treeType == "genshi": + from . import genshi + treeWalkerCache[treeType] = genshi.TreeWalker + elif treeType == "lxml": + from . import etree_lxml + treeWalkerCache[treeType] = etree_lxml.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) + + +def concatenateCharacterTokens(tokens): + pendingCharacters = [] + for token in tokens: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + pendingCharacters.append(token["data"]) + else: + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + pendingCharacters = [] + yield token + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + + +def pprint(walker): + """Pretty printer for tree walkers + + Takes a TreeWalker instance and pretty prints the output of walking the tree. + + :arg walker: a TreeWalker instance + + """ + output = [] + indent = 0 + for token in concatenateCharacterTokens(walker): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + # tag name + if token["namespace"] and token["namespace"] != constants.namespaces["html"]: + if token["namespace"] in constants.prefixes: + ns = constants.prefixes[token["namespace"]] + else: + ns = token["namespace"] + name = "%s %s" % (ns, token["name"]) + else: + name = token["name"] + output.append("%s<%s>" % (" " * indent, name)) + indent += 2 + # attributes (sorted for consistent ordering) + attrs = token["data"] + for (namespace, localname), value in sorted(attrs.items()): + if namespace: + if namespace in constants.prefixes: + ns = constants.prefixes[namespace] + else: + ns = namespace + name = "%s %s" % (ns, localname) + else: + name = localname + output.append("%s%s=\"%s\"" % (" " * indent, name, value)) + # self-closing + if type == "EmptyTag": + indent -= 2 + + elif type == "EndTag": + indent -= 2 + + elif type == "Comment": + output.append("%s<!-- %s -->" % (" " * indent, token["data"])) + + elif type == "Doctype": + if token["name"]: + if token["publicId"]: + output.append("""%s<!DOCTYPE %s "%s" "%s">""" % + (" " * indent, + token["name"], + token["publicId"], + token["systemId"] if token["systemId"] else "")) + elif token["systemId"]: + output.append("""%s<!DOCTYPE %s "" "%s">""" % + (" " * indent, + token["name"], + token["systemId"])) + else: + output.append("%s<!DOCTYPE %s>" % (" " * indent, + token["name"])) + else: + output.append("%s<!DOCTYPE >" % (" " * indent,)) + + elif type == "Characters": + output.append("%s\"%s\"" % (" " * indent, token["data"])) + + elif type == "SpaceCharacters": + assert False, "concatenateCharacterTokens should have got rid of all Space tokens" + + else: + raise ValueError("Unknown token type, %s" % type) + + return "\n".join(output) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ddce6f9421c3fd6537c5dc56dadc8423f090e71d GIT binary patch literal 4006 zcmZ`+&2t;K6<;iu%jN3Rs-i@Slb~)Dn;lDXKRj_%*HcGQKBkTBiB)^5iNmfIAhqIh zcLgl<!C7WHP0k(v0X@jKw&$KY{Y&<gnVx*@G1EhT07#0mr{n+x@ILVH-ox*KAI;48 z7C!$9R-S#aWLf`KlhLPw!LQNe9y(_2S&T3{CS7~a?pF3HU1!fB7OOBPu6Er$SC6Z4 zt?TW17`v?2w)g6hwdb=LR%h<FWN(W3Z0cKUZ<<ZB8h&S(_t<L827e@$b)SZ59P==b z(uAfh+D%z6=90EjL8F|DAdiwZ%@0J{YadV+wOU;8B&VGyVG;s<E;zqQ+dLWbrX8M0 z8Zod%VGz?ig?uVG%><N(oYDO=tZ)#(8TGmF&93Xdznjuf@F3?jph`163E~bH+MIwU z{DkIb8CQmyeb3S!R-qD`u+)#bS<Ji2zRTk2{vnP?Z@`=w%)8M1)F_52VVWE(ThpWg zvx59Wi-el%l8Y#aVdiz(<v0lT3UK=NXp2BnnZ__!w0majg!zK!J&|axWavjY^ffQ7 z`!5k>t5GTEf_-S|<-CbAq#`dp79B?tMwRouBnnf;o3Rc^EMMA6hLm+!F7qJCB_=bB zw}M`rH@WgmIn(C(#W71a%S4pq4?-oXJ~gxo+HcV0-_aG;x%I*t;5R3onm8|zcO6^Y zVm7P9$h<*?SViT~$w^_|wUP{U2lPjvS3$21kd=iqrauDR1w8}32D&?_f?gfdZ-MTC zehzva^x6QKToC4WJn=mD2BdHg>ji0%!u~TkbRNU1bHA`&5M=ID@JpEf30G0RI3o?? zK$^ro4n&mpq|OzUq{CE-@&mfxi{gAON~r8*%Fn(}@!3T1sLX|C+(m|M>I6-KuE{l( ztSTFI@(F&_iv-dL=_EOHN#uK!N5{OeuC*zRkBxe89S3m_7b*~Z(`=^5KcUxH+P$_( zccJ>U8?R%w-i?w7zjXWI=X9LOxPWOgRtq^DUr63J=@f;NcSKuxSyobhnx)d@;#d)- z+}so;u@*-iPLUs6w1SY+8=WLQNz|P>NkxaAD97y>cIEGz6I#NFbs8j$#_BZM#tCo0 zY_$%nA7**f#bsiXR$s`BHA4coMIJ<u3Fs$!s3OFJ?nKBgpH%t8AjyUM40=t5kFU2c z!ZbE^eexW*s+Z1nW2+|=>cwX?$g(&>I5nv8Q8dP8YyTUFO5!tkKvQ&jbxx3Ea+7xW z8NABIcp+(qyoE!CDz)#1-dS5yIGh43#dr&Yi1H>fG?MfH@ROvJ1DC^5G8^#0R<B<V zV^3K@n!N=214V?YM5Sw-jp?+SIw~Rn6<-_ERI{>bf=a|3I36^n%4(dRa8b^wGaEGB z3c>?kT1KU>QpK!mrD7IxT39IXDQAIDJBsIXU2@6_=8anEDRt@!ma~_mTe`-BTKg*+ z|7MA0==}cc4Zz$n%EtyEV561Bj0?HZ6&w49&E_3>JNe+4{UU5;$3MH3x9+qLMf}s& z?GHcP*xksYOx@%h1!C<qOHO_s9`@CuZcWq&mWqvoyc^$+qx}tK<1h{z%_gpG-fXUC zXTpOKZ=lI*=&ZLqqQ2AkzS?`lvFAysLZChlS`{rslQFusH6W+IEv#+p+4jILY(|!? zL8YiLyW@)Wf}C4et1JT#iFM=`M10B|Ry`*Lc|n-_7yF4tw2nfLj{K*<R&nq;53_)$ zwFjl6a<*ZY{?<Vtf)GF;%eluHz+hs*VL={<t1wS2pljITZ8d&Zk4qO<18ypv!!$}7 zPU-6MF3T%w71wY=QB{+Sw2GS!o>;-CTtQ6>5x@j(EU~Mf6!$@wcr95Lafq*7J8wH= zLC+i_ehkXkqf?mF(YDZJjH;(R%E-WeZl6BMQRTiN+tzdY*{8;<@UBxhtkQ9x6Y)O$ z>?~X2YxA3vL)5rst5ca+0jFS~sF;8k^3}vM<3W|VMHS=PvemMetbwa3m<?P+&S4&_ z7xto6xQePGh*<g`Scr3lO@XU+%JOPaJ9l4bE1&ItX@6-Cyg_~77oPY};i-MG|95(S zPw(v%-f-Xga8IYG5BHlM?N|7%irMk#pU4P@&2-=o@s-;D4)#A<#M&&@h}gWeHmBGA zpsk-DYSXrkPM{^PXl)DT<k0b7j24zHjQ*h|e=wGWFANR+qUQLk86`G*qvaSIlaI&L z@3j2VEAo&WohMn*9B)o?jBHC5HSH}!YmuP`)LECc#dkD)Wh{#rjAZq>-qu`Su&d8) z`Bh$H?|ei4M2;47kG)&KRx^8QvG>mLV$m-Y+CP5;6wc4^=GA3YKVTJV41rx5Al?l+ z>S-|fiqRmHpa`pCnoTG{&B0qC?d4f7S8p1HKa<sMvep=EdZhr2G@Gr3!XAAEaqYdw zxY+q_&@R25ZkC^^QC+=$q=JCbQNY))u1dNpOGmBu-Bo#aRo?raP@#ZJgFwH&Dp%#N zuC2;z;(aWZ?oPs#s@hiCRZrvo45WUzwgxqHZS7uJ+fG9TJf)ZQ_Two0jP;il$M(am z-QPdjQEW<??(UVIJd-)^e#SKV^xu4ybI8}9yG*!eb{*-wrvXgaukCyXc7ELd=>MY* zl?Q1rW+=4BoVL@Piij!qqfk%{kf_`04^MyTcgg74gt>ky-c<e~e#6(;BwXbaf9zI? zV+-DjPPr8CX?ICHNI5I3c;|OzIeQ<^0->INJ3^$Q^q;7gq#g?jew1L>1iExhT9hvS zmBG*AM<DCimUbdVLn*HYc`l^5uEzB^#XlisNLkg-Qv<*niWLeAg`AJjBtvI;4j^^` zfa}{UWR}d^9$7$JA|Cn`4ZqU>;#st-whu1T^cX<x4!`e?$Mg0yv@C&7@yu7|?FM<! zm@R9~CQHL+v-F$IRuBK6c(W;h-Il1R&QYDJJjRo5vzJG)G_MJWA|hbFqUfp)8=tF_ hOq_0f#L~NKo{IMrhnz>}*o&}h+V*Ux;@|Y<{s#^!Q``Um literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce7812b6c7c2c057ff92a1fa56433351bfe620b3 GIT binary patch literal 7002 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bfe5f2c94b7d8f83d91439287c9b3472115b492 GIT binary patch literal 1731 zcma)6&2HO95Z)yzky50@aa6}YDbPcKLP2Bo&!__gK^$2L+%|Mz%XPXyN>JLRO?gQv zyOd%Z&M9f1!#?)fbDyA(u-EpIdrv)ehKi-cD1t07!`YeP%(t^Md%s#O6Ig$Qi%)+k z5b_sp&X)tiJs^D_7$=-cl2Aqyi&=@yY>GNdI!S>QK(@Ifi;2rzN*)qk;Kf&j7lqsN zUfQh0-EC6$UPByGx6PHXqx*80i6Bk}eU%xH$D>%s{nX41)41E`B9L(=R48?w8pj94 zYl{EErW0z>#X#rF0^uHz{v4PfjB>&(PPz4pFdJdP*BJw11@3YW_C;O-KxI>ID<O76 zc_365<KV($7lE2U`X68?v_~@9vkolvNoMyP*cX6`KyKu0pW8j~DMi*nQQZZvGFUG~ z*2G$YzkiR(3+wQ^tO~Zvr&rF%OS(>;uD-BO=;_RfeMUjDdso%3z-Lb^l!2~A)*bTf z=dq3x_!h>RT>^P(5bG+?N8nFS=gvq}nB=?;IsXKo`3qPU0O?|m^lz{(MRXe@-2g9w zh&h4UP`~~$^HQjM`)D8(^af$G>zmD;M=ie{w10Zs3jEFWmU7YHf&o>=Ny9`KZ!ql0 zxVyoPr;l_dk`2yE?befa{tKIJuCKM%g6&qby|L+!bq<<Y3G@9J%AsJD)(@>b6=pGx zjCE$pVV0@51C67Nb0Cg1o7ofD+PM<jgjEoM9)w-7v$bIgqdZti_Pe3<!NS}(aZP@< zTvgo<b#p(K90O=pX>LB6W_I7~SaouEM8xJM+Xq`~4=4W2JJ%a`$N%2n-1X~@akP*T z6bIs)0v-bJ<L5V`u0#F)J!%Y8JPI?>7=@}4^(7ZdHxkw8^nzejucY6O_&42PF#76? zELz>`Dfwlza{G3p-5A7!TXCwhP|90}gY@~=-QF=Oa|%Wx<$cxI&l0&J<4z-kZhxM4 zyKeA)vOG94m!X1q?sbucvD77iqdx^kXoc3SSz56w)S)$6rbXD-K#Q6RSUmf9VLCp` z@5Y%-6HXP5Zaz&oR@i0Z{-UfL#Y$&+?dz7h23A!=hD8~(d5}yMVn3L8B08N9D?Ofn z7r@l%!}4EB#bLG`L$juP?*ot*Y3lmfTL><eVCwZ@5Xys4i8Q~0_aVR%Jf3*od<(#Z z5=@=^x@){3z<CG)Qx1Zp&xaD_N)S97hH`9C3lK~#B3nXs1KIQfatUuidBBi#E>LgD zvpqZ4`uLItK{U*U3gRog9AzWJx74_YiCl(u%O4R##!tqa-%qzhcc^qc64P7E<NaTH T<J}qKzl+_Zv6E^Rw4(hVZUePL literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccd0509cf84f3c56a0151033379bb30990b93c53 GIT binary patch literal 3538 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..274ff88b2c5d4fee6cd87b60ead47269028a4757 GIT binary patch literal 6647 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 M&z6d%Z0WiG15Y<@6#xJL literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57dafb7c9d016244b509e8f01fad25e2388f6c72 GIT binary patch literal 1905 zcmZ`(&5zSY6rUM8w&OV2Y{)Jwr61}6DH0IcLJJZ?Y<HuoRX0#JVyOjky%}e5;*acj z5(09nN^nN}39Qsh@2IDq`$x>RCocU1s;cUHHcL^}jx}%Iy!YnK&+|S$uh(q?;}`$* z{YsUP-*9t0bYO14%$@<^gwu$`)TJ?VS**DlMH!3qxZ+j{UIX56jo5U}*mAA7>Q-ah zwF{jNx|&;y9oLELZar?ejd;afiJNW{^c8MIt8vS10dI0EIuW<scD&}UQSt@hRc=2e z+zwjf^(UIU&TG4*<Gcb)q@$@7e?Lp3nGC!zo~A-7i-+?t3)4h3XGu6rdEiB%41^zL z9jYqd^!+&KR8(bmuz7o+v|fK()$i_n?e#Zzdb_taw|dIlzPUB{_Et~ngWlai$52*b z>-Be)0p_^YO3Bvt=3rA*QCPC<)|blMy1BE{>knR0L`aps?`Od)h8w1wc^dLw6vROy zGi4_LCY$=hARFTU91k?U0W&)TBp@#3#ATdv_LR69*SHR=&MWW^hO!4D2=@GF5{Mz* zhyx>6fr(Bt4uq2>U3{98G1(^f&n;OF9w$|CX>mFyFKAA4cEmtqFST5|Lnt{syGL@i zq=ycyrR{geww(OS_Vyn52Q0J?Kd4K9qYRl&f+XwcO3#95q^zk3=3zR^R3(_hud7O7 z@Dma50=hr)?o@<xUk2T|FS?^N;(^GzvFPrPJ?~0(Ir(hPFAcrv{Nsyqbmd?yqK`(G zuU_pAy3=raK1?#{N74DkG<o>RaQqmB#q{7Ro{H`R8Aq3+aKDS#9u`lPbq@gFgYd%i zk+M7w6U6iC_*^X@gz40w7Hv_RS{km8PyF-D7mn?R8rs5Wz_ef%@BITrA*c7WrMA?U zm0Xi#!o;t+evd7UrI{OJy0n0@Wi=#AdvPT<;pH!awzhPnme-{Igo#1!<aS;gGnjP5 zu93rwDB&cpl{<(_RaQ9NK<_VeOBxeHyj*+*@ig;lZoz5hkm-w@akfFEHPH%Q+aS3y z(T?;Y+V#9%MEl1*k~HCDwLE!L<UsN>V7I{gU%6gj))DiYTea->;#O1q2`6nldBo6L z@;#iZP1tiP)<NUs`VlSUBaqh%`Spbhng(hBhqHW*<2gM%2S~1i-AZA12Qs#q>(5AW z{w&B><%(>{6S6JW<od{*7;wupalqTjTr2M>a#8Oq9m6iLB*ZF^&M9HQqN-6k^dl@h zRee)_%7&JKX_O2Dft4fHkhFogRuE6+qk(@Q%wh{xLc&%VkX<Nlf>@cuG{&M9*iWGf zf`t^&P(i`dp?owA1SW{6A#spkvI$Hau>wSyvt*K_50g$qY@qNR6zU1MQTilIxYD^V zeMLQ`N&mn#eJMq_pMeSdiTDt#-PK{5%mX0<?j39CMA5mxE>aX)N#4WlDIj=9b^{2( zJcrMKPp1vowOEt2p$1y;IjqG>U7I$UO&c(q1x2nwnf7?~t?DRCzYjeY3JcMBp0YhJ zPWdcC-toM{Ss4M(6Ys<A1(>%0VowkS%5~uIwKD8zfUqG@((jx^kE5BK3GgVeT?(v4 zfo5*)b!iV%@j93o_#%2`5HK!9oc=c)WlV{{W}vF@u9zA!D-xni4aD(Zkd<|<{L|~0 Sc^QIlGl!m`A25eCwZ8#Iw$M!g literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 0000000..80c474c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py @@ -0,0 +1,252 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node +from ..constants import namespaces, voidElements, spaceCharacters + +__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", + "TreeWalker", "NonRecursiveTreeWalker"] + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + +spaceCharacters = "".join(spaceCharacters) + + +class TreeWalker(object): + """Walks a tree yielding tokens + + Tokens are dicts that all have a ``type`` field specifying the type of the + token. + + """ + def __init__(self, tree): + """Creates a TreeWalker + + :arg tree: the tree to walk + + """ + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + """Generates an error token with the given message + + :arg msg: the error message + + :returns: SerializeError token + + """ + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + """Generates an EmptyTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :arg hasChildren: whether or not to yield a SerializationError because + this tag shouldn't have children + + :returns: EmptyTag token + + """ + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, + "data": attrs} + if hasChildren: + yield self.error("Void element has children") + + def startTag(self, namespace, name, attrs): + """Generates a StartTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :returns: StartTag token + + """ + return {"type": "StartTag", + "name": name, + "namespace": namespace, + "data": attrs} + + def endTag(self, namespace, name): + """Generates an EndTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :returns: EndTag token + + """ + return {"type": "EndTag", + "name": name, + "namespace": namespace} + + def text(self, data): + """Generates SpaceCharacters and Characters tokens + + Depending on what's in the data, this generates one or more + ``SpaceCharacters`` and ``Characters`` tokens. + + For example: + + >>> from html5lib.treewalkers.base import TreeWalker + >>> # Give it an empty tree just so it instantiates + >>> walker = TreeWalker([]) + >>> list(walker.text('')) + [] + >>> list(walker.text(' ')) + [{u'data': ' ', u'type': u'SpaceCharacters'}] + >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE + [{u'data': ' ', u'type': u'SpaceCharacters'}, + {u'data': u'abc', u'type': u'Characters'}, + {u'data': u' ', u'type': u'SpaceCharacters'}] + + :arg data: the text data + + :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens + + """ + data = data + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + """Generates a Comment token + + :arg data: the comment + + :returns: Comment token + + """ + return {"type": "Comment", "data": data} + + def doctype(self, name, publicId=None, systemId=None): + """Generates a Doctype token + + :arg name: + + :arg publicId: + + :arg systemId: + + :returns: the Doctype token + + """ + return {"type": "Doctype", + "name": name, + "publicId": publicId, + "systemId": systemId} + + def entity(self, name): + """Generates an Entity token + + :arg name: the entity name + + :returns: an Entity token + + """ + return {"type": "Entity", "name": name} + + def unknown(self, nodeType): + """Handles unknown node types""" + return self.error("Unknown node type: " + nodeType) + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (namespace and namespace != namespaces["html"]) or name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000..b0c89b0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +from . import base + + +class TreeWalker(base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (base.DOCUMENT,) + + else: + return base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000..95fc0c1 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import OrderedDict +import re + +from pip._vendor.six import string_types + +from . import base +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, _, _, flag = node + if flag in ("text", "tail"): + return base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return base.COMMENT, node.text + + else: + assert isinstance(node.tag, string_types), type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = OrderedDict() + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + assert list(parents[-1]).count(parent) == 1 + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 0000000..e81ddf3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from . import base + +from .. import _ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("ascii", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + + try: + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + except AttributeError: + pass + + try: + node = et.getroot() + except AttributeError: + node = et + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(base.NonRecursiveTreeWalker): + def __init__(self, tree): + # pylint:disable=redefined-variable-type + if isinstance(tree, list): + self.fragmentChildren = set(tree) + tree = FragmentRoot(tree) + else: + self.fragmentChildren = set() + tree = Root(tree) + base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = _ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + return base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (base.DOCUMENT,) + + elif isinstance(node, Doctype): + return base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): + return base.TEXT, ensure_str(node.obj) + + elif node.tag == etree.Comment: + return base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), "Text nodes have no children" + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + return node + # else: fallback to "normal" processing + elif node in self.fragmentChildren: + return None + + return node.getparent() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 0000000..7483be2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import base + +from ..constants import voidElements, namespaces + + +class TreeWalker(base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, _ = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END or + next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if namespace != namespaces["html"] or name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4e6364d5c73280d4623f8035e8d81c4bcd82d7c GIT binary patch literal 266 zcmXv|%Sr?>5KLwl5#7Cue=x!tUyHjUBKrYe+>;<poX#v6Gf7BdeEgCB;FrwRlfU4} z&Vmh9UDXXmt)|mGM)M^PAFpVC7xO<AiCaQEAVP-Ru%16~UUX%uHN(+8tH(c_-ZdZg z0kR5FI}1RTAKlfXVd7=;EH?^JCK*cNFm7B>pDgT<+0w5SKIkly5?Kb(I)juW`XHV< zfJL0!%ZwKd_<VMf+Qp^|=CqwJmtrlv_A_l`lE%#5ynQ`yx{q?)g6ddwL1?s60BEZd Vz_EWHcCUMfFGk&z=CPET@IQzENQwXe literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..111803a1dd9aaaea0e4f9813183a221ffc491313 GIT binary patch literal 3073 zcmc(h&65*F6u_tFJG0sB5)lMZ16&MMZ1^moN^pgxEG{{SO4V4@)G$3+Crl>c^<;r{ zLRo~P`Zr{cdiIF_NS8NGoVa_@_j)#){X$R=cB<cWzwUJR>;ApheSLo3(=a^`kKTPz z)wCB>nI;Ph%b3Lk1=l!BwI1_XPxtkn;Tt{EH+z<EF^%ioNNwL%U&nW1XX0{mgZY)u zHEwbHna1td?s{Xx_fX?-7d0+w=1@~bO@(`?@lZ35ni^{6coj9(m~;zc(_cW{Jg=dy zrgV#_TjUFT@tNiy;KpsOdEh0(Wi~Bo$63_pv9x(ye#11p7pKx5mfy;)mG);h0s8O~ z|Dd&pXt(yw(u?n(zIy)CtKT;6Mx>r50}IQTMFT~w`HXA6jwYbV&zNs;G?ZIdGP#Y5 zs7UJu&K*fx<d8&pM1QA5Ula2U%wh>ep>uZMfI~U%-h>tU1{<@dtYG3pvL@FHtmg*F zj*bJHZK&YC)*D}CVmKJ|A&+?@CL<c(h8a(jY_)OXyECH`O<ii>VArMzHh!et=|eBf zL8pq5##z&lrijyyG<leZxLq`g_*sKR?D5C_)&P>VFppbnA+$REl*b@iJ!swQ2Ek=< zF}t+JFGRs$?cABXb9uE3>DkW3D_2@ywg$=IbdrfYOw-ek2HC^&QFon`DhF$E#{1Ap zcow$kSfZuDW3?tSODG6+m(_HWnfiKFZQ@dSkpIUX0xf9!Ho_b!=oEo)X&Nw3<r;|v z60~`xI6x)p`3~mSSXQFhZZdVM(~l+HAjraA90bw}f?l5wQz}=3;K49V%NDh1<w|CA zs*;-6#YyS-1<~f}o(H6fFmELyVHvYHh++$A#&z^1L-~>^>$kE9;$EELao$w^1QCr$ ziB61SgJSttEWC;3339x_MkY5$R$;=|1-i@;O{{R6>fE}jW%a@kN`F<O9@Mg`jco3W zoJZ#hb49y*YUCF7#LTV29ph+BD;#)QU@W<$jhw>CZPHWu0l$OsX5tj~1}m(?IEreu z%GLsF%A+c8?@==vRO#iPm?T?Le1M8NuJSbniCheZSwe^hyq}8zVrhv%n&i?B2Ltp1 zpnX&nNweEevSwu$OVa8jS%?8k#VaAJIfMy$I1MOmh{Z6?(T9_D99s3+MW3t%_lBKL z3_<BZAL4}K3<`}+UCd+XXjoHOx2Z<1$2?Y3x<#YLs%-uEUJRCYj@`yMQzwInb|9kQ z1d09Fd>0!&z$}PBmjTuP6PYV2!oP;h-*NOeky&7j9qVu*Hz!ufXm$)q!l*k^(U+TJ z9Z6#oi(86dMJzl)Y8@mv<(4AY*(6x$6~RxaMG@@oBG}2@Z3O><1Xnf*u51zf0}^aa zyd4BriroZz|At^`g(6B4IE=efa(#$O6f#Pb=eD8jB|=5?EQ+PGNj1DjU5}uU23~S- zl&TaC6w>fMmi7=0$Ecl-9*9Nwh(v?LaS}6DD1^=EEu-Y8s1uh_Y|(3YtZKN(s;8L! z8;bQk6mKH4Me#He@1gi(oN(L9W)b!zHeACzrI_kFD5i+8OdaT^n8jDT#dTS|okJY< z?m&{q(8g<Im+#EBVm4tDhgqfZHr<Bm|8&AH;t((Lx18`4PSD*pA=P(GNH@R@>d-)u zYhA`!u8*~@p(MuW+|H46uK(zu)ka&IbniDEY0@1wyTN2VnO!qwtb!f7@^nB}ku==4 zhicoVHPoO@_~x?JgF?uPdN$n3@Wn%y-fSKfY2YO3X!C#!+V5=T+-i&yt>U!@k9*ij z&?#sb5p`zcPgg%UkGf`Eno%FN8B@k}<q7ogg0m>3j^W>l`n^Gt#--=b%H+}ODn7@2 uZ+um2-M7Ogy1VV5)$D7G`$_qNxJEz<0__+^e0&q=^+WaJ_2xn2pz#+lTb3;V literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f22b0d833c01d5717c6bb384b84c187da56a65d8 GIT binary patch literal 626 zcma)4!A{#i5Z!g+#6jiMTTi|QK{ur!f`qC9?I9OmNH0hzGM-K4XuZ1{FK&x^g8oeZ zfiLm3m+}joI^!r(RjCpq&AeIf?9-bWpKWh%39^U$)zxppUwqhDM9F*ddY1wSkVeec zC<!Cz{ScQC^dTnf!2pJYeMm0Ec=Rag$yl~>r{Ii@kr~g)>x4oO-^IP8YMD{xK-<EB zrYtu3wKhKm##HoVl*h8kgH}zBYUvDUtW|~TdbL<g>qC3gz(KL_&Hf}Tr=M47-YgG~ zkJViH((jeF4!JRVU%mbEwpiWr$Icgxw%|~eU~^Tt%ID#=|JDxY?)2h(HtVxURx2b9 zDL%Uk(CaRc8M+SEVL-=rG<TnD$py^0;UE2%{{`Iyn)|)HlOSkPQFgmK`;eWc`;*Bu z1*hxOx{%(4(v-DMZC+`Q+NT~}aD_88&6k-Av&tJ?X&W?rM0CiDss9z1Y+myZvC+l~ tvT@w@3x~RmS$fe81X(rm^<O-^Fzh-_PAUgCM!(~&ciT>65+%K)_Xj>Yh_wI! literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..100d21119b3ac1081056f39790ee8e3476daad31 GIT binary patch literal 9069 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 VEqJasRxEqIchoynJXU<@{{hKWMQQ*5 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb4d3328c812a9b85f4be0fa188e58435a97a207 GIT binary patch literal 21440 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 aeESG|`w0B+djxv>!f$rI{@0H1ZvPEaU8<1) literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c81b21a1345d89cb57306381aaeaf45b2d8bb231 GIT binary patch literal 1806 zcmZuxNpIXX6ecNYJQ>?SmNvHAA|+g)@Bq$??IdVYI1ADsy#y|h7${&gkY$lGmaQRW zk~3bQK@QX2`XiEK|3m*qFS_>RztD^O9_1wsN`c$s+w{HV`Rr_q!1y!y;_Y7zLjK0f z#b9uF2Gg#<BFGjIRIr?GQ4xsnSF*)KBpR>>VoEe&55+anf;|%K4QWp&*C-*aAG48E zJmGm}9oIdcDJT2V*kwLQgyh2liA%e>kiB7^AGd+k4w5|QYB<=D248cn`rHhaZNVkg z%F1-;K<!7mQavb!PJ*zJg^^Y&m$*zT6nDFl_p}+bmX@qbj9XpiQi;{}GOzDz{=U}c zold9S;hVeYud;_=97PX?(t1^khl%A!{9Ju2Q~p_-te>eQ_dob_5q#n<8%X}sQm*?; z-*~^<?M~|yFeDo(K;j2rO{QS}0Mq^siz6kO&@t_kF%xtg92rL)E9nHj7v$~EI4ncK z=15K3C+1a2%W#3<iu45{*gV;1=GDO+pan>)Uw&f?WE_?3ec-|}5&_6Wf+GJMnXnI( z0^c||xbrh{z%`)|yD<3@9DRKO<^P0_0~Qb|3FxR)BFrXHeQCdMaTw=F$15J%c;yo7 zxCTE)^bzi5ZineE0GYV|py{<-qzX@r<nky<U49H)+DZt+m7EW1obmO?Kwih#!UY1( zt%f*cot9Vj+Phb)QmGbF;4j!r_4BJlI?o8czRvHh@e*}`i%L7>b;BZ;w&S&(p20Z9 zU>aQ7jjCa_aZ*%~$Ds;xsj5a&6riG-jR7Pu8P{)-*90;V7DZf5*P=1rsz!}t)yfli zJ2aV-70s&IbZ87@b*<tLVy=VPe{{Dn*(h<cJ4#Hqr*i?7)g74b&R!fpv=7vGBXK{C zi_zMO>pkr6nS8bP;L)S*X1B<SyO{#$^8D^mp$_k*dnZWrGlr5C+H^Cak}gD{cBxYw zSGO*2anI<1cNrUqy$uU#HfadoO?sWqQ$|0dU(qHrH{m74UV;O6oIdYo;7~$Wc>-Dd zoIu{OjZ+RZ|8s3tMLx7u0N!{~z1%>KCM;jWv|cgw_sinKkOVNj5d;d2JjIngBRy<R z!G^g7^c=a)-krS*&TZ0)nomqY^n|>M-Xcg`7@dRj<)2|ShcLa-6F6W+3p!zA=IDE< z<dS`0;{Ym??uTZ>1$C9qL*-8BFKiq_jfN$t2*^G)FUtsOd_#qls89rNNQu=8y#T1A zTJ}<|fpSp!Bjghy{9bhO_=R-R3^E1D-Q(L3ws@QOAleqYrsf(R&U<4WU2I(2^>Mr7 zliDCSn=jju2e)eMWYBnBHC^v<E_==(0tS0od#Vc2h{2dv4WHq06%^W5A#y@pWc^)N z(fCt%Z(OAm^mdnI>RV7zClqVZnV<=YG*3e|18Ic`W;ohwR8w&*bQ;HI9_~KNyrZ>G i$n%jUOag<6Q#IEIS`2gf1iiMHyCG|`=I70z8U73Q^4XjK literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b31a14d865650b14ea1237f5799cb6558fcdf0f GIT binary patch literal 220 zcmXwzO$x#=5QS6Sh~m<XH*le&Rk4DIcmOxL5+saGE2%LJNsT`@@(!NFt+#OHRPe#~ z=7$F}%Vx9ANKb6<T2$ZV@K-?1f^ao5!M02UYu2gUt6?u%b%IxebDvlzbItjK*$Sn8 z_OW2B^jIX|(L$OlK`}U4*k_zaZmcI>jACwl*e}xPkXbcI$I~fnz(~`T+7+l&_iFTI o7-#o#`Gc-$kz0^LBN&X2cu2Uw0(<86s?AQhIICn{e(ebM1%<#pF8}}l literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c0ba862d737440ebf7a97079aba5b8d8b0f7f68 GIT binary patch literal 176100 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 a*%6It(l+yuJ6G=T{A2z<{$HNJL;nw0lNeb5 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py new file mode 100644 index 0000000..104624a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/core.py @@ -0,0 +1,396 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + ulabel(label) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..a80c959 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py @@ -0,0 +1,1979 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "11.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009ff0, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d3000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009ff0, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011147, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e0001145f, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11a9d00011a9e, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187f2, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..257e898 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.8' + diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..a68ed4c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py @@ -0,0 +1,8205 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "11.0.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'ѓ'), + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + ] + +def _seg_10(): + return [ + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D3, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + ] + +def _seg_11(): + return [ + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + ] + +def _seg_12(): + return [ + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + ] + +def _seg_13(): + return [ + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + ] + +def _seg_14(): + return [ + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + ] + +def _seg_15(): + return [ + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFA, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + ] + +def _seg_16(): + return [ + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + ] + +def _seg_17(): + return [ + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + ] + +def _seg_18(): + return [ + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + ] + +def _seg_19(): + return [ + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + ] + +def _seg_20(): + return [ + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + ] + +def _seg_21(): + return [ + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20C0, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + ] + +def _seg_22(): + return [ + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + ] + +def _seg_23(): + return [ + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + ] + +def _seg_24(): + return [ + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BFF, 'X'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + ] + +def _seg_25(): + return [ + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + ] + +def _seg_26(): + return [ + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E4F, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + ] + +def _seg_27(): + return [ + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + ] + +def _seg_28(): + return [ + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + ] + +def _seg_29(): + return [ + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + ] + +def _seg_30(): + return [ + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + ] + +def _seg_31(): + return [ + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + ] + +def _seg_32(): + return [ + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + ] + +def _seg_33(): + return [ + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + ] + +def _seg_34(): + return [ + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + ] + +def _seg_35(): + return [ + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FF0, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + ] + +def _seg_36(): + return [ + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + ] + +def _seg_37(): + return [ + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7B9, 'V'), + (0xA7BA, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB66, 'X'), + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + ] + +def _seg_38(): + return [ + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + ] + +def _seg_39(): + return [ + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + ] + +def _seg_40(): + return [ + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + ] + +def _seg_41(): + return [ + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + ] + +def _seg_42(): + return [ + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + ] + +def _seg_43(): + return [ + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + ] + +def _seg_44(): + return [ + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + ] + +def _seg_45(): + return [ + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + ] + +def _seg_46(): + return [ + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + ] + +def _seg_47(): + return [ + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + ] + +def _seg_48(): + return [ + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + ] + +def _seg_49(): + return [ + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + ] + +def _seg_50(): + return [ + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + ] + +def _seg_51(): + return [ + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + ] + +def _seg_52(): + return [ + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + ] + +def _seg_53(): + return [ + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + ] + +def _seg_54(): + return [ + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + ] + +def _seg_55(): + return [ + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11147, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + ] + +def _seg_56(): + return [ + (0x1145F, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + ] + +def _seg_57(): + return [ + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x12000, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187F2, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + ] + +def _seg_58(): + return [ + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + ] + +def _seg_59(): + return [ + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + ] + +def _seg_60(): + return [ + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + ] + +def _seg_61(): + return [ + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + ] + +def _seg_62(): + return [ + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + ] + +def _seg_63(): + return [ + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + ] + +def _seg_64(): + return [ + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + ] + +def _seg_65(): + return [ + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + ] + +def _seg_66(): + return [ + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'τ'), + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + ] + +def _seg_67(): + return [ + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + ] + +def _seg_68(): + return [ + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + ] + +def _seg_69(): + return [ + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + ] + +def _seg_70(): + return [ + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + ] + +def _seg_71(): + return [ + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F1AD, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + (0x1F23B, 'M', u'配'), + ] + +def _seg_72(): + return [ + (0x1F23C, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FA, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F971, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F97B, 'X'), + (0x1F97C, 'V'), + (0x1F9A3, 'X'), + (0x1F9B0, 'V'), + (0x1F9BA, 'X'), + (0x1F9C0, 'V'), + (0x1F9C3, 'X'), + (0x1F9D0, 'V'), + (0x1FA00, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + ] + +def _seg_73(): + return [ + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + ] + +def _seg_74(): + return [ + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + ] + +def _seg_75(): + return [ + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + ] + +def _seg_76(): + return [ + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + ] + +def _seg_77(): + return [ + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + ] + +def _seg_78(): + return [ + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() +) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py new file mode 100644 index 0000000..f2d0766 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py @@ -0,0 +1,2419 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.22' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() + + +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?') + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen)) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + @staticmethod + def _is_subnet_of(a, b): + try: + # Always false if one is v4 and the other is v6. + if a._version != b._version: + raise TypeError("%s and %s are not of the same version" (a, b)) + return (b.network_address <= a.network_address and + b.broadcast_address >= a.broadcast_address) + except AttributeError: + raise TypeError("Unable to test subnet containment " + "between %s and %s" % (a, b)) + + def subnet_of(self, other): + """Return True if this network is a subnet of other.""" + return self._is_subnet_of(self, other) + + def supernet_of(self, other): + """Return True if this network is a supernet of other.""" + return self._is_subnet_of(other, self) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py new file mode 100644 index 0000000..a6f44a5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py @@ -0,0 +1,347 @@ +# -*- coding: utf-8 -*- + +""" +lockfile.py - Platform-independent advisory file locks. + +Requires Python 2.5 unless you apply 2.4.diff +Locking is done on a per-thread basis instead of a per-process basis. + +Usage: + +>>> lock = LockFile('somefile') +>>> try: +... lock.acquire() +... except AlreadyLocked: +... print 'somefile', 'is locked already.' +... except LockFailed: +... print 'somefile', 'can\\'t be locked.' +... else: +... print 'got lock' +got lock +>>> print lock.is_locked() +True +>>> lock.release() + +>>> lock = LockFile('somefile') +>>> print lock.is_locked() +False +>>> with lock: +... print lock.is_locked() +True +>>> print lock.is_locked() +False + +>>> lock = LockFile('somefile') +>>> # It is okay to lock twice from the same thread... +>>> with lock: +... lock.acquire() +... +>>> # Though no counter is kept, so you can't unlock multiple times... +>>> print lock.is_locked() +False + +Exceptions: + + Error - base class for other exceptions + LockError - base class for all locking exceptions + AlreadyLocked - Another thread or process already holds the lock + LockFailed - Lock failed for some other reason + UnlockError - base class for all unlocking exceptions + AlreadyUnlocked - File was not locked. + NotMyLock - File was locked but not by the current thread/process +""" + +from __future__ import absolute_import + +import functools +import os +import socket +import threading +import warnings + +# Work with PEP8 and non-PEP8 versions of threading module. +if not hasattr(threading, "current_thread"): + threading.current_thread = threading.currentThread +if not hasattr(threading.Thread, "get_name"): + threading.Thread.get_name = threading.Thread.getName + +__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', + 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', + 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', + 'LockBase', 'locked'] + + +class Error(Exception): + """ + Base class for other exceptions. + + >>> try: + ... raise Error + ... except Exception: + ... pass + """ + pass + + +class LockError(Error): + """ + Base class for error arising from attempts to acquire the lock. + + >>> try: + ... raise LockError + ... except Error: + ... pass + """ + pass + + +class LockTimeout(LockError): + """Raised when lock creation fails within a user-defined period of time. + + >>> try: + ... raise LockTimeout + ... except LockError: + ... pass + """ + pass + + +class AlreadyLocked(LockError): + """Some other thread/process is locking the file. + + >>> try: + ... raise AlreadyLocked + ... except LockError: + ... pass + """ + pass + + +class LockFailed(LockError): + """Lock file creation failed for some other reason. + + >>> try: + ... raise LockFailed + ... except LockError: + ... pass + """ + pass + + +class UnlockError(Error): + """ + Base class for errors arising from attempts to release the lock. + + >>> try: + ... raise UnlockError + ... except Error: + ... pass + """ + pass + + +class NotLocked(UnlockError): + """Raised when an attempt is made to unlock an unlocked file. + + >>> try: + ... raise NotLocked + ... except UnlockError: + ... pass + """ + pass + + +class NotMyLock(UnlockError): + """Raised when an attempt is made to unlock a file someone else locked. + + >>> try: + ... raise NotMyLock + ... except UnlockError: + ... pass + """ + pass + + +class _SharedBase(object): + def __init__(self, path): + self.path = path + + def acquire(self, timeout=None): + """ + Acquire the lock. + + * If timeout is omitted (or None), wait forever trying to lock the + file. + + * If timeout > 0, try to acquire the lock for that many seconds. If + the lock period expires and the file is still locked, raise + LockTimeout. + + * If timeout <= 0, raise AlreadyLocked immediately if the file is + already locked. + """ + raise NotImplemented("implement in subclass") + + def release(self): + """ + Release the lock. + + If the file is not locked, raise NotLocked. + """ + raise NotImplemented("implement in subclass") + + def __enter__(self): + """ + Context manager support. + """ + self.acquire() + return self + + def __exit__(self, *_exc): + """ + Context manager support. + """ + self.release() + + def __repr__(self): + return "<%s: %r>" % (self.__class__.__name__, self.path) + + +class LockBase(_SharedBase): + """Base class for platform-specific lock classes.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = LockBase('somefile') + >>> lock = LockBase('somefile', threaded=False) + """ + super(LockBase, self).__init__(path) + self.lock_file = os.path.abspath(path) + ".lock" + self.hostname = socket.gethostname() + self.pid = os.getpid() + if threaded: + t = threading.current_thread() + # Thread objects in Python 2.4 and earlier do not have ident + # attrs. Worm around that. + ident = getattr(t, "ident", hash(t)) + self.tname = "-%x" % (ident & 0xffffffff) + else: + self.tname = "" + dirname = os.path.dirname(self.lock_file) + + # unique name is mostly about the current process, but must + # also contain the path -- otherwise, two adjacent locked + # files conflict (one file gets locked, creating lock-file and + # unique file, the other one gets locked, creating lock-file + # and overwriting the already existing lock-file, then one + # gets unlocked, deleting both lock-file and unique file, + # finally the last lock errors out upon releasing. + self.unique_name = os.path.join(dirname, + "%s%s.%s%s" % (self.hostname, + self.tname, + self.pid, + hash(self.path))) + self.timeout = timeout + + def is_locked(self): + """ + Tell whether or not the file is locked. + """ + raise NotImplemented("implement in subclass") + + def i_am_locking(self): + """ + Return True if this object is locking the file. + """ + raise NotImplemented("implement in subclass") + + def break_lock(self): + """ + Remove a lock. Useful if a locking thread failed to unlock. + """ + raise NotImplemented("implement in subclass") + + def __repr__(self): + return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, + self.path) + + +def _fl_helper(cls, mod, *args, **kwds): + warnings.warn("Import from %s module instead of lockfile package" % mod, + DeprecationWarning, stacklevel=2) + # This is a bit funky, but it's only for awhile. The way the unit tests + # are constructed this function winds up as an unbound method, so it + # actually takes three args, not two. We want to toss out self. + if not isinstance(args[0], str): + # We are testing, avoid the first arg + args = args[1:] + if len(args) == 1 and not kwds: + kwds["threaded"] = True + return cls(*args, **kwds) + + +def LinkFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import LinkLockFile from the + lockfile.linklockfile module. + """ + from . import linklockfile + return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", + *args, **kwds) + + +def MkdirFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import MkdirLockFile from the + lockfile.mkdirlockfile module. + """ + from . import mkdirlockfile + return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", + *args, **kwds) + + +def SQLiteFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import SQLiteLockFile from the + lockfile.mkdirlockfile module. + """ + from . import sqlitelockfile + return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", + *args, **kwds) + + +def locked(path, timeout=None): + """Decorator which enables locks for decorated function. + + Arguments: + - path: path for lockfile. + - timeout (optional): Timeout for acquiring lock. + + Usage: + @locked('/var/run/myname', timeout=0) + def myname(...): + ... + """ + def decor(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + lock = FileLock(path, timeout=timeout) + lock.acquire() + try: + return func(*args, **kwargs) + finally: + lock.release() + return wrapper + return decor + + +if hasattr(os, "link"): + from . import linklockfile as _llf + LockFile = _llf.LinkLockFile +else: + from . import mkdirlockfile as _mlf + LockFile = _mlf.MkdirLockFile + +FileLock = LockFile diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec26d7abf69d6041f23650cd7c6acb53b39e56af GIT binary patch literal 9916 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 LM(P%rs$%>fLocFW literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..188698a87b909f0b3d84e0a0fcdc56d2b0eb72a4 GIT binary patch literal 2297 zcma)7-H#MS5bvJvo!eUu*dQNjMudY+fJFoWBL|{FOmHzd5@4d4%x(AL?9RttckjV% zmKWg<;K3J7Om-hleDcl2zhqwZ<z9L8$*P_`xFe@=lCG}qs_Lq)`gP6C#YLaM_eXs6 z+i!sT6BpZ`1<VZ?@@pWBFq)E#hLj?2q(*4y*$ho)GAp$*JG3(=bTT(|GcWYAT3E~c z(5K`!VK#G~6XtOHnHerHW0kbrEjX35Xt^(5lSMjGJW8@*Ayj9JqQEJ=J4JVJGnTyc zk-HTqDQ9J^Qz%@{*{?QnQ7$08mt?#csdDktRPdN-31?mOv;CRC+<+lJ2Es{58G(CH zxWgje;yDeiD%Q|uF7uv~&|x*^!|bvJR)^Ws(KpKaog^RVxFD?Y&&UOFx67prR1w5M z54MAmO!7xTtcon@218K{xlo%y(F;;AK7FBe&i4cOR#sMm6c4x->^$}KDOqG34?5NQ zpL%Bk^&Q@wvun5FRPxHM(>36__+d>w7@xtA$05<1O+_Z8PZ@n?OpO_#<UYxdTSS=y zUwlMiO^LFYfjWoCGx|M!NOI!=nLy?SHSzg`<`&58r&KvpXGWeHb4ed&b6|=71a>aN z{*&Lpmpk?FBp9`sp?&=TzWjmzf{Nzcn>$@Vof+-dpPCb>%D@o6GP1hu^JV2}V!-Jy z;l#yCo1z>&{-qkshP{1Nym><{G3WIftoK(jf=?ef_ZWFWhjr%70NW4Adinqmz6$ew zJ-2F|(s;Z!KG@R$#Oih-#fk?fr9h}|VRFaIbMys|<3wTA5e41#Q6hL%+g>5SV%$6_ zgG2^#1yL>HYztrEqo01n@AvDi1EmE}$;*XNo~(~}l*bt_?QUAYTX4U;`-KpN5H^^U zu9{=sLZ&ndSz3s#vW9qy5Id!NcU4=ImQ=ASJ*lEx>o_Al3j{=I4P$^#4Ov^JoDW+T z81S?w4&a{0a~5eIjy96N5D|dj?~V3QBpZ;9_C_q)y&`2?$aW^$YyBv?A}{5aH`v8) zG~BpwUiGd#>WlP)-leNo+xObTWOz2oA*M7v`(&6u{;=C0<E9?b1~@E48?S-4Xk*0N zi*v)x(w!%FKLjDq10mF)P1>MM;{f&O67>xDU}wo_P|vi?CauH1Wz-Fe`t*c3Zti?* z=jO+Cv7-3ljNL-N6zqT#G9@!24=Z>pfF@&(uD6xhH>Uax%&5Gm9Q{`2Qe{qE(6td+ zb6%qi@zpXr<E07=d7<V&7$2*4@TQ!d3D!m`K<V0MknvWntR*t4WWs@%#4#jIAf>~f zBvMJS4|iN7N0A%?(xT!W<bzk_J>W`L@RUP)y$lOk2SRk-8j!;}eIq+_)xERR08<4o zc8XoXoKd(N?X)Z%R~6w2(D;u~#QPw>4nyibMaPGBmFCr*_jZ3846EW4%ZfrVObEl8 zQCv;25dhzJ7#-km$LI*WYRlC=-waVF?=Z;45meecZ}lXKGhGFE<~Ko4Vkt0r4LUxu zJMtZxdk6n6SnkZ7II4(76XX&9v{f$cHv`48>H_~ujQ$$5sDTdhHmFMM`vl{AYgc@) zwXkBf(u;JjiK5bvqO4$}lmlOnqV-XnVi$sy8%3<>Mv*v<F`Pt#<rB+DP9X_)69k*U z28Tlf&9g1TU-mrD^lU9@)zM*Zq(%Z<2t<K6h(tr12n=60ybARi-q^KtztSh{<+SuZ SsqV0Xk6EHY-SD6>1lB(l#3wrd literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab9b2a9019b1cca3b0a58d24f3089bf8d9bd549a GIT binary patch literal 2659 zcmb7F&2JM&6rb4-d%d<36G8}q!>VeaZXu=t3P>dd3RF~(A|(>k5?XCMYglJLoSAVx zEa%ej7xY$6_OX9LCC>c|IL)b2Ph5NKsqf9&ghaV?R`X_N-|Wusz4v=>?pLcWf%Yy~ zcsXAo<ZoO|ngx@)&;<j*2%|AcXp<&J)1bIEVzX)L(P~<Hw41gb3(W#EnH3ikr|Bf6 zW+`!-Zc=WRlS;FaRGU>wejv<dg*Sv1Lg&D2PBCMR)QcbBBvLojbg&_^xF<tDO1c@B z%3;xVB%&-`{XlU`K{-#d*5>^{gv!O)qacbyrb?@s#N~MUbPpG*jB-6n!mKA%^<K=w zfN4$0T6p55nJ~EvT|590k|t%OX)p>_)|kcYHx%qV#R{wlGn+ZA^oD??E-S-WWEED0 z(P2|;8paYc!J-*eeY(jat|0=#{%1Jz+A#Gt_PiD#kx}}}3q05qwq(ZlmeyBW=z458 z7NLI+U3>#Vk|7<C0Ua0vb7WB>jgC3A2Bc#%c;6{NFG6?P<{TLr1LBvoW6i#By>VMv zS@B{7amPCX?TbqyOF~3;ss4X9U-sl{bZE%#JPKkF9)8>}E{df^u_#vSF1G=_a(q8Z zBkB9f$b_=Gfqbp3P8OxAgphnZT{*8aA=4lUm7Nb}H)5*XOQWq`=%b=;DNBTLn@{PV zPR>_FnaB8d!skKr?@pu3qwPS3jqQLp+F8s(E*c4MY;=78mbj7L+-BEXes_EMs%+nS z)#35i?HjjmH`W{7sCy+!g$&~O%5FE^xz_6R@ulwmc9^n^HxM!+ZX_7u$!e*)$03yn zViP*M?3(G)0<~y=?uf^iCf;ZnuooLT$$_rpT?3{MfP$MPUK!97qfGXxq(eF)`^H$a z3?tpN_%bkp-kiL5_+4h~o9UDU`oa$LJUM{%?z_F39P?#FDS1xPUo9dFn=b!{5`1KF z=!^)n&XIj<V0B8e)NwZr{+Bd6<zWR7R7aG*Wn^uF?0t@BU;u{qV=RBlDQ3go@*Fv! zzfeFi&5)VnHGEM6_QLs~ImM8#cE0mxvi0l*ku!J>a}JE*=@DSU)3%;H*JHi3%CP{v zdixu;Kfe2b9_E-Q{fpxa_jZCvCzZ^+ptaS5#L5ZZ&bYTI`m>9|i-Z^CWk9P!)<50W z6~u#&bXJD2RT(=Q^;v!v{;n+KmNJuImsfFZ>!9-*&Wk^-J>)#&$`pG-IpJ;#Xx`40 z9de##s_^jPi^ps0Ia>?iZX~4Ov+yA=p+F0iE#ffj@&eAStQ)4vZp9g7lg-cICXK-X z-uW7bg*GY^{;!#yi*xvKacuH=Scqj1gw9Zh)~I7Rv|vmb1~p(cMJu!dD~ry8)-o!l zMO|7kXN?-|pE*j?@gH00cx*Ugsnjfe29p69k`WQ}61WJlGsbbh0IV_c>NKL_x-2lL zNE0paP)8nl0CNX4C7ffl>*i{|mPaYg<Rn7p^Ea4hA-n8t^rVMcD5FpjTvdvMpX)f5 zOzmwQD*ibxwZAd9RH2u~QM##Yo<Q2_2-a!tWvm*X`jUrn2v^KKcr7reiT31__TF(X zjrX4HB`gM#bm$O00Ne)~>1y4|@u4yYiEKI<3%?Ai$IykY6|{f$XpBA@fAaZr@MRvQ zY*tc;iU~NZ2@YHT{Wuu(*vVj2CGvwrdmApVCx}YlSm2%h!ZBQ*Z2SlfP55}N{RoRs zUBe&kehJqcmOF6N1M+eKiXIu-dJmQnb3jK1Qf2GHbG#6dM!KA6>VR9F<Cf$}8bjV; zz^}l8d>X|Ph`OOeuPnS+jwh450XN&GHWYa-kUs>XKSLL2fBvYYhg<8$`YMLk#rqC_ z3-_Jt`$@)nG0rQ#zts!kv8L$zENl6`zBKq(Z~$+hz<~3sD6XM6q^6!>uJbYoq@_Rx zK^9ZD>Rxml$8;>Mt54&(?Vjv$IG3Z_IVLW@fC9@H_fUKWLJ@sM>k5=75E^?}q4W<= XLZO^*bIVq+F6cC=L8;M?;aUFy*cp1- literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ea7370d484f363c517211591a342f067c75da02 GIT binary patch literal 4859 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 Qhy3i>+@1f-d(S)dAIL7)ApigX literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a61e6ea9d6aa5b8f3a34ee42e3bc6f3087b59af3 GIT binary patch literal 3758 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 YZSPXP$mxx_ggeNiy9Wu*H@;{74-`0*y#N3J literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..78b1075e744770eacf47bb30f4c0d64627c193bd GIT binary patch literal 2182 zcmah~TW=dh6rP#A`jSgSXqz;Y6;P-p8bfGlDnSXQz)LX?iBzzJRvXVcU3)Li%s8zr z_l4#MAl~4iavpi*4XM9?pRlhy<uCBWIkOv5TuY2KGiT1sp84iG7vEc0s1j%|g7qJ^ zLHY|9XUzm*2fBO!11FruB%y6eQD!k~Gd&w^gB#q8&BSV3iQTpnr|l$e+f6F%3MF3? zZgKmVa67b~8SN@(yQJZqf<@Ax`BJbivv{aNKS~CfP_0vn8&>W<$U6OdfeiCXD^s`# zxfZ_};Ucf$xECd1HdOh-=dlO_u6IJ-LEC4|0AUBZybnW2+LRN(O#$;VH@S68+a|xj zZSH_%ahF$)N!#XCUW3`;b-n<z%NO|)%oT0`_LY2Tca+3Y+D8aqMR7QO4<#??bV4aT zm3e{J1+_PnQF`FX;_&sY#^zqDgPdZ+*@pfFba@>HMW%E@CUn9k#)(OZVm)JOPDsx> zp`5Of3GppX;C|K;_^5_0&_?e1ew0Sa_j8uX+#CezQEtgW9I3oEOryhL=%+yvHq6|V zVcZpU{gHZvgaM_FDmeU&h!xoRd(<3==qONO^C%F_ZWi-U$Yvs%`#s;^mbcQ|NBm~T z9~^Ccpt{=!JrRG{y>;hKbFVpw1~;NqsvwSUJQ<{qKkD?xsMOs*3R9kmW(-6jH_eij zv-Rd+Brp&cpi9jWTV~_SGemEmy|u&O95!Uag|2D*6NCvkxL*<V2~Cka@{}q%r6=Sm zD|fbFrhQXv0nzj}=%4&NT2*Xn!0Cc+M#)2xDw8O?UllJX!QX^Tof9HBx}dc5ys$iB zVC{Kn^(W<W29_!p$us&RO&3*_qvdi9U)0L4e}~z;LQ=-T!IXSY4sU)3iM0#!Lp?X_ zmcV2fzgvd6_c(|YMifR^=WrN_&_n*bZYI2Ia=dy?dXe;kA{X>l$WM{ggI|Ba_Qz+9 zy0`%A+(fU78j4Qo39*Q)3L5m$L%H+q?w3MjBCkh&kodR(mkS4u=^zrwJA_&shJ%J7 zmQb&ayWnbHUw{#%!%Dn{XPpu?F628f5POBXbeXyg8eOG}%w?vr3ObY3nMteEGsc%@ zgP^q1L2|I+jB%i2;4TQ@D{?~QWd)uF?pf)Ji=a0^zo|^^qf)P|sST$b^ny+>qcvVG zs7y0e(m1|SXpn`Fzwhl2m500gBM)-R%`1`A424`+fS@2~4JAzSf@yo0V$~3rK+~WF zVY3X0Fb<*UeGEq=dX5zQ&_((x59QhUJfJrf>Cq`hqj5r^aL`u6)JTdNU`O(Q;D|TC z$fwYyPB%JUn{~y%ubvOWn*otsg(`<h27q9+`uJY}u<UbK0>9A|<t~;e4G|wRpD}?P z??5k#2J*D=3donjcRtRmVBlr4#QHhTGAID0H4ml0Z|7sntNZYRzK)Cg|ADwZ3-SD5 zgYC7Dk}4K<EZk7otG=IPd>Er#_x;0R5SKfS@AItV`?_|D4Y)+Si32)LQzPC&={(A` zg!v~bFkpm9Bo`B|YFFQO9oKM8z1OJWz1^W23b<Eb1QhRo9i*J-Kc6Djb%g7(fE7W1 YJnzQb{iJxsT})VsXY0&`+}|+&0XOaWu>b%7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 0000000..2ca9be0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import + +import time +import os + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class LinkLockFile(LockBase): + """Lock access to a file using atomic property of link(2). + + >>> lock = LinkLockFile('somefile') + >>> lock = LinkLockFile('somefile', threaded=False) + """ + + def acquire(self, timeout=None): + try: + open(self.unique_name, "wb").close() + except IOError: + raise LockFailed("failed to create %s" % self.unique_name) + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a hard link to it. + try: + os.link(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + nlinks = os.stat(self.unique_name).st_nlink + if nlinks == 2: + # The original link plus the one I created == 2. We're + # good to go. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + os.unlink(self.unique_name) + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name) and + os.stat(self.unique_name).st_nlink == 2) + + def break_lock(self): + if os.path.exists(self.lock_file): + os.unlink(self.lock_file) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000..05a8c96 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import, division + +import time +import os +import sys +import errno + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class MkdirLockFile(LockBase): + """Lock file by creating a directory.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = MkdirLockFile('somefile') + >>> lock = MkdirLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + # Lock file itself is a directory. Place the unique file name into + # it. + self.unique_name = os.path.join(self.lock_file, + "%s.%s%s" % (self.hostname, + self.tname, + self.pid)) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + else: + wait = max(0, timeout / 10) + + while True: + try: + os.mkdir(self.lock_file) + except OSError: + err = sys.exc_info()[1] + if err.errno == errno.EEXIST: + # Already locked. + if os.path.exists(self.unique_name): + # Already locked by me. + return + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock. + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(wait) + else: + # Couldn't create the lock for some other reason + raise LockFailed("failed to create %s" % self.lock_file) + else: + open(self.unique_name, "wb").close() + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.rmdir(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name)) + + def break_lock(self): + if os.path.exists(self.lock_file): + for name in os.listdir(self.lock_file): + os.unlink(os.path.join(self.lock_file, name)) + os.rmdir(self.lock_file) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 0000000..069e85b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +# pidlockfile.py +# +# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> +# +# This is free software: you may copy, modify, and/or distribute this work +# under the terms of the Python Software Foundation License, version 2 or +# later as published by the Python Software Foundation. +# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. + +""" Lockfile behaviour implemented via Unix PID files. + """ + +from __future__ import absolute_import + +import errno +import os +import time + +from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, + LockTimeout) + + +class PIDLockFile(LockBase): + """ Lockfile implemented as a Unix PID file. + + The lock file is a normal file named by the attribute `path`. + A lock's PID file contains a single line of text, containing + the process ID (PID) of the process that acquired the lock. + + >>> lock = PIDLockFile('somefile') + >>> lock = PIDLockFile('somefile') + """ + + def __init__(self, path, threaded=False, timeout=None): + # pid lockfiles don't support threaded operation, so always force + # False as the threaded arg. + LockBase.__init__(self, path, False, timeout) + self.unique_name = self.path + + def read_pid(self): + """ Get the PID from the lock file. + """ + return read_pid_from_pidfile(self.path) + + def is_locked(self): + """ Test if the lock is currently held. + + The lock is held if the PID file for this lock exists. + + """ + return os.path.exists(self.path) + + def i_am_locking(self): + """ Test if the lock is held by the current process. + + Returns ``True`` if the current process ID matches the + number stored in the PID file. + """ + return self.is_locked() and os.getpid() == self.read_pid() + + def acquire(self, timeout=None): + """ Acquire the lock. + + Creates the PID file for this lock, or raises an error if + the lock could not be acquired. + """ + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + try: + write_pid_to_pidfile(self.path) + except OSError as exc: + if exc.errno == errno.EEXIST: + # The lock creation failed. Maybe sleep a bit. + if time.time() > end_time: + if timeout is not None and timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + raise LockFailed("failed to create %s" % self.path) + else: + return + + def release(self): + """ Release the lock. + + Removes the PID file to release the lock, or raises an + error if the current process does not hold the lock. + + """ + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + remove_existing_pidfile(self.path) + + def break_lock(self): + """ Break an existing lock. + + Removes the PID file if it already exists, otherwise does + nothing. + + """ + remove_existing_pidfile(self.path) + + +def read_pid_from_pidfile(pidfile_path): + """ Read the PID recorded in the named PID file. + + Read and return the numeric PID recorded as text in the named + PID file. If the PID file cannot be read, or if the content is + not a valid PID, return ``None``. + + """ + pid = None + try: + pidfile = open(pidfile_path, 'r') + except IOError: + pass + else: + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. + # + # Programs that read PID files should be somewhat flexible + # in what they accept; i.e., they should ignore extra + # whitespace, leading zeroes, absence of the trailing + # newline, or additional lines in the PID file. + + line = pidfile.readline().strip() + try: + pid = int(line) + except ValueError: + pass + pidfile.close() + + return pid + + +def write_pid_to_pidfile(pidfile_path): + """ Write the PID in the named PID file. + + Get the numeric process ID (“PID”) of the current process + and write it to the named file as a line of text. + + """ + open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) + open_mode = 0o644 + pidfile_fd = os.open(pidfile_path, open_flags, open_mode) + pidfile = os.fdopen(pidfile_fd, 'w') + + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. For + # example, if crond was process number 25, /var/run/crond.pid + # would contain three characters: two, five, and newline. + + pid = os.getpid() + pidfile.write("%s\n" % pid) + pidfile.close() + + +def remove_existing_pidfile(pidfile_path): + """ Remove the named PID file if it exists. + + Removing a PID file that doesn't already exist puts us in the + desired state, so we ignore the condition if the file does not + exist. + + """ + try: + os.remove(pidfile_path) + except OSError as exc: + if exc.errno == errno.ENOENT: + pass + else: + raise diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 0000000..f997e24 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py @@ -0,0 +1,156 @@ +from __future__ import absolute_import, division + +import time +import os + +try: + unicode +except NameError: + unicode = str + +from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked + + +class SQLiteLockFile(LockBase): + "Demonstrate SQL-based locking." + + testdb = None + + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = SQLiteLockFile('somefile') + >>> lock = SQLiteLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + self.lock_file = unicode(self.lock_file) + self.unique_name = unicode(self.unique_name) + + if SQLiteLockFile.testdb is None: + import tempfile + _fd, testdb = tempfile.mkstemp() + os.close(_fd) + os.unlink(testdb) + del _fd, tempfile + SQLiteLockFile.testdb = testdb + + import sqlite3 + self.connection = sqlite3.connect(SQLiteLockFile.testdb) + + c = self.connection.cursor() + try: + c.execute("create table locks" + "(" + " lock_file varchar(32)," + " unique_name varchar(32)" + ")") + except sqlite3.OperationalError: + pass + else: + self.connection.commit() + import atexit + atexit.register(os.unlink, SQLiteLockFile.testdb) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + elif timeout <= 0: + wait = 0 + else: + wait = timeout / 10 + + cursor = self.connection.cursor() + + while True: + if not self.is_locked(): + # Not locked. Try to lock it. + cursor.execute("insert into locks" + " (lock_file, unique_name)" + " values" + " (?, ?)", + (self.lock_file, self.unique_name)) + self.connection.commit() + + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) > 1: + # Nope. Someone else got there. Remove our lock. + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + else: + # Yup. We're done, so go home. + return + else: + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) == 1: + # We're the locker, so go home. + return + + # Maybe we should wait a bit longer. + if timeout is not None and time.time() > end_time: + if timeout > 0: + # No more waiting. + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock and we are impatient.. + raise AlreadyLocked("%s is already locked" % self.path) + + # Well, okay. We'll give it a bit longer. + time.sleep(wait) + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me (by %s)" % + (self.unique_name, self._who_is_locking())) + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + + def _who_is_locking(self): + cursor = self.connection.cursor() + cursor.execute("select unique_name from locks" + " where lock_file = ?", + (self.lock_file,)) + return cursor.fetchone()[0] + + def is_locked(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?", + (self.lock_file,)) + rows = cursor.fetchall() + return not not rows + + def i_am_locking(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?" + " and unique_name = ?", + (self.lock_file, self.unique_name)) + return not not cursor.fetchall() + + def break_lock(self): + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where lock_file = ?", + (self.lock_file,)) + self.connection.commit() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 0000000..23b41f5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +import os +import time + +from . import (LockBase, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class SymlinkLockFile(LockBase): + """Lock access to a file using symlink(2).""" + + def __init__(self, path, threaded=True, timeout=None): + # super(SymlinkLockFile).__init(...) + LockBase.__init__(self, path, threaded, timeout) + # split it back! + self.unique_name = os.path.split(self.unique_name)[1] + + def acquire(self, timeout=None): + # Hopefully unnecessary for symlink. + # try: + # open(self.unique_name, "wb").close() + # except IOError: + # raise LockFailed("failed to create %s" % self.unique_name) + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a symbolic link to it. + try: + os.symlink(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + if self.i_am_locking(): + # Linked to out unique name. Proceed. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout / 10 if timeout is not None else 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.islink(self.lock_file) + + def i_am_locking(self): + return (os.path.islink(self.lock_file) + and os.readlink(self.lock_file) == self.unique_name) + + def break_lock(self): + if os.path.islink(self.lock_file): # exists && link + os.unlink(self.lock_file) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..2afca5a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,66 @@ +# coding: utf-8 +from pip._vendor.msgpack._version import version +from pip._vendor.msgpack.exceptions import * + +from collections import namedtuple + + +class ExtType(namedtuple('ExtType', 'code data')): + """ExtType represents ext type in msgpack.""" + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super(ExtType, cls).__new__(cls, code, data) + + +import os +if os.environ.get('MSGPACK_PUREPYTHON'): + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker +else: + try: + from pip._vendor.msgpack._packer import Packer + from pip._vendor.msgpack._unpacker import unpackb, Unpacker + except ImportError: + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + + +def unpack(stream, **kwargs): + """ + Unpack an object from `stream`. + + Raises `ExtraData` when `stream` contains extra bytes. + See :class:`Unpacker` for options. + """ + data = stream.read() + return unpackb(data, **kwargs) + + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a07d9845ede07969768faa52a53428cd069b1379 GIT binary patch literal 2078 zcmb7EUvC>l5Z}E!pD!0DP23VhOUnsW0wdLK3swIJAt+P@Dnitz|4u^Z^X)n~xqsbV zJBj6jL@M<K`Wccp_zrvy9`==|eg&SG*|SZH!UJpV?A+{nc78Lz*_%sCK7sLjeEPdz zTtfcDkJ<1*`4p!70|X<CrX-^wrKnq}wTY{p+L;qNl-wrFVYO$3)i|uoJ+Kb!um&gU zsT;c7-L4;c%sZl@3$}%HA@f5&TMQSoM%bVv|9U?FyPqzh-Q2L4F8{OtkmT<>grC^) z#jlj$?>H}yNp3wNtihI^k#L1AvlFncvK6)pYm+y_lYB8e#aF^N_-eSu>i0;i`4X^^ z7S;6;7jjVKpwbUO_<5XhriNw86Ff2-_EeDpD4c|pk<el^w4akcWfrrad7<;1I3%or zdq>xA?WxWEl8@h;DuLjo;F9M`27FHi3O0j59%OQ>jFX*qGP?oS8cbZ}0}zT#sG<j! zY$~|%fc`|mVksLe=fPs3h1nD8z+ZN#xW=3vDsSc%B??Mn&exPXAqUoBeFDBF){zY{ zy6fYWq+mSAhEfGR3`UKcELQQ{(%V;D3JNj2{1L>s`P%u5KU}(ewdHAlAP2crah`B( zgA=`gz;6jr2wgKSwErMZhclBLmRtygsOwRb^W7+F+1gH0sU5sPI~WAiVj+r>G?p@o zej|T9>6BtHiWTpSV$tarDTBgwGSTU6N6|HTCBHgiA0<&ax_nXfuWfCM^iu!I_3NF@ zPB|zqm;lrC!d{v0ewb{J(P(Bg;yEisXIh3%6b<r$ilTP8FP0!gY!kT*f>57&X0E|H zJ~1t8dxpT(9;iT`DAIluWd$3is5heM$uLf*I{=s!Nfa61dT9zU;b{uCCfs5~i;7j$ zPols?VM|H}73xr9884VxV5Zi?<~R3lZ+!OoooM6!-CG-vH^2OL9Wv@}0I#^v^<j<- z>uK-4QMdsAZ-KLxB~HU4&VWcP5IFD_yz&lAc@BgkeW2S5`V=U3NGJB8H6cgz2;Tz= zG_uBz`~U`C78Jd0o~WQ(bb~l&!LAr6;1!U)2)a@U9%o(OoW93-aKjY$Mz;#H8}thi z6s3Y@lx=eeK$tjn%{bBy!hqhQg?1}%+TGcW#g^1AZUL+2DXemL7UF*gfgmd4`c$AL zK}O?1%-CiI>k23aD}8}D0VANJ<A?u=PH;68d0=j4fg$?;00+s(8km4U$4rX=#p@7s z4gL38up>>0T=6dGa|jsz9KtF1n2<wqM4nm-`n*pk0LH-h*}$j>0JWJ_sxOLcUYd3l z{@r*WxeU6%a1nn21nUO7-}8KaEJ%u6#n4gsj)}NJURCVXvd+kMOkrD=c7P1b&<~1? zC91$<5&oS4x8m<**sAJS_oz4zU#&Ow+tA1DX%Dw&PbqwxH(g-D^tt1X@V$grRMU$| zk-}qdcqfo2)zf4ZQrCGt8i*p-_7+#i-_?)Pv<DTciaBqm@XT?yMiooLv&U{$Fri@= zzskx&DD#3EewdOQ$l6JZnCTiycrMv6D|HQ}d?jm!LHKrP@8jwn`UEo}F=q|xSq*!w a;n4<Nvn-IO=rTQRd%m~eH5}?#4*eT=k{a0n literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80628a815177378d9b80e12548841d11dd35bfbc GIT binary patch literal 227 zcmZ?b<>g`kf<1{+u_8eFF^B^Lj6jA15EpX*i4=w?h7`tN22CbS=9fS|!%J2W!3HG! zG#PKPm!%dJXXfXvWGDiOgNa{-`UORqWr-!J`elhl`f2$&DL_T~xkdU(S@H1}#in`Y zWho}f@daf@1|?}0=~+cNhH0jjmii(31(^l9nR&$}i8(pC6$N?a#>rV#AVDyWFH6l! m$uH8+Elw{;OwQH^^1*iN6;$5hu*uC&Da}c>13A7Jh#3ILuRVGI literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25af0065fe6f3f1ae573b3febf4d91ac5ad82d29 GIT binary patch literal 2183 zcmcIl-EPxJ6t-h0anhzui^K&&XfAfO8$@F$AV5N>0?G;@rARD$5rjsrXB=Ey+l=kB zM7@J6xZ*K*2cE>Y`xbk}cP7nG(^jGvJJC$$o1Zi1=R3!bTdk&n_QSjKmf42!FM&y` zVzPyveZlaTAq-)DMwiAXt8W5VgavF#6Sx9wiz;wcV+*(@>cDkrO8b-DuVTd!4XiX| z6*p?YO|b;Lq$SpYmqiP>CF}ZzgOwGrij`IA$OdFIMf;V}S@WUKw3(P~p=WIj(&(GQ z=vRc<w?qYJt#b8soO=HI?L%Ltd6>kb7f)rXr0?ZYbQyb{NjBYMVVvdC6D&^{4*2hw z7e!1?t};=mFdnc%OT?_(>)55kdF<^=&dVm}`-vzbnlE$yq41*PojT_t@j3r)s2bGN z!+)8Zs&EKB+@Yu3Ac=%jnY*vt-966lXLsX!LvhFF>2ULA9^4=7spwX4_rU}AZ#NCo z4N?`_Z5*cY!EJwUM2oufp^QbM-2H4ohPzYsvu^rPk-Mm86%3B4@!9@d#(|kX;mb<d zd|U*9RL_bi>UAtdB9uh~s558T*v2}oIT(mXljjKk@^g)yBHsy~db#(DuQec@`s6j5 zpZ(f7WNDAd@{bo4a$BiHjea}Dmf7ZnE<}SxXOPjeSkHNc@~t(eBjFP|l2^Crz*P*h z0Eo(G1EjWujen#X0#Yj*+lRUG$U{EGfg1gjh$rYeCyvY`gBwQ`jK~dKGkXZ7GbXVV zWmS?4WQv{1C{Pr3MGDSoPoX59hjEy5zD|-U;)Yo>N9$7+x|0Jw5scb|Y+4t(Axz>? zZ**<^`k%WUhE$Z{Pzt0O)L;U(boJ96Q?202q8do0ELWUg#-5I|VUE`3b<n%LPIWON zt0au#J||HpqbBMSHr7Zasp*)Gt!TwZpEj~)3;n!G(|UQL&OATGoQu{OO5fuuvuMn@ z^dcLskdnj!<Tv39S+PP^%s4*!dJ?lRW6BFN1nl6Qj9LCMl`IL63Tct+=+TL+NYg~2 z!m?eghWQ^E8&XcuUJ*}syUiv;JLRa^^V1a52QQLm#L{b1N7#z+g&eU)hVKle3Zmp- zTnxUQT3U2R80T^z)y&!i_QO5OiwD|I$5naaA@*it^ZNDMw{9@{+wA<G9=QY${66Oq z!oAKC6_Mj_qy8G`nysjGmd#lp6xAu66Pi-mon`BUdlU&gE4fPN;rP4wNPl@KtJ^mH K*6nr!WBn&Ag4v`1 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2497ad74acadb89e3b7e98f8b9defe48aebeaee8 GIT binary patch literal 24555 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 G-v0ycqNqv$ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py new file mode 100644 index 0000000..d28f0de --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 5, 6) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..9766881 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,41 @@ +class UnpackException(Exception): + """Deprecated. Use Exception instead to catch all exception during unpacking.""" + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class UnpackValueError(UnpackException, ValueError): + """Deprecated. Use ValueError instead.""" + + +class ExtraData(UnpackValueError): + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + + +class PackException(Exception): + """Deprecated. Use Exception instead to catch all exception during packing.""" + + +class PackValueError(PackException, ValueError): + """PackValueError is raised when type of input data is supported but it's value is unsupported. + + Deprecated. Use ValueError instead. + """ + + +class PackOverflowError(PackValueError, OverflowError): + """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). + + Deprecated. Use ValueError instead. + """ diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..9418421 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,977 @@ +"""Fallback pure Python implementation of msgpack""" + +import sys +import struct +import warnings + +if sys.version_info[0] == 3: + PY3 = True + int_types = int + Unicode = str + xrange = range + def dict_iteritems(d): + return d.items() +else: + PY3 = False + int_types = (int, long) + Unicode = unicode + def dict_iteritems(d): + return d.iteritems() + + +if hasattr(sys, 'pypy_version_info'): + # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own + # StringBuilder is fastest. + from __pypy__ import newlist_hint + try: + from __pypy__.builders import BytesBuilder as StringBuilder + except ImportError: + from __pypy__.builders import StringBuilder + USING_STRINGBUILDER = True + class StringIO(object): + def __init__(self, s=b''): + if s: + self.builder = StringBuilder(len(s)) + self.builder.append(s) + else: + self.builder = StringBuilder() + def write(self, s): + if isinstance(s, memoryview): + s = s.tobytes() + elif isinstance(s, bytearray): + s = bytes(s) + self.builder.append(s) + def getvalue(self): + return self.builder.build() +else: + USING_STRINGBUILDER = False + from io import BytesIO as StringIO + newlist_hint = lambda size: [] + + +from pip._vendor.msgpack.exceptions import ( + BufferFull, + OutOfData, + UnpackValueError, + PackValueError, + PackOverflowError, + ExtraData) + +from pip._vendor.msgpack import ExtType + + +EX_SKIP = 0 +EX_CONSTRUCT = 1 +EX_READ_ARRAY_HEADER = 2 +EX_READ_MAP_HEADER = 3 + +TYPE_IMMEDIATE = 0 +TYPE_ARRAY = 1 +TYPE_MAP = 2 +TYPE_RAW = 3 +TYPE_BIN = 4 +TYPE_EXT = 5 + +DEFAULT_RECURSE_LIMIT = 511 + + +def _check_type_strict(obj, t, type=type, tuple=tuple): + if type(t) is tuple: + return type(obj) in t + else: + return type(obj) is t + + +def _get_data_from_buffer(obj): + try: + view = memoryview(obj) + except TypeError: + # try to use legacy buffer protocol if 2.7, otherwise re-raise + if not PY3: + view = memoryview(buffer(obj)) + warnings.warn("using old buffer interface to unpack %s; " + "this leads to unpacking errors if slicing is used and " + "will be removed in a future version" % type(obj), + RuntimeWarning) + else: + raise + if view.itemsize != 1: + raise ValueError("cannot unpack from multi-byte object") + return view + + +def unpack(stream, **kwargs): + warnings.warn( + "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", + PendingDeprecationWarning) + data = stream.read() + return unpackb(data, **kwargs) + + +def unpackb(packed, **kwargs): + """ + Unpack an object from `packed`. + + Raises `ExtraData` when `packed` contains extra bytes. + See :class:`Unpacker` for options. + """ + unpacker = Unpacker(None, **kwargs) + unpacker.feed(packed) + try: + ret = unpacker._unpack() + except OutOfData: + raise UnpackValueError("Data is not enough.") + if unpacker._got_extradata(): + raise ExtraData(ret, unpacker._get_extradata()) + return ret + + +class Unpacker(object): + """Streaming unpacker. + + arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param bool raw: + If true, unpack msgpack raw to Python bytes (default). + Otherwise, unpack to Python str (or unicode on Python 2) by decoding + with UTF-8 encoding (recommended). + Currently, the default is true, but it will be changed to false in + near future. So you must specify it explicitly for keeping backward + compatibility. + + *encoding* option which is deprecated overrides this option. + + :param callable object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param callable object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str encoding: + Encoding used for decoding msgpack raw. + If it is None (default), msgpack raw is deserialized to Python bytes. + + :param str unicode_errors: + (deprecated) Used for decoding msgpack raw with *encoding*. + (default: `'strict'`) + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means system's INT_MAX (default). + Raises `BufferFull` exception when it is insufficient. + You should set this parameter when unpacking data from untrusted source. + + :param int max_str_len: + Limits max length of str. (default: 2**31-1) + + :param int max_bin_len: + Limits max length of bin. (default: 2**31-1) + + :param int max_array_len: + Limits max length of array. (default: 2**31-1) + + :param int max_map_len: + Limits max length of map. (default: 2**31-1) + + + example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like, raw=False) + for o in unpacker: + process(o) + + example of streaming deserialize from socket:: + + unpacker = Unpacker(raw=False) + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + """ + + def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, + object_hook=None, object_pairs_hook=None, list_hook=None, + encoding=None, unicode_errors=None, max_buffer_size=0, + ext_hook=ExtType, + max_str_len=2147483647, # 2**32-1 + max_bin_len=2147483647, + max_array_len=2147483647, + max_map_len=2147483647, + max_ext_len=2147483647): + + if encoding is not None: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + if file_like is None: + self._feeding = True + else: + if not callable(file_like.read): + raise TypeError("`file_like.read` must be callable") + self.file_like = file_like + self._feeding = False + + #: array of bytes fed. + self._buffer = bytearray() + # Some very old pythons don't support `struct.unpack_from()` with a + # `bytearray`. So we wrap it in a `buffer()` there. + if sys.version_info < (2, 7, 6): + self._buffer_view = buffer(self._buffer) + else: + self._buffer_view = self._buffer + #: Which position we currently reads + self._buff_i = 0 + + # When Unpacker is used as an iterable, between the calls to next(), + # the buffer is not "consumed" completely, for efficiency sake. + # Instead, it is done sloppily. To make sure we raise BufferFull at + # the correct moments, we have to keep track of how sloppy we were. + # Furthermore, when the buffer is incomplete (that is: in the case + # we raise an OutOfData) we need to rollback the buffer to the correct + # state, which _buf_checkpoint records. + self._buf_checkpoint = 0 + + self._max_buffer_size = max_buffer_size or 2**31-1 + if read_size > self._max_buffer_size: + raise ValueError("read_size must be smaller than max_buffer_size") + self._read_size = read_size or min(self._max_buffer_size, 16*1024) + self._raw = bool(raw) + self._encoding = encoding + self._unicode_errors = unicode_errors + self._use_list = use_list + self._list_hook = list_hook + self._object_hook = object_hook + self._object_pairs_hook = object_pairs_hook + self._ext_hook = ext_hook + self._max_str_len = max_str_len + self._max_bin_len = max_bin_len + self._max_array_len = max_array_len + self._max_map_len = max_map_len + self._max_ext_len = max_ext_len + self._stream_offset = 0 + + if list_hook is not None and not callable(list_hook): + raise TypeError('`list_hook` is not callable') + if object_hook is not None and not callable(object_hook): + raise TypeError('`object_hook` is not callable') + if object_pairs_hook is not None and not callable(object_pairs_hook): + raise TypeError('`object_pairs_hook` is not callable') + if object_hook is not None and object_pairs_hook is not None: + raise TypeError("object_pairs_hook and object_hook are mutually " + "exclusive") + if not callable(ext_hook): + raise TypeError("`ext_hook` is not callable") + + def feed(self, next_bytes): + assert self._feeding + view = _get_data_from_buffer(next_bytes) + if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): + raise BufferFull + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + self._buffer += view + + def _consume(self): + """ Gets rid of the used parts of the buffer. """ + self._stream_offset += self._buff_i - self._buf_checkpoint + self._buf_checkpoint = self._buff_i + + def _got_extradata(self): + return self._buff_i < len(self._buffer) + + def _get_extradata(self): + return self._buffer[self._buff_i:] + + def read_bytes(self, n): + return self._read(n) + + def _read(self, n): + # (int) -> bytearray + self._reserve(n) + i = self._buff_i + self._buff_i = i+n + return self._buffer[i:i+n] + + def _reserve(self, n): + remain_bytes = len(self._buffer) - self._buff_i - n + + # Fast path: buffer has n bytes already + if remain_bytes >= 0: + return + + if self._feeding: + self._buff_i = self._buf_checkpoint + raise OutOfData + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Read from file + remain_bytes = -remain_bytes + while remain_bytes > 0: + to_read_bytes = max(self._read_size, remain_bytes) + read_data = self.file_like.read(to_read_bytes) + if not read_data: + break + assert isinstance(read_data, bytes) + self._buffer += read_data + remain_bytes -= len(read_data) + + if len(self._buffer) < n + self._buff_i: + self._buff_i = 0 # rollback + raise OutOfData + + def _read_header(self, execute=EX_CONSTRUCT): + typ = TYPE_IMMEDIATE + n = 0 + obj = None + self._reserve(1) + b = self._buffer[self._buff_i] + self._buff_i += 1 + if b & 0b10000000 == 0: + obj = b + elif b & 0b11100000 == 0b11100000: + obj = -1 - (b ^ 0xff) + elif b & 0b11100000 == 0b10100000: + n = b & 0b00011111 + typ = TYPE_RAW + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b & 0b11110000 == 0b10010000: + n = b & 0b00001111 + typ = TYPE_ARRAY + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b & 0b11110000 == 0b10000000: + n = b & 0b00001111 + typ = TYPE_MAP + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + elif b == 0xc0: + obj = None + elif b == 0xc2: + obj = False + elif b == 0xc3: + obj = True + elif b == 0xc4: + typ = TYPE_BIN + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc5: + typ = TYPE_BIN + self._reserve(2) + n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc6: + typ = TYPE_BIN + self._reserve(4) + n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc7: # ext 8 + typ = TYPE_EXT + self._reserve(2) + L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) + self._buff_i += 2 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc8: # ext 16 + typ = TYPE_EXT + self._reserve(3) + L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) + self._buff_i += 3 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc9: # ext 32 + typ = TYPE_EXT + self._reserve(5) + L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) + self._buff_i += 5 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xca: + self._reserve(4) + obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcb: + self._reserve(8) + obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xcc: + self._reserve(1) + obj = self._buffer[self._buff_i] + self._buff_i += 1 + elif b == 0xcd: + self._reserve(2) + obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xce: + self._reserve(4) + obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcf: + self._reserve(8) + obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd0: + self._reserve(1) + obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] + self._buff_i += 1 + elif b == 0xd1: + self._reserve(2) + obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xd2: + self._reserve(4) + obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xd3: + self._reserve(8) + obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd4: # fixext 1 + typ = TYPE_EXT + if self._max_ext_len < 1: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) + self._reserve(2) + n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) + self._buff_i += 2 + elif b == 0xd5: # fixext 2 + typ = TYPE_EXT + if self._max_ext_len < 2: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) + self._reserve(3) + n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) + self._buff_i += 3 + elif b == 0xd6: # fixext 4 + typ = TYPE_EXT + if self._max_ext_len < 4: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) + self._reserve(5) + n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) + self._buff_i += 5 + elif b == 0xd7: # fixext 8 + typ = TYPE_EXT + if self._max_ext_len < 8: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) + self._reserve(9) + n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) + self._buff_i += 9 + elif b == 0xd8: # fixext 16 + typ = TYPE_EXT + if self._max_ext_len < 16: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) + self._reserve(17) + n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) + self._buff_i += 17 + elif b == 0xd9: + typ = TYPE_RAW + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xda: + typ = TYPE_RAW + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdb: + typ = TYPE_RAW + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdc: + typ = TYPE_ARRAY + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xdd: + typ = TYPE_ARRAY + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xde: + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + elif b == 0xdf: + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + else: + raise UnpackValueError("Unknown header: 0x%x" % b) + return typ, n, obj + + def _unpack(self, execute=EX_CONSTRUCT): + typ, n, obj = self._read_header(execute) + + if execute == EX_READ_ARRAY_HEADER: + if typ != TYPE_ARRAY: + raise UnpackValueError("Expected array") + return n + if execute == EX_READ_MAP_HEADER: + if typ != TYPE_MAP: + raise UnpackValueError("Expected map") + return n + # TODO should we eliminate the recursion? + if typ == TYPE_ARRAY: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call `list_hook` + self._unpack(EX_SKIP) + return + ret = newlist_hint(n) + for i in xrange(n): + ret.append(self._unpack(EX_CONSTRUCT)) + if self._list_hook is not None: + ret = self._list_hook(ret) + # TODO is the interaction between `list_hook` and `use_list` ok? + return ret if self._use_list else tuple(ret) + if typ == TYPE_MAP: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call hooks + self._unpack(EX_SKIP) + self._unpack(EX_SKIP) + return + if self._object_pairs_hook is not None: + ret = self._object_pairs_hook( + (self._unpack(EX_CONSTRUCT), + self._unpack(EX_CONSTRUCT)) + for _ in xrange(n)) + else: + ret = {} + for _ in xrange(n): + key = self._unpack(EX_CONSTRUCT) + ret[key] = self._unpack(EX_CONSTRUCT) + if self._object_hook is not None: + ret = self._object_hook(ret) + return ret + if execute == EX_SKIP: + return + if typ == TYPE_RAW: + if self._encoding is not None: + obj = obj.decode(self._encoding, self._unicode_errors) + elif self._raw: + obj = bytes(obj) + else: + obj = obj.decode('utf_8') + return obj + if typ == TYPE_EXT: + return self._ext_hook(n, bytes(obj)) + if typ == TYPE_BIN: + return bytes(obj) + assert typ == TYPE_IMMEDIATE + return obj + + def __iter__(self): + return self + + def __next__(self): + try: + ret = self._unpack(EX_CONSTRUCT) + self._consume() + return ret + except OutOfData: + self._consume() + raise StopIteration + + next = __next__ + + def skip(self, write_bytes=None): + self._unpack(EX_SKIP) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + + def unpack(self, write_bytes=None): + ret = self._unpack(EX_CONSTRUCT) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_array_header(self, write_bytes=None): + ret = self._unpack(EX_READ_ARRAY_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_map_header(self, write_bytes=None): + ret = self._unpack(EX_READ_MAP_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def tell(self): + return self._stream_offset + + +class Packer(object): + """ + MessagePack Packer + + usage: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param callable default: + Convert user type to builtin type that Packer supports. + See also simplejson's document. + + :param bool use_single_float: + Use single precision float type for float. (default: False) + + :param bool autoreset: + Reset buffer after each pack and return its content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enables str8 type for unicode. + + :param bool strict_types: + If set to true, types will be checked to be exact. Derived classes + from serializeable types will not be serialized and will be + treated as unsupported type and forwarded to default. + Additionally tuples will not be serialized as lists. + This is useful when trying to implement accurate serialization + for python types. + + :param str encoding: + (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') + + :param str unicode_errors: + Error handler for encoding unicode. (default: 'strict') + """ + def __init__(self, default=None, encoding=None, unicode_errors=None, + use_single_float=False, autoreset=True, use_bin_type=False, + strict_types=False): + if encoding is None: + encoding = 'utf_8' + else: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + self._strict_types = strict_types + self._use_float = use_single_float + self._autoreset = autoreset + self._use_bin_type = use_bin_type + self._encoding = encoding + self._unicode_errors = unicode_errors + self._buffer = StringIO() + if default is not None: + if not callable(default): + raise TypeError("default must be callable") + self._default = default + + def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, + check=isinstance, check_type_strict=_check_type_strict): + default_used = False + if self._strict_types: + check = check_type_strict + list_types = list + else: + list_types = (list, tuple) + while True: + if nest_limit < 0: + raise PackValueError("recursion limit exceeded") + if obj is None: + return self._buffer.write(b"\xc0") + if check(obj, bool): + if obj: + return self._buffer.write(b"\xc3") + return self._buffer.write(b"\xc2") + if check(obj, int_types): + if 0 <= obj < 0x80: + return self._buffer.write(struct.pack("B", obj)) + if -0x20 <= obj < 0: + return self._buffer.write(struct.pack("b", obj)) + if 0x80 <= obj <= 0xff: + return self._buffer.write(struct.pack("BB", 0xcc, obj)) + if -0x80 <= obj < 0: + return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) + if 0xff < obj <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xcd, obj)) + if -0x8000 <= obj < -0x80: + return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) + if 0xffff < obj <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xce, obj)) + if -0x80000000 <= obj < -0x8000: + return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) + if 0xffffffff < obj <= 0xffffffffffffffff: + return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) + if -0x8000000000000000 <= obj < -0x80000000: + return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = True + continue + raise PackOverflowError("Integer value out of range") + if check(obj, (bytes, bytearray)): + n = len(obj) + if n >= 2**32: + raise PackValueError("%s is too large" % type(obj).__name__) + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, Unicode): + if self._encoding is None: + raise TypeError( + "Can't encode unicode string: " + "no encoding is specified") + obj = obj.encode(self._encoding, self._unicode_errors) + n = len(obj) + if n >= 2**32: + raise PackValueError("String is too large") + self._pack_raw_header(n) + return self._buffer.write(obj) + if check(obj, memoryview): + n = len(obj) * obj.itemsize + if n >= 2**32: + raise PackValueError("Memoryview is too large") + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, float): + if self._use_float: + return self._buffer.write(struct.pack(">Bf", 0xca, obj)) + return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) + if check(obj, ExtType): + code = obj.code + data = obj.data + assert isinstance(code, int) + assert isinstance(data, bytes) + L = len(data) + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(struct.pack(">BB", 0xc7, L)) + elif L <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xc8, L)) + else: + self._buffer.write(struct.pack(">BI", 0xc9, L)) + self._buffer.write(struct.pack("b", code)) + self._buffer.write(data) + return + if check(obj, list_types): + n = len(obj) + self._pack_array_header(n) + for i in xrange(n): + self._pack(obj[i], nest_limit - 1) + return + if check(obj, dict): + return self._pack_map_pairs(len(obj), dict_iteritems(obj), + nest_limit - 1) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = 1 + continue + raise TypeError("Cannot serialize %r" % (obj, )) + + def pack(self, obj): + try: + self._pack(obj) + except: + self._buffer = StringIO() # force reset + raise + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_pairs(self, pairs): + self._pack_map_pairs(len(pairs), pairs) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_array_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_array_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_map_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_ext_type(self, typecode, data): + if not isinstance(typecode, int): + raise TypeError("typecode must have int type.") + if not 0 <= typecode <= 127: + raise ValueError("typecode should be 0-127") + if not isinstance(data, bytes): + raise TypeError("data must have bytes type") + L = len(data) + if L > 0xffffffff: + raise PackValueError("Too large data") + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(b'\xc7' + struct.pack('B', L)) + elif L <= 0xffff: + self._buffer.write(b'\xc8' + struct.pack('>H', L)) + else: + self._buffer.write(b'\xc9' + struct.pack('>I', L)) + self._buffer.write(struct.pack('B', typecode)) + self._buffer.write(data) + + def _pack_array_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x90 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xdc, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdd, n)) + raise PackValueError("Array is too large") + + def _pack_map_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x80 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xde, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdf, n)) + raise PackValueError("Dict is too large") + + def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): + self._pack_map_header(n) + for (k, v) in pairs: + self._pack(k, nest_limit - 1) + self._pack(v, nest_limit - 1) + + def _pack_raw_header(self, n): + if n <= 0x1f: + self._buffer.write(struct.pack('B', 0xa0 + n)) + elif self._use_bin_type and n <= 0xff: + self._buffer.write(struct.pack('>BB', 0xd9, n)) + elif n <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xda, n)) + elif n <= 0xffffffff: + self._buffer.write(struct.pack(">BI", 0xdb, n)) + else: + raise PackValueError('Raw is too large') + + def _pack_bin_header(self, n): + if not self._use_bin_type: + return self._pack_raw_header(n) + elif n <= 0xff: + return self._buffer.write(struct.pack('>BB', 0xc4, n)) + elif n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xc5, n)) + elif n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xc6, n)) + else: + raise PackValueError('Bin is too large') + + def bytes(self): + return self._buffer.getvalue() + + def reset(self): + self._buffer = StringIO() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000..7481c9e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py @@ -0,0 +1,27 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "19.0" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..a0cf67d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py @@ -0,0 +1,26 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, + __copyright__, + __email__, + __license__, + __summary__, + __title__, + __uri__, + __version__, +) + +__all__ = [ + "__title__", + "__summary__", + "__uri__", + "__version__", + "__author__", + "__email__", + "__license__", + "__copyright__", +] diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ba6039dbc07734b2601f79186c8c3d30f6d76e8 GIT binary patch literal 740 zcmYk4OK%e~5P)~Hc|Y3nP!F6;B@U5jHZ84a5JIKx5ur*!99BY>v*X>k?Aj|o7LtF& zf8dwo$_4%cC&r1Y;*meiSmPPbjITzcet_#Id-mmbBM5$Z<9>Bfxx{U55fDIF1Z9|n zWg}^nQ4)m#G$4W|w4e<g=t3{=CQaxkEf^$i7$zMUC0*D{da$4L;UF2nBi=g<k|8{v z2jeGyFlsQ4Hv4R0RN*YAqO6p*n=Xi27@_25uhK$VnmL(TZ}%v*!WNv;&45zl%9807 z8XZcV7Q54$YkwDwKBdgrrP8S5O<pol?0gE5a%p^+5v8fBR$Ams>)k4rer36k`TFQu zX-=FKg|LDfk||AYR~Sx`of9|f=SyoV^CpgSVV7<(NmUtFtBS=BVVWni$#gxwQIZuv z=GJAIB}@Vl(w7O26(m*CYO!!uX|q0nt?Q-Px=w^zA6?CF2xfneQJ0*2*ggIw`Mj%? zoMM8*>-#Fm>Gb667%?L+%*XM_w;^-ZX)IUchyxvYG!edUtiYb=mOpBHbUggzb<e~9 z4n6P~B7Ow=!0R4=ZH&{YndNcKbeyRI@I7&<<Ha4N7v@~PuHh`DRed_O*+qV*i<9hp zHj6*Sm8gz|G!}Cof3M`XSLxl_A8t3Txdf#jS{UOa7s}yyCe>=weOoGU1%KxYFa+^5 QYJ~qwJ8Fg~4HVDt9{~;8?EnA( literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ee9b16f928d4b97608d1a3347cad1aaa15da86d GIT binary patch literal 578 zcmYk2&u-K(5XPNkck{mp#EB<h4<%5jXeERY55R?<ETNG%PEs$n6FE*``$l~So+MXJ zeFaX;><Uy{{>fv_eDiremu1Fq{Sq&}U4)GNrr_U7@bU@Ic!Q8k2AY|G2PWj9iFgz+ z8Olhn%$l#whHp&FW0Ua2q&zhl&rHs9Q}6=wR&p&jGM0%<WhV13;iW9TvTgZ*%4{1g zPsDEQ_2e5+X6T(?5~*f2s@^VVgHzT+JK5S}{18w@vSa{a^0&PMSW1Ap9}Z4+w;sb3 zpfN&eyygH})r}pSQ!q}(2zNLodF3^|#{iR4r-Zq2)D^(x*vHXuTtO%a8v>2RrGyyq zWqU?m+R0B2#T*WixrnerkQcG*C$x1crjkbrNBv``|4qn_&}jaixu=v(_%l{GhFSQg znuV*{UQ0Au8CUK009WIseLu^0H4O8`Yu{dVd#B&Dm)F<TO*N?DT-nj1=K0UT{&-vO w@96P(U~a7JT{VdMyXchdDgb2_+I=+~mgIx!<)oXB^p)`$;(7S82!qG_FCgZb>i_@% literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f951518a28504303506e754f94e1a11cef8f397 GIT binary patch literal 1018 zcmah{&2AGh5VqHwWE;}-KvjvtAzYAhXct;4TB)iKAaSdZKuD~FEO+g+o9-XBlai>M zTB&^uIPwlWiLadc3Y?g6+EB!Sk!E&gy#8k98^2gwY!i?lV)dh7g#5(dMgnl2gPQkX zB#|^H1x;uXBtgLvMll!UVG^ov*pTENk?c4~n)4`xsHIx^m5K&5Sty&TjbGW2&2y66 zk-=NiZ(RX4=`*(^4osDgtm0WwSK7KrX5-9cRq495&PvM%qcXJ+?_XhKSI{j<Dc%Ob zpb6RnHIKl&CKu#_4gyJKa30CvlAf_IfhAw*X&{*lGx9Bj@{MWS?t#42N?6qsy#rxX zFU^H9y_3uyL8eev_{6&ZGX?OuU|AHi3PzEHN|FS(3nxr6C=*T}A{zgLwVPL|$j#pR zJe7tXiV*yw-UT%sFqia{UXoLGhER0>JK#B%=EjAkD3oj4qs(w@+&C)xfoshC5TP|P z@=M1+;TR^2$3n-0Dwj%|xX|&zkn?S`RX!Wbrzx+;8;|W^`*5i9Cxfk>o%mf`XZ2cE z8Y}XA?Q>n8Y^K90CcW~pDrE)WB0Uy|S$P=qv?^+0*XxOEabBtu&L7|yxG_Sf{r|GC zetl~nW{kjx0XcVV&WlQpa`Zc#e;SE=cA}R6*U#7wG;*aEZxXr-o?DpndmlpIM?^JJ z>z1s-mnQUt`~6<SxX?~&<$?Qb2IqnC&cBs>k?!APEn_9W&DKh&S0L(laD>6gjx>y* zkqwP+N8?|PnTc_oF{}h$H_ysJ<=C4K8)!D+&}!EK1N3t2%(%ASug`dN-_<SSdx~~v VjO}3wgQ?{pVqMw|LmCB5_8Uit19JcX literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bf8d64da05cb25fde4021427eae2024b28c6351 GIT binary patch literal 2870 zcmcImTW`}a6t<H#O}lRGE?lKayg`MwaM`qh08M~Ey!3@VRYF!4yIo3}2FERI+FN<x zukauEC3)qEzrYjccnh>sLds>X?34J|{?5hcYo0DH)(EsO?)5jH%7lEym$a4OVGnxz z90pD}4ak6Y=)mY01G8gN@{(|an;!``MQLJo%A!0Woifapco}BPde#ya%v#)fO<I+2 za1v>mNy9yehrvh*<`1HwREf>~u^;=xFj<PEA1c-zg`R?U4|k-^fQLQk@jeWKbSNhs zgHvvNBps8RyaW=kxdpP!E8GTY@hY!@tndY12Wj&~z67$$8@vg!#+UgD$OXO%7Oo}s ztFY^bzB=+KfM7$3{TcKagTg7SG};mZMn01kO-iu{y3&GIJ$xTK;KbNf!Wp~L=?()f zWb6#2bI@mOH{K3+#(c|T(fHmS)!ps&WpKB<{osMK??isI;fJwugJ9!B6u!Uj^^b8< zcQzIwA4(^3y|-@94|@)al^l6$Bt^U#9VIqnQbdw58%@P%5qi9wI<%Q;XFM}uk@l<( z4~i&yLMC*A9@2KpNJ@upe3+E**cO!)So6zIi7*I?YZzOAw=B?8t*6a_B`CAP`9dGu zGBik19;!nj&tqAP1&XnyDWt}fd#L*}9JvTbWuXYhmh(_RH-mC6geMTfKAjk82y1Y$ zF{Pm=k}7Ns+&E_J%+Wjp#5=~;atuISwgDIzMN$Lm<je%wL@&{w0@M&(yOM*7x*620 zB<@cqG0(Rir0IGN3hMq73fQ}zhl0MK{n${>_@d6@Mw4b+^jzhSMS96{YM{bcD0+<D zfTPk9Xr_Ch?zFPqs$;Q)?f}q}8e@YY9|ibaXYAd`4Nf((3WrFnMv3W^4IEZ*Sj7P^ zg}j6VCTi;HYWl&7)Vze18sjdT+UD#}>pf8YY*><e&@Yfz<z+ZOKjdeWdR*N|qjq|c zGATz#=oZ?mIfWiyJD;Y%p*o5Ggc3<CJIOjFw+m3`<hsH#(W&2@0=tso;#_oB422i$ zZV?m~jE*)eMEQHpn~QMtrQRw4z8J34rL<E3Js084{A*<qo-Wvj1yFObUNIEX!s8;S z`KV8mL{1?f@$5~(T+O(fDdWkjuuxvZ0V)6A$qjkrCiFaVLw&ndL4NIy@XH9kdho(Z nys;8L-x6zh&=;Q4E^1!NV$sBYbjr_9a8HcHx@I=lE$BZ0cnbj@ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3a1d68b03faadb4f19584c25a29a28129a5dcad GIT binary patch literal 8873 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec3f28508f0a081f941be248a6c01b8448feb5db GIT binary patch literal 3991 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03fa20f82484db8d8dff4ab62b449ae3118e9727 GIT binary patch literal 19768 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 UnvofQwot_P*NpKZ_j*nIH^SfHS^xk5 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6d983f44d40f15fe90e7c541901651094127e29 GIT binary patch literal 1456 zcmbVMPj4GV6rY)0@7f#NEp0#oaaa(dSRv~asM<<VgbEip<kG4|F41bUGq%^+f1MdS ziR)Y_XFh{{gwMd44>3nLRpP)oC*GSlp+TG&?Rzux-kUeS_h<G|rxOquzb5Y;{M8`j z58PZ12Nqufsc(UC!f8$lI-ms`u)-NQ6lE-T2QGKGn>Pw?;1&MBr$o5RCU30hpv67z z|40S_Z}Jw*8=O5Rz2G(YBR$95NDft%Pqm1%qOPPiO`gp%l~twb)-o$~Je-!PhW-9) zibt5~epAkpJmXJ=w08b_G54Nt$I-!7igq|~c7eVEQa6EVvZS0Y$cio5iU16@e@?dn z#qBsv%Bsv#@H-c=6eDqB95p>Ojl4P*vPX?uCWZK!$PV~9uls;)mT1wRC9*%Pat>Jf zh3p?r;`o8OSKgoTFVeW4eYT^A4@MK2-yPn2_^|(^UuX4pRw|w3`SwX&9)F%r<|woj z&qT>9*{_rIC>dqts6W+NuA=(XymbvAV(DU33>abZ2Jow}QHB+@VgCt>)3zoH@`|33 zXQbS8iKa(^3@PM?g8VW0j*Q3|q-DZ5J#yru1zkFvEnSqX=!$|BNOWWAVU>Af>0i_o z^v$oqFW5NNicDI(dDN0WSr0DQwXpVJ*IL`5FEW8%0IOfDRbcN4*7uOfhSmLMbsJW< zaiwcp-S1Y{wz~F(j>BCGzyT%g%zp?%7*EET3gMdxc^ay$$nr#nx(e6L62-C7GLAnD z52rdDCn~H;5kkdvE<&CSheC=n70UWL&h$9cV-X%Fr(uTXCC`PjA}Ml_C^#xcg(!7o z4@hjix%+bG?1Q=g$@kGtZ|fsN42`Z82_Kh2dI#8o9CXhp6pFs0PoXd`7{?B!`_Ow1 zK!wI<(T<@fwgWF1w!nF7cO*)2Qp>$N=nJdwlKGu${Q^nArxNYv6|}h8i>}V>|1U)H z7TnTf@-|Fz6B#~>e?ZB%VY>x%38xv=mC}%pxgT*c!-cyAyw{OFp7em3hN!D_Y`mnd z;T;%nSji&MhDjl@pN%`IveNkLj2owx!no+yIN%eXDg+04^4H;-Mx98l{)NqK{#R-+ z67?Z4;xXE$UFI>@3Fs~NW8m-O>XMj5vtHW-G5nkKREjv3n01Nul=#Du?;;D4VPG~y s<EK?oXSt9q6yb}tj^03LbBHxH&E2Bn(_HMKH-*7(vL?If1WvQ@H%9AfxBvhE literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a10af73a0c1ac58f6c4c3dfa4767c4739ec27053 GIT binary patch literal 11960 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 Meqp_rH?02u2aalAY5)KL literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py new file mode 100644 index 0000000..25da473 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py @@ -0,0 +1,31 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = (str,) +else: + string_types = (basestring,) + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + return type.__new__(metaclass, "temporary_class", (), {}) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..68dcca6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + + +Infinity = Infinity() + + +class NegativeInfinity(object): + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + + +NegativeInfinity = NegativeInfinity() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..5482476 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py @@ -0,0 +1,296 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pip._vendor.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", + "UndefinedComparison", + "UndefinedEnvironmentName", + "Marker", + "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + def serialize(self): + return str(self) + + +class Value(Node): + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") + | L("platform_python_implementation") + | L("implementation_name") + | L("python_full_version") + | L("platform_release") + | L("platform_version") + | L("platform_machine") + | L("platform_system") + | L("python_version") + | L("sys_platform") + | L("os_name") + | L("os.name") + | L("sys.platform") # PEP-345 + | L("platform.version") # PEP-345 + | L("platform.machine") # PEP-345 + | L("platform.python_implementation") # PEP-345 + | L("python_implementation") # PEP-345 + | L("extra") # undocumented setuptools legacy +) +ALIASES = { + "os.name": "os_name", + "sys.platform": "sys_platform", + "platform.version": "platform_version", + "platform.machine": "platform_machine", + "platform.python_implementation": "platform_python_implementation", + "python_implementation": "platform_python_implementation", +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if ( + isinstance(marker, list) + and len(marker) == 1 + and isinstance(marker[0], (list, tuple)) + ): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = "{0.major}.{0.minor}.{0.micro}".format(info) + kind = info.releaselevel + if kind != "final": + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, "implementation"): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = "0" + implementation_name = "" + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc : e.loc + 8] + ) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..dbc5f11 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py @@ -0,0 +1,138 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pip._vendor.pyparsing import Literal as L # noqa +from pip._vendor.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r"[^ ]+")("url") +URL = AT + URI + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine( + VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False +)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "") + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start : t._original_end]) +) +MARKER_SEPARATOR = SEMICOLON +MARKER = MARKER_SEPARATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd +# pyparsing isn't thread safe during initialization, so we do it eagerly, see +# issue #104 +REQUIREMENT.parseString("x[]") + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + 'Parse error at "{0!r}": {1}'.format( + requirement_string[e.loc : e.loc + 8], e.msg + ) + ) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if parsed_url.scheme == "file": + if urlparse.urlunparse(parsed_url) != req.url: + raise InvalidRequirement("Invalid URL given") + elif not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc + ): + raise InvalidRequirement("Invalid URL: {0}".format(req.url)) + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + if self.marker: + parts.append(" ") + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..743576a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,749 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = (match.group("operator").strip(), match.group("version").strip()) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format(self.__class__.__name__, str(self), pre) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if parsed_version.is_prerelease and not ( + prereleases or self.prereleases + ): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + + _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return self._get_operator(">=")(prospective, spec) and self._get_operator("==")( + prospective, prefix + ) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[: len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is technically greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]) :]) + right_split.append(right[len(right_split[0]) :]) + + # Insert our padding + left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0]))) + right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0]))) + + return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split))) + + +class SpecifierSet(BaseSpecifier): + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all(s.contains(item, prereleases=prereleases) for s in self._specs) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..8841878 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py @@ -0,0 +1,57 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + +from .version import InvalidVersion, Version + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() + + +def canonicalize_version(version): + """ + This is very similar to Version.__str__, but has one subtle differences + with the way it handles the release segment. + """ + + try: + version = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + + parts = [] + + # Epoch + if version.epoch != 0: + parts.append("{0}!".format(version.epoch)) + + # Release segment + # NB: This strips trailing '.0's to normalize + parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in version.release))) + + # Pre-release + if version.pre is not None: + parts.append("".join(str(x) for x in version.pre)) + + # Post-release + if version.post is not None: + parts.append(".post{0}".format(version.post)) + + # Development release + if version.dev is not None: + parts.append(".dev{0}".format(version.dev)) + + # Local version segment + if version.local is not None: + parts.append("+{0}".format(version.local)) + + return "".join(parts) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..95157a1 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py @@ -0,0 +1,420 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"] + + +_Version = collections.namedtuple( + "_Version", ["epoch", "release", "dev", "pre", "post", "local"] +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def epoch(self): + return -1 + + @property + def release(self): + return None + + @property + def pre(self): + return None + + @property + def post(self): + return None + + @property + def dev(self): + return None + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + @property + def is_devrelease(self): + return False + + +_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) + +_legacy_version_replacement_map = { + "pre": "c", + "preview": "c", + "-": "final-", + "rc": "c", + "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version(match.group("pre_l"), match.group("pre_n")), + post=_parse_letter_version( + match.group("post_l"), match.group("post_n1") or match.group("post_n2") + ), + dev=_parse_letter_version(match.group("dev_l"), match.group("dev_n")), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + # Pre-release + if self.pre is not None: + parts.append("".join(str(x) for x in self.pre)) + + # Post-release + if self.post is not None: + parts.append(".post{0}".format(self.post)) + + # Development release + if self.dev is not None: + parts.append(".dev{0}".format(self.dev)) + + # Local version segment + if self.local is not None: + parts.append("+{0}".format(self.local)) + + return "".join(parts) + + @property + def epoch(self): + return self._version.epoch + + @property + def release(self): + return self._version.release + + @property + def pre(self): + return self._version.pre + + @property + def post(self): + return self._version.post[1] if self._version.post else None + + @property + def dev(self): + return self._version.dev[1] if self._version.dev else None + + @property + def local(self): + if self._version.local: + return ".".join(str(x) for x in self._version.local) + else: + return None + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + return "".join(parts) + + @property + def is_prerelease(self): + return self.dev is not None or self.pre is not None + + @property + def is_postrelease(self): + return self.post is not None + + @property + def is_devrelease(self): + return self.dev is not None + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_separators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_separators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list(itertools.dropwhile(lambda x: x == 0, reversed(release)))) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple((i, "") if isinstance(i, int) else (-Infinity, i) for i in local) + + return epoch, release, pre, post, dev, local diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py new file mode 100644 index 0000000..9c1a098 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__init__.py @@ -0,0 +1,4 @@ +"""Wrappers to build Python packages using PEP 517 hooks +""" + +__version__ = '0.5.0' diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a61cfe3060e49db059b006f65c24a7af9b82de28 GIT binary patch literal 291 zcmXv}%}T>S5KdA>srCgt?X`zyTQ#-?5fQvfz=BYaVVh0TO}D$l?k3v2k?-J><my{^ za#Qew@0%Zn`DUI*qha9j&92^8KK}H@KSG~8dfH1bJXi-jT!%b*4aS4^?#(d7+*sl? z+0;UEk{;YvD}pTBu`;)$wnCL8eNIU-o0F~9J3DMor*RTbU&c{)2EcU&&|LsDev!}$ z;43f#Z+4Vlq-aFLTuvKiXrU$dV{~umrUF>lM9mw1n*lc0Q&%j?%E(!fESGdeQQ$-< v>zI_2PgEZ_S=IK<BfXpA+EC2VA4UO$5)L57LwA0^*SwbbL)5?B%SrSHcTZGn literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/_in_process.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7186693441af730bf69d40ced99b69808d6ef5bb GIT binary patch literal 5634 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 E1D+J7(f|Me literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..873eef420f35c5eab708c132c9081afaa349cee8 GIT binary patch literal 2769 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e4b62c0dddda63314eb8ce62ec6d4678717c209 GIT binary patch literal 4817 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 DW$6q_ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4c47c354eda8633d92166707e0ce61d24a3d360 GIT binary patch literal 2923 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0a61a81f135d4fd86b70e9c4c1c07a830544ac1 GIT binary patch literal 1027 zcmaKqOK;Oa5XX1dPU?iTY7Zd60r|ki5~=A+O{EGUkWd9uc(e!<30aQUZtXg|*4j;I zl%C)UJ#vL3-+@oES5Ey3oS50PB|<GL&5UQCfB$A4&(AjrjGy71_ajEgFH9~5<m3@p zxdV=q9^sU;oc5@RtjA)OS)AS`+&ZkOb#C+8C(^TdozFq6iAC<5&orhpob3{?Io{q0 z1<zww#UW3{z6+T<QfY<X&vsvQ-Bh@5_MWyo_gyL6m&ersgf+8mb@>dmknWiUK0<*w zY_JB{bFgw5Tty~EB)2|Wr?*b5ie_v=CRV~G><gvjE&R?a@|wJZ2$JlsrlWD~s7l%$ zk7_3tkwj&lrEOWnLfcs>!Ska*;n~`f{Y=|MSRLs4;V4x5rKZUbqFV6sZ{Zgz9fnox z4@2cAGUu@>{eklPSrBx}4Y4`o>rqe)S07YKXFpT<O0u!F<?s1LTC`J9R$-pEKNMoL z7G-0cG!_hF!KLzxxY$_P^dmWd_m_)f-9&P6fCA_6_mKsmi&QN@j3{O>kQ5Sn0#@Dw z2ZT&H4WZTvt>`y4q2KB5zg*NM7ll`Qma0Keb#U6wWyn3I@Md)b9U_>zdEC&z5*ux} z`d8Z$WLH;j6;`Iz`^Zl3&Q^{yZl!d>zFt#7HtHLN7kX!eDkS6C%7HKyi%ox(VnYqp zooj8;s}Z`eWr`4FUWbo$HB<drVrmi2{Rf!Br*DE?KJV4_To7;>1;LcLRUVhRHH4;0 qr3g}yNTb=DoWXAjVQS!P4<tXz<A>M_C3b~P9qO<J=Ge`;WB&o0`_rQU literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0947eba4bbbd8680247a89748d072d4045f43866 GIT binary patch literal 4211 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 Q7O6{4%W|Fd&%Dk50m<`oOaK4? literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e25dd69df1415fce229f0fa58c269464b3b138a GIT binary patch literal 5492 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py new file mode 100644 index 0000000..d6524b6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/_in_process.py @@ -0,0 +1,207 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +from glob import glob +from importlib import import_module +import os +from os.path import join as pjoin +import re +import shutil +import sys + +# This is run as a script, not a module, so it can't do a relative import +import compat + + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + + +def _build_backend(): + """Find and load the build backend""" + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + return _get_wheel_metadata_from_wheel(backend, metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + + +def _get_wheel_metadata_from_wheel( + backend, metadata_directory, config_settings): + """Build a wheel and extract the metadata from it. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. + """ + from zipfile import ZipFile + whl_basename = backend.build_wheel(metadata_directory, config_settings) + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation + + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_sdist', + 'build_sdist', +} + + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = compat.read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable: + json_out['no_backend'] = True + except GotUnsupportedOperation: + json_out['unsupported'] = True + + compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + + +if __name__ == '__main__': + main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py new file mode 100644 index 0000000..ac6c949 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/build.py @@ -0,0 +1,108 @@ +"""Build a project using PEP 517 hooks. +""" +import argparse +import logging +import os +import contextlib +from pip._vendor import pytoml +import shutil +import errno +import tempfile + +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +def _do_build(hooks, env, dist, dest): + get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) + get_requires = getattr(hooks, get_requires_name) + reqs = get_requires({}) + log.info('Got build requires: %s', reqs) + + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + + with tempdir() as td: + log.info('Trying to build %s in %s', dist, td) + build_name = 'build_{dist}'.format(**locals()) + build = getattr(hooks, build_name) + filename = build(td, {}) + source = os.path.join(td, filename) + shutil.move(source, os.path.join(dest, os.path.basename(filename))) + + +def mkdir_p(*args, **kwargs): + """Like `mkdir`, but does not raise an exception if the + directory already exists. + """ + try: + return os.mkdir(*args, **kwargs) + except OSError as exc: + if exc.errno != errno.EEXIST: + raise + + +def build(source_dir, dist, dest=None): + pyproject = os.path.join(source_dir, 'pyproject.toml') + dest = os.path.join(source_dir, dest or 'dist') + mkdir_p(dest) + + with open(pyproject) as f: + pyproject_data = pytoml.load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + _do_build(hooks, env, dist, dest) + + +parser = argparse.ArgumentParser() +parser.add_argument( + 'source_dir', + help="A directory containing pyproject.toml", +) +parser.add_argument( + '--binary', '-b', + action='store_true', + default=False, +) +parser.add_argument( + '--source', '-s', + action='store_true', + default=False, +) +parser.add_argument( + '--out-dir', '-o', + help="Destination in which to save the builds relative to source dir", +) + + +def main(args): + # determine which dists to build + dists = list(filter(None, ( + 'sdist' if args.source or not args.binary else None, + 'wheel' if args.binary or not args.source else None, + ))) + + for dist in dists: + build(args.source_dir, dist, args.out_dir) + + +if __name__ == '__main__': + main(parser.parse_args()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py new file mode 100644 index 0000000..f4cdc6b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/check.py @@ -0,0 +1,202 @@ +"""Check a project and backend by attempting to build using PEP 517 hooks. +""" +import argparse +import logging +import os +from os.path import isfile, join as pjoin +from pip._vendor.pytoml import TomlError, load as toml_load +import shutil +from subprocess import CalledProcessError +import sys +import tarfile +from tempfile import mkdtemp +import zipfile + +from .colorlog import enable_colourful_output +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def check_build_sdist(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_sdist({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build sdist in %s', td) + try: + try: + filename = hooks.build_sdist(td, {}) + log.info('build_sdist returned %r', filename) + except Exception: + log.info('Failure in build_sdist', exc_info=True) + return False + + if not filename.endswith('.tar.gz'): + log.error( + "Filename %s doesn't have .tar.gz extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if tarfile.is_tarfile(path): + log.info("Output file is a tar file") + else: + log.error("Output file is not a tar file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check_build_wheel(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_wheel({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build wheel in %s', td) + try: + try: + filename = hooks.build_wheel(td, {}) + log.info('build_wheel returned %r', filename) + except Exception: + log.info('Failure in build_wheel', exc_info=True) + return False + + if not filename.endswith('.whl'): + log.error("Filename %s doesn't have .whl extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if zipfile.is_zipfile(path): + log.info("Output file is a zip file") + else: + log.error("Output file is not a zip file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check(source_dir): + pyproject = pjoin(source_dir, 'pyproject.toml') + if isfile(pyproject): + log.info('Found pyproject.toml') + else: + log.error('Missing pyproject.toml') + return False + + try: + with open(pyproject) as f: + pyproject_data = toml_load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + log.info('Loaded pyproject.toml') + except (TomlError, KeyError): + log.error("Invalid pyproject.toml", exc_info=True) + return False + + hooks = Pep517HookCaller(source_dir, backend) + + sdist_ok = check_build_sdist(hooks, requires) + wheel_ok = check_build_wheel(hooks, requires) + + if not sdist_ok: + log.warning('Sdist checks failed; scroll up to see') + if not wheel_ok: + log.warning('Wheel checks failed') + + return sdist_ok + + +def main(argv=None): + ap = argparse.ArgumentParser() + ap.add_argument( + 'source_dir', + help="A directory containing pyproject.toml") + args = ap.parse_args(argv) + + enable_colourful_output() + + ok = check(args.source_dir) + + if ok: + print(ansi('Checks passed', 'green')) + else: + print(ansi('Checks failed', 'red')) + sys.exit(1) + + +ansi_codes = { + 'reset': '\x1b[0m', + 'bold': '\x1b[1m', + 'red': '\x1b[31m', + 'green': '\x1b[32m', +} + + +def ansi(s, attr): + if os.name != 'nt' and sys.stdout.isatty(): + return ansi_codes[attr] + str(s) + ansi_codes['reset'] + else: + return str(s) + + +if __name__ == '__main__': + main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py new file mode 100644 index 0000000..69c8a59 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/colorlog.py @@ -0,0 +1,115 @@ +"""Nicer log formatting with colours. + +Code copied from Tornado, Apache licensed. +""" +# Copyright 2012 Facebook +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging +import sys + +try: + import curses +except ImportError: + curses = None + + +def _stderr_supports_color(): + color = False + if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): + try: + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + except Exception: + pass + return color + + +class LogFormatter(logging.Formatter): + """Log formatter with colour support + """ + DEFAULT_COLORS = { + logging.INFO: 2, # Green + logging.WARNING: 3, # Yellow + logging.ERROR: 1, # Red + logging.CRITICAL: 1, + } + + def __init__(self, color=True, datefmt=None): + r""" + :arg bool color: Enables color support. + :arg string fmt: Log message format. + It will be applied to the attributes dict of log records. The + text between ``%(color)s`` and ``%(end_color)s`` will be colored + depending on the level if color support is on. + :arg dict colors: color mappings from logging level to terminal color + code + :arg string datefmt: Datetime format. + Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. + .. versionchanged:: 3.2 + Added ``fmt`` and ``datefmt`` arguments. + """ + logging.Formatter.__init__(self, datefmt=datefmt) + self._colors = {} + if color and _stderr_supports_color(): + # The curses module has some str/bytes confusion in + # python3. Until version 3.2.3, most methods return + # bytes, but only accept strings. In addition, we want to + # output these strings with the logging module, which + # works with unicode strings. The explicit calls to + # unicode() below are harmless in python2 but will do the + # right conversion in python 3. + fg_color = (curses.tigetstr("setaf") or + curses.tigetstr("setf") or "") + if (3, 0) < sys.version_info < (3, 2, 3): + fg_color = str(fg_color, "ascii") + + for levelno, code in self.DEFAULT_COLORS.items(): + self._colors[levelno] = str( + curses.tparm(fg_color, code), "ascii") + self._normal = str(curses.tigetstr("sgr0"), "ascii") + + scr = curses.initscr() + self.termwidth = scr.getmaxyx()[1] + curses.endwin() + else: + self._normal = '' + # Default width is usually 80, but too wide is + # worse than too narrow + self.termwidth = 70 + + def formatMessage(self, record): + mlen = len(record.message) + right_text = '{initial}-{name}'.format(initial=record.levelname[0], + name=record.name) + if mlen + len(right_text) < self.termwidth: + space = ' ' * (self.termwidth - (mlen + len(right_text))) + else: + space = ' ' + + if record.levelno in self._colors: + start_color = self._colors[record.levelno] + end_color = self._normal + else: + start_color = end_color = '' + + return record.message + space + start_color + right_text + end_color + + +def enable_colourful_output(level=logging.INFO): + handler = logging.StreamHandler() + handler.setFormatter(LogFormatter()) + logging.root.addHandler(handler) + logging.root.setLevel(level) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py new file mode 100644 index 0000000..01c66fc --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/compat.py @@ -0,0 +1,23 @@ +"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" +import json +import sys + +if sys.version_info[0] >= 3: + # Python 3 + def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + def read_json(path): + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + +else: + # Python 2 + def write_json(obj, path, **kwargs): + with open(path, 'wb') as f: + json.dump(obj, f, encoding='utf-8', **kwargs) + + def read_json(path): + with open(path, 'rb') as f: + return json.load(f) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py new file mode 100644 index 0000000..f7ac5f4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/envbuild.py @@ -0,0 +1,158 @@ +"""Build wheels/sdists by installing build deps to a temporary environment. +""" + +import os +import logging +from pip._vendor import pytoml +import shutil +from subprocess import check_call +import sys +from sysconfig import get_paths +from tempfile import mkdtemp + +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def _load_pyproject(source_dir): + with open(os.path.join(source_dir, 'pyproject.toml')) as f: + pyproject_data = pytoml.load(f) + buildsys = pyproject_data['build-system'] + return buildsys['requires'], buildsys['build-backend'] + + +class BuildEnvironment(object): + """Context manager to install build deps in a simple temporary environment + + Based on code I wrote for pip, which is MIT licensed. + """ + # Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) + # + # Permission is hereby granted, free of charge, to any person obtaining + # a copy of this software and associated documentation files (the + # "Software"), to deal in the Software without restriction, including + # without limitation the rights to use, copy, modify, merge, publish, + # distribute, sublicense, and/or sell copies of the Software, and to + # permit persons to whom the Software is furnished to do so, subject to + # the following conditions: + # + # The above copyright notice and this permission notice shall be + # included in all copies or substantial portions of the Software. + # + # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + path = None + + def __init__(self, cleanup=True): + self._cleanup = cleanup + + def __enter__(self): + self.path = mkdtemp(prefix='pep517-build-env-') + log.info('Temporary build environment: %s', self.path) + + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', None) + + install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' + install_dirs = get_paths(install_scheme, vars={ + 'base': self.path, + 'platbase': self.path, + }) + + scripts = install_dirs['scripts'] + if self.save_path: + os.environ['PATH'] = scripts + os.pathsep + self.save_path + else: + os.environ['PATH'] = scripts + os.pathsep + os.defpath + + if install_dirs['purelib'] == install_dirs['platlib']: + lib_dirs = install_dirs['purelib'] + else: + lib_dirs = install_dirs['purelib'] + os.pathsep + \ + install_dirs['platlib'] + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + return self + + def pip_install(self, reqs): + """Install dependencies into this env by calling pip in a subprocess""" + if not reqs: + return + log.info('Calling pip to install %s', reqs) + check_call([ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', self.path] + list(reqs)) + + def __exit__(self, exc_type, exc_val, exc_tb): + needs_cleanup = ( + self._cleanup and + self.path is not None and + os.path.isdir(self.path) + ) + if needs_cleanup: + shutil.rmtree(self.path) + + if self.save_path is None: + os.environ.pop('PATH', None) + else: + os.environ['PATH'] = self.save_path + + if self.save_pythonpath is None: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = self.save_pythonpath + + +def build_wheel(source_dir, wheel_dir, config_settings=None): + """Build a wheel from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str wheel_dir: Target directory to create wheel in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_wheel(config_settings) + env.pip_install(reqs) + return hooks.build_wheel(wheel_dir, config_settings) + + +def build_sdist(source_dir, sdist_dir, config_settings=None): + """Build an sdist from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str sdist_dir: Target directory to place sdist in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_sdist(config_settings) + env.pip_install(reqs) + return hooks.build_sdist(sdist_dir, config_settings) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py new file mode 100644 index 0000000..b14b899 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pep517/wrappers.py @@ -0,0 +1,163 @@ +from contextlib import contextmanager +import os +from os.path import dirname, abspath, join as pjoin +import shutil +from subprocess import check_call +import sys +from tempfile import mkdtemp + +from . import compat + +_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') + + +@contextmanager +def tempdir(): + td = mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess.""" + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + +class Pep517HookCaller(object): + """A wrapper around a source directory to be built with a PEP 517 backend. + + source_dir : The path to the source directory, containing pyproject.toml. + backend : The build backend spec, as per PEP 517, from pyproject.toml. + """ + def __init__(self, source_dir, build_backend): + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + self._subprocess_runner = default_subprocess_runner + + # TODO: Is this over-engineered? Maybe frontends only need to + # set this when creating the wrapper, not on every call. + @contextmanager + def subprocess_runner(self, runner): + prev = self._subprocess_runner + self._subprocess_runner = runner + yield + self._subprocess_runner = prev + + def get_requires_for_build_wheel(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["wheel >= 0.25", "setuptools"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None): + """Prepare a *.dist-info folder with metadata for this project. + + Returns the name of the newly created folder. + + If the build backend defines a hook with this name, it will be called + in a subprocess. If not, the backend will be asked to build a wheel, + and the dist-info extracted from that. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + }) + + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build a wheel from this project. + + Returns the name of the newly created file. + + In general, this will call the 'build_wheel' hook in the backend. + However, if that was previously called by + 'prepare_metadata_for_build_wheel', and the same metadata_directory is + used, the previously built wheel will be copied to wheel_directory. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["setuptools >= 26"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + Returns the name of the newly created file. + + This calls the 'build_sdist' backend hook in a subprocess. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + def _call_hook(self, hook_name, kwargs): + # On Python 2, pytoml returns Unicode values (which is correct) but the + # environment passed to check_call needs to contain string values. We + # convert here by encoding using ASCII (the backend can only contain + # letters, digits and _, . and : characters, and will be used as a + # Python identifier, so non-ASCII content is wrong on Python 2 in + # any case). + if sys.version_info[0] == 2: + build_backend = self.build_backend.encode('ASCII') + else: + build_backend = self.build_backend + + with tempdir() as td: + compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), + indent=2) + + # Run the hook in a subprocess + self._subprocess_runner( + [sys.executable, _in_proc_script, hook_name, td], + cwd=self.source_dir, + extra_environ={'PEP517_BUILD_BACKEND': build_backend} + ) + + data = compat.read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation + if data.get('no_backend'): + raise BackendUnavailable + return data['return_val'] diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py new file mode 100644 index 0000000..fdd40de --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py @@ -0,0 +1,3286 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import errno +import tempfile +import textwrap +import itertools +import inspect +import ntpath +import posixpath +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +try: + FileExistsError +except NameError: + FileExistsError = OSError + +from pip._vendor import six +from pip._vendor.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pip._vendor import appdirs +from pip._vendor import packaging +__import__('pip._vendor.packaging.version') +__import__('pip._vendor.packaging.specifiers') +__import__('pip._vendor.packaging.requirements') +__import__('pip._vendor.packaging.markers') + + +__metaclass__ = type + + +if (3, 0) < sys.version_info < (3, 4): + raise RuntimeError("Python 3.4 or later is required") + +if six.PY2: + # Those builtin exceptions are only defined in Python 3 + PermissionError = None + NotADirectoryError = None + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None +add_activation_listener = None +resources_stream = None +cleanup_resources = None +resource_dir = None +resource_stream = None +set_extraction_path = None +resource_isdir = None +resource_string = None +iter_entry_points = None +resource_listdir = None +resource_filename = None +resource_exists = None +_distribution_finders = None +_namespace_handlers = None +_namespace_packages = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +def parse_version(v): + try: + return packaging.version.Version(v) + except packaging.version.InvalidVersion: + return packaging.version.LegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Warnings + 'PkgResourcesDeprecationWarning', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + from sysconfig import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % ( + int(version[0]), int(version[1]), + _macosx_arch(machine), + ) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet: + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + return ( + entry + for dist in self + for entry in dist.get_entry_map(group).values() + if name is None or name == entry.name + ) + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False, extras=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception + if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + + `extras` is a list of the extras to be used with these requirements. + This is important because extra requirements may look like `my_req; + extra = "my_extra"`, which would otherwise be interpreted as a purely + optional requirement. Instead, we want to be able to assert that these + requirements are truly required. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req, extras): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, + replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins( + self, plugin_env, full_env=None, installer=None, fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req, extras=None): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (extras or (None,)) + ) + return not req.marker or any(extra_evals) + + +class Environment: + """Searchable snapshot of distributions on a search path""" + + def __init__( + self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.6'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + py_compat = ( + self.python is None + or dist.py_version is None + or dist.py_version == self.python + ) + return py_compat and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match( + self, req, working_set, installer=None, replace_conflicting=False): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + try: + dist = working_set.find(req) + except VersionConflict: + if not replace_conflicting: + raise + dist = None + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) + to the Python egg cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? + You can change the cache directory by setting the PYTHON_EGG_CACHE + environment variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except Exception: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ( + "%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path + ) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def _get_metadata_path(self, name): + return self._fn(self.egg_info, name) + + def has_metadata(self, name): + if not self.egg_info: + return self.egg_info + + path = self._get_metadata_path(name) + return self._has(path) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError( + "Script {script!r} not found in metadata at {self.egg_info!r}" + .format(**locals()), + ) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + self._validate_resource_path(resource_name) + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + @staticmethod + def _validate_resource_path(path): + """ + Validate the resource paths according to the docs. + https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + >>> warned = getfixture('recwarn') + >>> warnings.simplefilter('always') + >>> vrp = NullProvider._validate_resource_path + >>> vrp('foo/bar.txt') + >>> bool(warned) + False + >>> vrp('../foo/bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('/foo/bar.txt') + >>> bool(warned) + True + >>> vrp('foo/../../bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('foo/f../bar.txt') + >>> bool(warned) + False + + Windows path separators are straight-up disallowed. + >>> vrp(r'\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + >>> vrp(r'C:\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + Blank values are allowed + + >>> vrp('') + >>> bool(warned) + False + + Non-string values are not. + + >>> vrp(None) + Traceback (most recent call last): + ... + AttributeError: ... + """ + invalid = ( + os.path.pardir in path.split(posixpath.sep) or + posixpath.isabs(path) or + ntpath.isabs(path) + ) + if not invalid: + return + + msg = "Use of .. or absolute path in a resource path is not allowed." + + # Aggressively disallow Windows absolute paths + if ntpath.isabs(path) and not posixpath.isabs(path): + raise ValueError(msg) + + # for compatibility, warn; in future + # raise ValueError(msg) + warnings.warn( + msg[:-1] + " and will raise exceptions in a future release.", + DeprecationWarning, + stacklevel=4, + ) + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_egg_path(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_names = 'SourceFileLoader', 'SourcelessFileLoader', + for name in loader_names: + loader_cls = getattr(importlib_machinery, name, type(None)) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + module_path = None + + _isdir = _has = lambda self, path: False + + def _get(self, path): + return '' + + def _listdir(self, path): + return [] + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with zipfile.ZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + fspath = fspath.rstrip(os.sep) + if fspath == self.loader.archive: + return '' + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp( + ".$extract", + dir=os.path.dirname(real_path), + ) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def _get_metadata_path(self, name): + return self.path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.7 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir(''): + if _is_egg_path(subitem): + subpath = os.path.join(path_item, subitem) + dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) + for dist in dists: + yield dist + elif subitem.lower().endswith('.dist-info'): + subpath = os.path.join(path_item, subitem) + submeta = EggMetadata(zipimport.zipimporter(subpath)) + submeta.egg_info = subpath + yield Distribution.from_location(path_item, subitem, submeta) + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: + raise + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + + # capture warnings due to #1111 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + loader = importer.find_module(packageName) + + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + new_path = sorted(orig_path, key=position_in_sys_path) + new_path = [_normalize_cached(p) for p in new_path] + + if isinstance(module.__path__, list): + module.__path__[:] = new_path + else: + module.__path__ = new_path + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path = sys.path + parent, _, _ = packageName.rpartition('.') + + if parent: + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent or None, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) + + +def _cygwin_patch(filename): # pragma: nocover + """ + Contrary to POSIX 2008, on Cygwin, getcwd (3) contains + symlink components. Using + os.path.abspath() works around this limitation. A fix in os.getcwd() + would probably better, in Cygwin even more so, except + that this seems to be by design... + """ + return os.path.abspath(filename) if sys.platform == 'cygwin' else filename + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_egg_path(path): + """ + Determine if given path appears to be an egg. + """ + return path.lower().endswith('.egg') + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + _is_egg_path(path) and + os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint: + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = tuple(extras) + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + PkgResourcesDeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + + # Get the requirements for this entry point with all its extras and + # then resolve them. We have to pass `extras` along when resolving so + # that the working set knows what extras we want. Otherwise, for + # dist-info distributions, the working set will assume that the + # requirements for that extra are purely optional and skip over them. + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer, extras=self.extras) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + def is_version_line(line): + return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution: + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__( + self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = self._get_version() + if version is None: + path = self._get_metadata_path_for_display(self.PKG_INFO) + msg = ( + "Missing 'Version:' header and/or {} file at path: {}" + ).format(self.PKG_INFO, path) + raise ValueError(msg, self) + + return version + + @property + def _dep_map(self): + """ + A map of extra to its list of (direct) requirements + for this distribution, including the null extra. + """ + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._filter_extras(self._build_dep_map()) + return self.__dep_map + + @staticmethod + def _filter_extras(dm): + """ + Given a mapping of extras to dependencies, strip off + environment markers and filter out any dependencies + not matching the markers. + """ + for extra in list(filter(None, dm)): + new_extra = extra + reqs = dm.pop(extra) + new_extra, _, marker = extra.partition(':') + fails_marker = marker and ( + invalid_marker(marker) + or not evaluate_marker(marker) + ) + if fails_marker: + reqs = [] + new_extra = safe_extra(new_extra) or None + + dm.setdefault(new_extra, []).extend(reqs) + return dm + + def _build_dep_map(self): + dm = {} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata_path_for_display(self, name): + """ + Return the path to the given metadata file, if available. + """ + try: + # We need to access _get_metadata_path() on the provider object + # directly rather than through this class's __getattr__() + # since _get_metadata_path() is marked private. + path = self._provider._get_metadata_path(name) + + # Handle exceptions e.g. in case the distribution's metadata + # provider doesn't support _get_metadata_path(). + except Exception: + return '[could not detect]' + + return path + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def _get_version(self): + lines = self._get_metadata(self.PKG_INFO) + version = _version_from_file(lines) + + return version + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + def __dir__(self): + return list( + set(super(Distribution, self).__dir__()) + | set( + attr for attr in self._provider.__dir__() + if not attr.startswith('_') + ) + ) + + if not hasattr(object, '__dir__'): + # python 2.7 not supported + del __dir__ + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if + # found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = self._get_version() + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """ + Wrap an actual or potential sys.path entry + w/metadata, .dist-info style. + """ + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, +} + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + try: + line += next(lines) + except StopIteration: + return + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): + return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + py31compat.makedirs(dirname, exist_ok=True) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + try: + mkdir(dirname, 0o755) + except FileExistsError: + pass + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener( + lambda dist: dist.activate(replace=True), + existing=False, + ) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) + +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87d3688b89d25fd46574ac1a445e6f6893f5e6c0 GIT binary patch literal 99587 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 gZ10t``z>x5EqoY6TSO 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 U+V#cK3Lv(!7x-~kSNEp>4HXsZpa1{> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f05c4b4f3ee14b33bbb983aa061e4f6021f2477 GIT binary patch literal 651 zcmYk3&2AGh5XZ;%CfTG(;KZSCu!nZrq!q1%5GqPlBvg=6LAw%Kme?u#5qmY>E=d(Q zARYvcyaP|-E2q2yC+vkH#+v`wW6SgN_+&8XfwdpW_L~s}_~{mR#_Z&Yb^X=~2Tlrz z{zMXyW=$h%BQ4m%i#!6{=N@l;AyG?sS-X7B+k$2t4;bV`o$*c%(xX5i@`aDDL`!-C zvToGnWC}rdW2?Y<Kn&CA@^oft8gmqm@u_uvW@R<3;44|fH$vbw$O8{5n)mR8z(-2p z_Q9Iq-kN5tVwsmS9DTN@ET!H3L@(hAq*V^KA~_FQhAM6RMUo4iqBflu(+Q$N(-MeM znf7FI`D}U-Fyoa;_1^emnd&N5xnW{C`wqBefqt#R64N@VL|7*n&Q-w$>TrSKyDW~6 z^r3uM^MhGj)}y^@esrB-u|GdNJ`OL!GA(yfsjH+Yc9y05FrH<%F4=fo3&|CRWquu_ z(CP+fLWkvQygyS5i?ds<Oh3M3kH`DIYf<x`gpwh-ZwC%+E}$FN#f|6Y42L%0J(nOZ zK~94nx_xY0vE5&3vt=1}|JFzM6U{w_y}TNker;cuDjBD8uFOyh!Sz21bTyi;{3m^P aum5PF_)Q@myQ11L_{0v{XT5%#Y}4O*5S_UI literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py new file mode 100644 index 0000000..a2d3007 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +import os +import errno +import sys + +from pip._vendor import six + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + six.PY2 or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py new file mode 100644 index 0000000..e434c25 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py @@ -0,0 +1,177 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import division, print_function + +from collections import deque +from datetime import timedelta +from math import ceil +from sys import stderr +try: + from time import monotonic +except ImportError: + from time import time as monotonic + + +__version__ = '1.5' + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' + + +class Infinite(object): + file = stderr + sma_window = 10 # Simple Moving Average window + check_tty = True + hide_cursor = True + + def __init__(self, message='', **kwargs): + self.index = 0 + self.start_ts = monotonic() + self.avg = 0 + self._avg_update_ts = self.start_ts + self._ts = self.start_ts + self._xput = deque(maxlen=self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + + self._width = 0 + self.message = message + + if self.file and self.is_tty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + + def __getitem__(self, key): + if key.startswith('_'): + return None + return getattr(self, key, None) + + @property + def elapsed(self): + return int(monotonic() - self.start_ts) + + @property + def elapsed_td(self): + return timedelta(seconds=self.elapsed) + + def update_avg(self, n, dt): + if n > 0: + xput_len = len(self._xput) + self._xput.append(dt / n) + now = monotonic() + # update when we're still filling _xput, then after every second + if (xput_len < self.sma_window or + now - self._avg_update_ts > 1): + self.avg = sum(self._xput) / len(self._xput) + self._avg_update_ts = now + + def update(self): + pass + + def start(self): + pass + + def clearln(self): + if self.file and self.is_tty(): + print('\r\x1b[K', end='', file=self.file) + + def write(self, s): + if self.file and self.is_tty(): + line = self.message + s.ljust(self._width) + print('\r' + line, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def writeln(self, line): + if self.file and self.is_tty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file and self.is_tty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + def is_tty(self): + return self.file.isatty() if self.check_tty else True + + def next(self, n=1): + now = monotonic() + dt = now - self._ts + self.update_avg(n, dt) + self._ts = now + self.index = self.index + n + self.update() + + def iter(self, it): + with self: + for x in it: + yield x + self.next() + + def __enter__(self): + self.start() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.finish() + + +class Progress(Infinite): + def __init__(self, *args, **kwargs): + super(Progress, self).__init__(*args, **kwargs) + self.max = kwargs.get('max', 100) + + @property + def eta(self): + return int(ceil(self.avg * self.remaining)) + + @property + def eta_td(self): + return timedelta(seconds=self.eta) + + @property + def percent(self): + return self.progress * 100 + + @property + def progress(self): + return min(1, self.index / self.max) + + @property + def remaining(self): + return max(self.max - self.index, 0) + + def start(self): + self.update() + + def goto(self, index): + incr = index - self.index + self.next(incr) + + def iter(self, it): + try: + self.max = len(it) + except TypeError: + pass + + with self: + for x in it: + yield x + self.next() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c39b93bd8f4ecd8f5c6fdc7b7afe39a2c2f1c726 GIT binary patch literal 5567 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 DphRCT literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..038242af5c7281837dded1e0bc0c237c4afd218d GIT binary patch literal 2659 zcmbVNTW{P%6!!SO-c7nmFQnxbC_yoz-9lT@A_P$*K)kFf74fhVvfLf-#*5dxjJ>(Z zD<P$VmaDj^6>kYVAfAwT;RT8RF^}++zt9)>j_o9yHb@k2=A8M?Ovc|CpZVt6)Rd#( z`Q1PB{_|Bu`HR5bqocEgmV5`p70x21&svO8Uyan3$~CS>T3>JJOnF=31~+dh+zj+B ztz`gP+y=G-1K0$va0l24OkfMR%4@*29NWNCd>VK<pI-q!#_PcKpn~}h@C=^?p3QNU zt2Y$)_%4_!E|c|99JU8M@S-pcgdZi%T~>_P*TtYKf+T6v)V)VVX9+EN5hhStj4Mco zwKT4_bPoDlZ<*X^S=?;dMIx;Vui%xA)UNqrcOL(@IkT`B#ynVed1GO*@567Z^Vz1F z&EIGEJKH7>^w?!vhEIAhsgfx@hNhlSw%C|@EMs%ZSVd3ElvBzWwx?(8gfiCAGcwE^ z8|az&sL9#3mC+nK(=&=!GP7&$u(6dX+fHWf<lhN|)uvS3s?@?bmBw1g(-mnC%RP}+ zA3NiB1F3hyD3VUlAEp~#-Zzs`rxUJAy*CJB>D=^%HxvOy@_spLtqJUS6uY+6lOXEI zDf;Jtdr=T~@v2&}Vu8dIQkNQ*l13gEbqeTF7zaNq;&Fic{l-v)t9}|ZR(;Xv3?d$g zq|q0Rn?29Fl3b2oS>>17-f;Eh3u)&{w<n^PI+w3rZM@qUhQo7VoTPpfom(HqYZu$S zO$z4CTMc495LmpZh6YHSA8tr<G~{^MJYJp5!YHiH9MxgPZ<g6?)4}&XUrcM_^V^;m z`~AT4q~m%00Ut%wuX)~wBR?ue1WuBY=O$=Pah%LCGSg(9Btywgm?sDtFmq@LO|zMP z@Kf`#LnTbLwM3KWVIC@B6(x*QhcdRffhsU%b$P`X-7xMVoz1C*#bF@YL7cjLVL@0} zVx+<RdHegq-@V;*ZSfRB;%PGTWaw)hnbA?nJcG&S&=L}ugJcB7k51$SMjlE;19@G} zyoIU)_Z!$`9A>0Y()^+HKQ>+CLAnP!eiXlF@wUro3CSGs6BPO1%$7sZjwYDh`=wxZ z@6IDLI}0AK9%4q3L(DV;mT1ZgFnfCzXgz(~;B1G9Gte<JCM81&aO0LjN`{@Z<n%jn zTLgW4c|XE7N^LESU2UQQ?tZ>k0d8e7{8btLvh-h+esB6`CH}PZcS?VIUj=L6T0vVT z;=jTaDp=}Yu6)oqHPtf}F^znt%_*dTz@&mX&Q%bK2aSXl_84cUl}y8bTA9w(4|H*p zqM3eLiE%@XZ6GtXxSAPwpS=Z@-6AcmAdWGt;&5#n>In?p%<POts+rS;hK{RH(^^*D zS5v*Y`!^mzr%zBa?v&J^ZqgjC_(_lyN1rkkRQI{!<wsv?xFCuXG(!Ui!a!y3*2GCT zX~o4d(m9Y(X~dlo#M#J)q!|~|Nm?pMEu_^R34sqPPE#m9q-UsiQ1!XGknFsPme8OA zg{wi`3bmVNr`Q}Kb;LGL9<Gpm>3dKPq?T+XxJx2G?F>X;I*?wGCTn53A{Oz6f7iL^ zF!}~slHZGXr>W|ypy;6@-&Z(FX|KqOOB$uDN&9-Z9#9dxc2R3PAC>-A=|3+0Cx!oU z&;L~7-%9^S)72kTk35BgEzEoQK3)Wy_lUg;V>3bc(Rklj@%aYvHYN|)*9Doo-<1B_ z(nE>=JGo0B)0!Yh*sal3)fuHDfvZXoZE=AN)vqA=%Ws!lnR5{oXDLSCBTr7yA`{iL gzZKGct+)VRr;^U^&zfqhHLZTKZr2U`9;@sB044M>e*gdg literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08d1cb45fe8175e9791c9ca1cd3a4096bbf8d12e GIT binary patch literal 1471 zcmbVLOK;Oa5Z?9LiIXNJh=NK%0&&8J*1QU>giu8fh)YzdoFb4h*-de<opjeuOO+lV z<sorENIb4^<UjCB_6Vo`g`Svkob;jg0Bg;TXJ>bw-`uZO%LLXhf9A<!i;zDkjFt&M zOF-%=Y@Bc!l881aCEVaFG$Phuk=ZaQc|f?ytsTNG!3L~hfn4B4kc+|uxd5`wOCXmr zxd?KZPk=ljilDc7WtBM9UGPF2s%vQ+G&@{)VUP&vhiaFi!qE1^xD~{3sO=TmS(8Gk zCcYUh1Adl()D&!jG$<zxgHvwokOt!ne3-hp+(~0F+eDkVkYl3DK-t4S`A!nrCv9Uu ze_*l%9@4tQw6!78Ia7($RuFTs3DKHLgsq=MPQd%Ub+;>no}UP}=S#QM3AvEUjimdm z?Rg7oKEBiAx0+tJcjH>pT3Bn#@Oo>0anXI`c7yJ05Ua!w!`aPlym7PH-onF-yq<`8 zM}qNT)^2l{#9a5KE~H%!4$oouSO7w|Ci5KUhN?QGZF^qqN5b=T+4G_fPec5#c;0&I zheM65!s9HB16u{p3b368%Iw=TlmEH!r7S4k*@*w6^s<O?*s$r66p;@oh}Rq{5xYmD z#WXGejjB-_JKnE{oWzHxaI4{VV(O<sI|DRI9p&Rwp9al7<^XRnBY-=Tn*bk6TdRrR zeBqS#=;f5b)!$!V<@|Nd2RYx#`J0@-&H1~WzaQ5R?ZC_qp?e#C5(2QL1G-HUqfa@V zCJBQRvrnhUfDVjp1Hf(JoxX9NjKOWxC7N;ynuQ|Ph3<1-38h&S#F_<hqU{mzvOYL0 ztGh17`9&HW*MloyQXzB*Ez@bbRmmza?tyi*2Z-R48*v7-mw*(`s!dHp;>n>_;3O{r zDQxNCRzM4wW-EbktYH<ueaQLeoPWysmz;lusW~=6ob#jUUWBu&=otqP1_b50Q^Hwm xrAaDb)+DMlkr=+jre#wk5l>kr*_#7)GdDPW+P*uS*L!$ZA>u2v#%dOPrN6%)D=Yv2 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d3b45bc71a4b1eb8bfb9e94655485bab44c81f6 GIT binary patch literal 1436 zcmbVMNpI6Y6rS;tI2(kWRtO=4kb=~jt)i6>ir|2dpsLiKB9LV=lhl!8yEAcGs&Z=2 z70ZDml$<zmVUeJ~|L_q`{R=tqo;@uM;!-Ah@69*!JoCL}a=TI~5*XX=_#<W#@(aQ4 zFkn&#kv=F!81+e)HYg=bW4f<(^@dK#UBV1zZV+a2eO+%DfO9MlIL{5hCSZ#d02fl6 z16*V!z@-%D0hd_?a3#eSJ2X#fhj-vcQlm*V4!mZ_xZ`_0E?i&k&}_rH7qq+p7Mtj~ zJ2aToLF5@woHQsS4UN%;&a{TXbY^UjhRIC0A(!OmBQFTJs2M{#F{BTNbZtoOg(hBr z1JA+?+yRjnK&_Du=~2+yIz36A!t9NXXpN4MEzAmmbLni&NK7wad?nF+9wfPF(Un{# z=CS~`H7zkD_ge||-VsrSQ-@1-B)q=c<96Q_b}RH57t-zu`*Fu{rsY&{qtC84ov45H za<4Vr?g;-%Yief3Ua%uCn(zYIbA5keB?^|WH9M=gn2OWq0Sg5j9<~LS(w14clhKnT z7e@>(9K*;kL_(`{^^nTPWVSgADY6_VaJ$@blA_~uLl*luFFVds?E2Y`D8uJTY0-lk zHDe(|A&$aI8rnW}1lORy$O#ac17%Tz8d|zGQo_BaI}J{MN{B7TjJ5%#%*t1s^SELh z>)`tH)n{ctDf>~`4^R?u3|z!<RLCG@y^kIiLZlo|!R#!E#PVBIApS3Yr3Yacj1qjV z2)$7DnX)erLJ-q(ejh=^BLp$Ib#xeg16cwgiCR0im&DS2FBr|@=9i4r=2vC6mHl=Q zlGs@nk%P)2;t`S-EY#8A9H_sm%uM_XVOHA$q6K(V#iTsvt#E%NorCWgvw^Dn;Jw1H zGrRR8vu~9hsE7s!iew!4T|%NN62!B$0zQaV+=~S~2!UG(5!ktDKc`J2urLAx7x>M; Znk}(zW{>I?ww}b7RHkLUTBsWM`wf4aFHisg literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py new file mode 100644 index 0000000..8819efd --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals + +import sys + +from . import Progress + + +class Bar(Progress): + width = 32 + suffix = '%(index)d/%(max)d' + bar_prefix = ' |' + bar_suffix = '| ' + empty_fill = ' ' + fill = '#' + + def update(self): + filled_length = int(self.width * self.progress) + empty_length = self.width - filled_length + + message = self.message % self + bar = self.fill * filled_length + empty = self.empty_fill * empty_length + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, + suffix]) + self.writeln(line) + + +class ChargingBar(Bar): + suffix = '%(percent)d%%' + bar_prefix = ' ' + bar_suffix = ' ' + empty_fill = '∙' + fill = '█' + + +class FillingSquaresBar(ChargingBar): + empty_fill = '▢' + fill = '▣' + + +class FillingCirclesBar(ChargingBar): + empty_fill = '◯' + fill = '◉' + + +class IncrementalBar(Bar): + if sys.platform.startswith('win'): + phases = (u' ', u'▌', u'█') + else: + phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█') + + def update(self): + nphases = len(self.phases) + filled_len = self.width * self.progress + nfull = int(filled_len) # Number of full chars + phase = int((filled_len - nfull) * nphases) # Phase of last char + nempty = self.width - nfull # Number of empty chars + + message = self.message % self + bar = self.phases[-1] * nfull + current = self.phases[phase] if phase > 0 else '' + empty = self.empty_fill * max(0, nempty - len(current)) + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, current, empty, + self.bar_suffix, suffix]) + self.writeln(line) + + +class PixelBar(IncrementalBar): + phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') + + +class ShadyBar(IncrementalBar): + phases = (' ', '░', '▒', '▓', '█') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py new file mode 100644 index 0000000..d955ca4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite, Progress + + +class Counter(Infinite): + def update(self): + self.write(str(self.index)) + + +class Countdown(Progress): + def update(self): + self.write(str(self.remaining)) + + +class Stack(Progress): + phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') + + def update(self): + nphases = len(self.phases) + i = min(nphases - 1, int(self.progress * nphases)) + self.write(self.phases[i]) + + +class Pie(Stack): + phases = ('○', '◔', '◑', '◕', '●') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py new file mode 100644 index 0000000..4e100ca --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite + + +class Spinner(Infinite): + phases = ('-', '\\', '|', '/') + hide_cursor = True + + def update(self): + i = self.index % len(self.phases) + self.write(self.phases[i]) + + +class PieSpinner(Spinner): + phases = ['◷', '◶', '◵', '◴'] + + +class MoonSpinner(Spinner): + phases = ['◑', '◒', '◐', '◓'] + + +class LineSpinner(Spinner): + phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] + + +class PixelSpinner(Spinner): + phases = ['⣾', '⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py new file mode 100644 index 0000000..9d6a01d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py @@ -0,0 +1,6493 @@ +#-*- coding: utf-8 -*- +# module pyparsing.py +# +# Copyright (c) 2003-2019 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and +executing simple grammars, vs. the traditional lex/yacc approach, or the +use of regular expressions. With pyparsing, you don't need to learn +a new syntax for defining grammars or matching expressions - the parsing +module provides a library of classes that you use to construct the +grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +``"<salutation>, <addressee>!"``), built up using :class:`Word`, +:class:`Literal`, and :class:`And` elements +(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, +and the strings are auto-converted to :class:`Literal` expressions):: + + from pip._vendor.pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the +self-explanatory class names, and the use of '+', '|' and '^' operators. + +The :class:`ParseResults` object returned from +:class:`ParserElement.parseString` can be +accessed as a nested list, a dictionary, or an object with named +attributes. + +The pyparsing module handles some of the problems that are typically +vexing when writing text parsers: + + - extra or missing whitespace (the above program will also handle + "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes :class:`ParserElement` and :class:`ParseResults` to +see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + + - construct literal match expressions from :class:`Literal` and + :class:`CaselessLiteral` classes + - construct character word-group expressions using the :class:`Word` + class + - see how to create repetitive expressions using :class:`ZeroOrMore` + and :class:`OneOrMore` classes + - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, + and :class:`'&'<Each>` operators to combine simple expressions into + more complex ones + - associate names with your parsed results using + :class:`ParserElement.setResultsName` + - find some helpful expression short-cuts like :class:`delimitedList` + and :class:`oneOf` + - find more useful common expressions in the :class:`pyparsing_common` + namespace class +""" + +__version__ = "2.4.0" +__versionTime__ = "07 Apr 2019 18:28 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + # Python 3 + from itertools import filterfalse +except ImportError: + from itertools import ifilterfalse as filterfalse + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +try: + from types import SimpleNamespace +except ImportError: + class SimpleNamespace: pass + +# version compatibility configuration +__compat__ = SimpleNamespace() +__compat__.__doc__ = """ + A cross-version compatibility configuration for pyparsing features that will be + released in a future version. By setting values in this configuration to True, + those features can be enabled in prior versions for compatibility development + and testing. + + - collect_all_And_tokens - flag to enable fix for Issue #63 that fixes erroneous grouping + of results names when an And expression is nested within an Or or MatchFirst; set to + True to enable bugfix to be released in pyparsing 2.4 +""" +__compat__.collect_all_And_tokens = True + + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ '__version__', '__versionTime__', '__author__', '__compat__', +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'PrecededBy', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'Char', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', 'pyparsing_unicode', 'unicode_set', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + unicode = str + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode + friendly. It first tries str(obj). If that fails with + a UnicodeEncodeError, then it tries unicode(obj). It then + < returns the unicode object | encodes it with the default + encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + + Expected integer (at char 0), (line:1, col:1) + column: 1 + + """ + + @staticmethod + def explain(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `setName` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + explain() is only supported under Python 3. + """ + import inspect + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(' ' * (exc.col - 1) + '^') + ret.append("{0}: {1}".format(type(exc).__name__, exc)) + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff[0] + + f_self = frm.f_locals.get('self', None) + if isinstance(f_self, ParserElement): + if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): + continue + if f_self in seen: + continue + seen.add(f_self) + + self_type = type(f_self) + ret.append("{0}.{1} - {2}".format(self_type.__module__, + self_type.__name__, + f_self)) + elif f_self is not None: + self_type = type(f_self) + ret.append("{0}.{1}".format(self_type.__module__, + self_type.__name__)) + else: + code = frm.f_code + if code.co_name in ('wrapper', '<module>'): + continue + + ret.append("{0}".format(code.co_name)) + + depth -= 1 + if not depth: + break + + return '\n'.join(ret) + + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like :class:`ParseFatalException`, but thrown internally + when an :class:`ErrorStop<And._ErrorStop>` ('-' operator) indicates + that parsing is to stop immediately because an unbacktrackable + syntax error has been found. + """ + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by :class:`ParserElement.validate` if the + grammar could be improperly recursive + """ + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """Structured parse results, to provide multiple means of access to + the parsed data: + + - as a list (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.<resultsName>`` - see :class:`ParserElement.setResultsName`) + + Example:: + + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + + prints:: + + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(ParseResults(toklist.__toklist), 0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys.""" + + values = _itervalues + """Returns an iterator of all named result values.""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples.""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default= ``last``). + Supports both ``list`` and ``dict`` semantics for ``pop()``. If + passed no argument or an integer argument, it will use ``list`` + semantics and pop tokens from the list of parsed tokens. If passed + a non-integer argument (most likely a string), it will use ``dict`` + semantics and pop the corresponding value from any defined results + names. A second default return value argument is supported, just as in + ``dict.pop()``. + + Example:: + + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + + prints:: + + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given ``defaultValue`` or ``None`` if no + ``defaultValue`` is specified. + + Similar to ``dict.get()``. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to ``list.insert()``. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self.__iadd__(itemseq) + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a :class:`ParseResults` object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = dict(self.__tokdict.items()) + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + + prints:: + + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of + a :class:`ParseResults`. Accepts an optional ``indent`` argument so + that this string can be embedded in a nested display of other data. + + Example:: + + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + + prints:: + + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the + `pprint <https://docs.python.org/3/library/pprint.html>`_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint <https://docs.python.org/3/library/pprint.html#pprint.pprint>`_ . + + Example:: + + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + + prints:: + + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See + :class:`ParserElement.parseString` for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note - the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`ParserElement.parseString` + for more information on parsing strings containing ``<TAB>`` s, and + suggested methods to maintain a consistent view of the parsed string, the + parse location, and line and column positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = set(ParserElement.DEFAULT_WHITE_CHARS) + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this :class:`ParserElement`. Useful for defining + different parse actions for the same parsing pattern, using copies of + the original parse element. + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + + prints:: + + [5120, 100, 655360, 268435456] + + Equivalent form of ``expr.copy()`` is just ``expr()``:: + + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original :class:`ParserElement` object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + ``expr("name")`` in place of ``expr.setResultsName("name")`` + - see :class:`__call__`. + + Example:: + + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set ``breakFlag`` to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as ``fn(s,loc,toks)`` , + ``fn(loc,toks)`` , ``fn(toks)`` , or just ``fn()`` , where: + + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a :class:`ParseResults` object + + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default= ``False`` ) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See :class:`parseString for more + information on parsing strings containing ``<TAB>`` s, and suggested + methods to maintain a consistent view of the parsed string, the parse + location, and line and column positions within the parsed string. + + Example:: + + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See :class:`setParseAction`. + + See examples in :class:`copy`. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, + functions passed to ``addCondition`` need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + fn = _trim_arity(fn) + def pa(s,l,t): + if not bool(fn(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + ``fn(s,loc,expr,err)`` where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw :class:`ParseFatalException` + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + + - cache_size_limit - (default= ``128``) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method :class:`ParserElement.enablePackrat`. + For best results, call ``enablePackrat()`` immediately after + importing pyparsing. + + Example:: + + from pip._vendor import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set ``parseAll`` to True (equivalent to ending + the grammar with ``StringEnd()``). + + Note: ``parseString`` implicitly calls ``expandtabs()`` on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the ``loc`` argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + + - calling ``parseWithTabs`` on your grammar before calling ``parseString`` + (see :class:`parseWithTabs`) + - define your parse action using the full ``(s,loc,toks)`` signature, and + reference the input string using the parse action's ``s`` argument + - explictly expand the tabs in your input string before calling + ``parseString`` + + Example:: + + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + ``maxMatches`` argument, to clip scanning after 'n' matches are found. If + ``overlap`` is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See :class:`parseString` for more information on parsing + strings with embedded tabs. + + Example:: + + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to :class:`scanString`, to modify matching text with modified tokens that may + be returned from a parse action. To use ``transformString``, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking ``transformString()`` on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. ``transformString()`` returns the resulting transformed string. + + Example:: + + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + + prints:: + + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to :class:`scanString`, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + ``maxMatches`` argument, to clip searching after 'n' matches are found. + + Example:: + + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + + prints:: + + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional ``maxsplit`` argument, to limit the number of splits; + and the optional ``includeSeparators`` argument (default= ``False``), if the separating + matching text should be included in the split results. + + Example:: + + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + + prints:: + + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns :class:`And`. Adding strings to a ParserElement + converts them to :class:`Literal`s by default. + + Example:: + + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + + prints:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns :class:`And` with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of ``expr * 3`` in place of + ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer + tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples + may also include ``None`` as in: + - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent + to ``expr*n + ZeroOrMore(expr)`` + (read as "at least n instances of ``expr``") + - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` + (read as "0 to n instances of ``expr``") + - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` + - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` + + Note that ``expr*(None,n)`` does not raise an exception if + more than n exprs exist in the input stream; that is, + ``expr*(None,n)`` does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + ``expr*(None,n) + ~expr`` + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns :class:`MatchFirst` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns :class:`Or` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns :class:`Each` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a :class:`ParserElement` + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns :class:`NotAny` + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. + + If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be + passed as ``True``. + + If ``name` is omitted, same as calling :class:`copy`. + + Example:: + + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this :class:`ParserElement`; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + :class:`ParserElement`'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand ``<TAB>``s to spaces before parsing the input string. + Must be called before ``parseString`` when the input grammar contains elements that + match ``<TAB>`` characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set ``flag`` to True to enable, False to disable. + + Example:: + + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using :class:`setDebugActions`. Prior to attempting + to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` + is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` + message is shown. Also note the use of :class:`setName` to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the :class:`Word` expression without calling ``setName`` is ``"W:(ABCD...)"``. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + + Example:: + + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', + fullDump=True, printResults=True, failureTests=False, postParse=None): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default= ``True``) - flag to pass to :class:`parseString` when running tests + - comment - (default= ``'#'``) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default= ``True``) prints test output to stdout + - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing + - postParse - (default= ``None``) optional callback for successful parse results; called as + `fn(test_string, parse_results)` and returns a string to be added to the test output + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if ``failureTests`` is True), and the results contain a list of lines of each + test's output + + Example:: + + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + + prints:: + + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + # convert newline marks to actual newlines, and strip leading BOM if present + NL = Literal(r'\n').addParseAction(replaceWith('\n')).ignore(quotedString) + BOM = '\ufeff' + t = NL.transformString(t.lstrip(BOM)) + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + if postParse is not None: + try: + pp_value = postParse(t, result) + if pp_value is not None: + out.append(str(pp_value)) + except Exception as e: + out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """Abstract :class:`ParserElement` subclass, for defining atomic + matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """Token to exactly match a specified string. + + Example:: + + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use :class:`CaselessLiteral`. + + For keyword matching (force word break before and after the matched string), + use :class:`Keyword` or :class:`CaselessKeyword`. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """Token to exactly match a specified string as a keyword, that is, + it must be immediately followed by a non-keyword character. Compare + with :class:`Literal`: + + - ``Literal("if")`` will match the leading ``'if'`` in + ``'ifAndOnlyIf'``. + - ``Keyword("if")`` will not; it will only match the leading + ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` + + Accepts two optional constructor arguments in addition to the + keyword string: + + - ``identChars`` is a string of characters that would be valid + identifier characters, defaulting to all alphanumerics + "_" and + "$" + - ``caseless`` allows case-insensitive matching, default is ``False``. + + Example:: + + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use :class:`CaselessKeyword`. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for :class:`CaselessKeyword`.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of :class:`Keyword`. + + Example:: + + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for :class:`CaselessLiteral`.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + +class CloseMatch(Token): + """A variation on :class:`Literal` which matches "close" matches, + that is, strings with at most 'n' mismatching characters. + :class:`CloseMatch` takes parameters: + + - ``match_string`` - string to be matched + - ``maxMismatches`` - (``default=1``) maximum number of + mismatches allowed to count as a match + + The results from a successful parse will contain the matched text + from the input string and the following named results: + + - ``mismatches`` - a list of the positions within the + match_string where mismatches were found + - ``original`` - the original match_string used to compare + against the input string + + If ``mismatches`` is an empty list, then the match was an exact + match. + + Example:: + + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, an + optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. An optional ``excludeChars`` parameter can + list characters that might be found in the input ``bodyChars`` + string; useful to define a word of all printables except for one or + two characters, for instance. + + :class:`srange` is useful for defining custom character set strings + for defining ``Word`` expressions, using range notation from + regular expression character sets. + + A common mistake is to use :class:`Word` to match a specific literal + string, as in ``Word("Address")``. Remember that :class:`Word` + uses the string argument to define *sets* of matchable characters. + This expression would match "Add", "AAA", "dAred", or any other word + made up of the characters 'A', 'd', 'r', 'e', and 's'. To match an + exact literal string, use :class:`Literal` or :class:`Keyword`. + + pyparsing includes helper strings for building Words: + + - :class:`alphas` + - :class:`nums` + - :class:`alphanums` + - :class:`hexnums` + - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 + - accented, tilded, umlauted, etc.) + - :class:`punc8bit` (non-alphabetic characters in ASCII range + 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - :class:`printables` (any non-whitespace character) + + Example:: + + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + excludeChars = set(excludeChars) + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if instring[loc] not in self.initChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + elif self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + elif self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Char(Word): + """A short-cut class for defining ``Word(characters, exact=1)``, + when defining a match of any single character in a string of + characters. + """ + def __init__(self, charset, asKeyword=False, excludeChars=None): + super(Char, self).__init__(charset, exact=1, asKeyword=asKeyword, excludeChars=excludeChars) + self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) + self.re = re.compile( self.reString ) + + +class Regex(Token): + r"""Token for matching strings that match a given regular + expression. Defined with string specifying the regular expression in + a form recognized by the stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. + If the given regex contains named groups (defined using ``(?P<name>...)``), + these will be preserved as named parse results. + + Example:: + + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: https://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0, asGroupList=False, asMatch=False): + """The parameters ``pattern`` and ``flags`` are passed + to the ``re.compile()`` function as-is. See the Python + `re module <https://docs.python.org/3/library/re.html>`_ module for an + explanation of the acceptable patterns and flags. + """ + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + self.asGroupList = asGroupList + self.asMatch = asMatch + if self.asGroupList: + self.parseImpl = self.parseImplAsGroupList + if self.asMatch: + self.parseImpl = self.parseImplAsMatch + + def parseImpl(self, instring, loc, doActions=True): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = ParseResults(result.group()) + d = result.groupdict() + if d: + for k, v in d.items(): + ret[k] = v + return loc, ret + + def parseImplAsGroupList(self, instring, loc, doActions=True): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.groups() + return loc, ret + + def parseImplAsMatch(self, instring, loc, doActions=True): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result + return loc, ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + def sub(self, repl): + r""" + Return Regex with an attached parse action to transform the parsed + result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. + + Example:: + + make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") + print(make_html.transformString("h1:main title:")) + # prints "<h1>main title</h1>" + """ + if self.asGroupList: + warnings.warn("cannot use sub() with Regex(asGroupList=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch and callable(repl): + warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch: + def pa(tokens): + return tokens[0].expand(repl) + else: + def pa(tokens): + return self.re.sub(repl, tokens[0]) + return self.addParseAction(pa) + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + + - quoteChar - string of one or more characters defining the + quote delimiting string + - escChar - character to escape quotes, typically backslash + (default= ``None`` ) + - escQuote - special quote sequence to escape an embedded quote + string (such as SQL's ``""`` to escape an embedded ``"``) + (default= ``None`` ) + - multiline - boolean indicating whether quotes can span + multiple lines (default= ``False`` ) + - unquoteResults - boolean indicating whether the matched text + should be unquoted (default= ``True`` ) + - endQuoteChar - string of one or more characters defining the + end of the quote delimited string (default= ``None`` => same as + quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace + (``'\t'``, ``'\n'``, etc.) to actual whitespace + (default= ``True`` ) + + Example:: + + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + + prints:: + + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """Token for matching words composed of characters *not* in a given + set (will include whitespace in matched characters if not listed in + the provided exclusion set - see example). Defined with string + containing all disallowed characters, and an optional minimum, + maximum, and/or exact length. The default value for ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. + + Example:: + + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + + prints:: + + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError( + "cannot specify a minimum length < 1; use " + + "Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """Special matching class for matching whitespace. Normally, + whitespace is ignored by pyparsing grammars. This class is included + when some whitespace structures are significant. Define with + a string containing the whitespace characters to be matched; default + is ``" \\t\\r\\n"``. Also takes optional ``min``, + ``max``, and ``exact`` arguments, as defined for the + :class:`Word` class. + """ + whiteStrs = { + ' ' : '<SP>', + '\t': '<TAB>', + '\n': '<LF>', + '\r': '<CR>', + '\f': '<FF>', + 'u\00A0': '<NBSP>', + 'u\1680': '<OGHAM_SPACE_MARK>', + 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', + 'u\2000': '<EN_QUAD>', + 'u\2001': '<EM_QUAD>', + 'u\2002': '<EN_SPACE>', + 'u\2003': '<EM_SPACE>', + 'u\2004': '<THREE-PER-EM_SPACE>', + 'u\2005': '<FOUR-PER-EM_SPACE>', + 'u\2006': '<SIX-PER-EM_SPACE>', + 'u\2007': '<FIGURE_SPACE>', + 'u\2008': '<PUNCTUATION_SPACE>', + 'u\2009': '<THIN_SPACE>', + 'u\200A': '<HAIR_SPACE>', + 'u\200B': '<ZERO_WIDTH_SPACE>', + 'u\202F': '<NNBSP>', + 'u\205F': '<MMSP>', + 'u\3000': '<IDEOGRAPHIC_SPACE>', + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] not in self.matchWhite: + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """Token to advance to a specific column of input text; useful for + tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + r"""Matches if current position is at the beginning of a line within + the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + prints:: + + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """Matches if current position is at the end of a line within the + parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """Matches if current position is at the beginning of the parse + string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """Matches if the current position is at the beginning of a Word, + and is not preceded by any character in a given set of + ``wordChars`` (default= ``printables``). To emulate the + ``\b`` behavior of regular expressions, use + ``WordStart(alphanums)``. ``WordStart`` will also match at + the beginning of the string being parsed, or at the beginning of + a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """Matches if the current position is at the end of a Word, and is + not followed by any character in a given set of ``wordChars`` + (default= ``printables``). To emulate the ``\b`` behavior of + regular expressions, use ``WordEnd(alphanums)``. ``WordEnd`` + will also match at the end of the string being parsed, or at the end + of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """Abstract subclass of ParserElement, for combining and + post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends ``leaveWhitespace`` defined in base class, and also invokes ``leaveWhitespace`` on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given :class:`ParseExpression` s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the ``'+'`` operator. + May also be constructed using the ``'-'`` operator, which will + suppress backtracking. + + Example:: + + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def streamline(self): + super(And, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the expression that matches the longest + string will be used. May be constructed using the ``'^'`` + operator. + + Example:: + + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + + prints:: + + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(Or, self).streamline() + if __compat__.collect_all_And_tokens: + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """Requires that at least one :class:`ParseExpression` is found. If + two expressions match, the first one listed is the one that will + match. May be constructed using the ``'|'`` operator. + + Example:: + + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(MatchFirst, self).streamline() + if __compat__.collect_all_And_tokens: + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """Requires all given :class:`ParseExpression` s to be found, but in + any order. Expressions may be separated by whitespace. + + May be constructed using the ``'&'`` operator. + + Example:: + + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + + prints:: + + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + self.saveAsList = True + + def streamline(self): + super(Each, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """Abstract subclass of :class:`ParserElement`, for combining and + post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """Lookahead matching of the given parse expression. + ``FollowedBy`` does *not* advance the parsing position within + the input string, it only verifies that the specified parse + expression matches at the current position. ``FollowedBy`` + always returns a null token list. If any results names are defined + in the lookahead expression, those *will* be returned for access by + name. + + Example:: + + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + + prints:: + + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + _, ret = self.expr._parse(instring, loc, doActions=doActions) + del ret[:] + return loc, ret + + +class PrecededBy(ParseElementEnhance): + """Lookbehind matching of the given parse expression. + ``PrecededBy`` does not advance the parsing position within the + input string, it only verifies that the specified parse expression + matches prior to the current position. ``PrecededBy`` always + returns a null token list, but if a results name is defined on the + given expression, it is returned. + + Parameters: + + - expr - expression that must match prior to the current parse + location + - retreat - (default= ``None``) - (int) maximum number of characters + to lookbehind prior to the current parse location + + If the lookbehind expression is a string, Literal, Keyword, or + a Word or CharsNotIn with a specified exact or maximum length, then + the retreat parameter is not required. Otherwise, retreat must be + specified to give a maximum number of characters to look back from + the current parse position for a lookbehind match. + + Example:: + + # VB-style variable names with type prefixes + int_var = PrecededBy("#") + pyparsing_common.identifier + str_var = PrecededBy("$") + pyparsing_common.identifier + + """ + def __init__(self, expr, retreat=None): + super(PrecededBy, self).__init__(expr) + self.expr = self.expr().leaveWhitespace() + self.mayReturnEmpty = True + self.mayIndexError = False + self.exact = False + if isinstance(expr, str): + retreat = len(expr) + self.exact = True + elif isinstance(expr, (Literal, Keyword)): + retreat = expr.matchLen + self.exact = True + elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: + retreat = expr.maxLen + self.exact = True + elif isinstance(expr, _PositionToken): + retreat = 0 + self.exact = True + self.retreat = retreat + self.errmsg = "not preceded by " + str(expr) + self.skipWhitespace = False + + def parseImpl(self, instring, loc=0, doActions=True): + if self.exact: + if loc < self.retreat: + raise ParseException(instring, loc, self.errmsg) + start = loc - self.retreat + _, ret = self.expr._parse(instring, start) + else: + # retreat specified a maximum lookbehind window, iterate + test_expr = self.expr + StringEnd() + instring_slice = instring[:loc] + last_expr = ParseException(instring, loc, self.errmsg) + for offset in range(1, min(loc, self.retreat+1)): + try: + _, ret = test_expr._parse(instring_slice, loc-offset) + except ParseBaseException as pbe: + last_expr = pbe + else: + break + else: + raise last_expr + # return empty list of tokens, but preserve any defined results names + del ret[:] + return loc, ret + + +class NotAny(ParseElementEnhance): + """Lookahead to disallow matching with the given parse expression. + ``NotAny`` does *not* advance the parsing position within the + input string, it only verifies that the specified parse expression + does *not* match at the current position. Also, ``NotAny`` does + *not* skip over leading whitespace. ``NotAny`` always returns + a null token list. May be constructed using the '~' operator. + + Example:: + + AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) + + # take care not to mistake keywords for identifiers + ident = ~(AND | OR | NOT) + Word(alphas) + boolean_term = Optional(NOT) + ident + + # very crude boolean expression - to support parenthesis groups and + # operation hierarchy, use infixNotation + boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) + + # integers that are followed by "." are actually floats + integer = Word(nums) + ~Char(".") + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to :class:`OneOrMore` + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + + prints:: + + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """Token for skipping over all undefined text until the matched + expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default= ``False``) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default= ``None``) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default= ``None``) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + + prints:: + + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.saveAsList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the ``Forward`` + variable using the '<<' operator. + + Note: take care when assigning to ``Forward`` not to overlook + precedence of operators. + + Specifically, '|' has a lower precedence than '<<', so that:: + + fwdExpr << a | b | c + + will actually be evaluated as:: + + (fwdExpr << a) | b | c + + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the ``Forward``:: + + fwdExpr << (a | b | c) + + Converting to use the '<<=' operator instead will avoid this problem. + + See :class:`ParseResults.pprint` for an example of a recursive + parser created using ``Forward``. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + # Avoid infinite recursion by setting a temporary name + self.name = self.__class__.__name__ + ": ..." + + # Use the string representation of main expression. + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + del self.name + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of :class:`ParseExpression`, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the + input string; this can be disabled by specifying + ``'adjacent=False'`` in the constructor. + + Example:: + + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """Converter to return the matched tokens as a list - useful for + returning tokens of :class:`ZeroOrMore` and :class:`OneOrMore` expressions. + + Example:: + + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """Converter to return a repetitive expression as a list, but also + as a dictionary. Each element can also be referenced using the first + token in the expression as its key. Useful for tabular report + scraping when the first column can be used as a item key. + + Example:: + + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + + prints:: + + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + + See more examples at :class:`ParseResults` of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """Converter for ignoring the results of a parsed expression. + + Example:: + + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + + prints:: + + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + + (See also :class:`delimitedList`.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """Decorator for debugging parse actions. + + When the parse action is called, this decorator will print + ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. + When the parse action completes, the decorator will print + ``"<<"`` followed by the returned value, or any exception that the parse action raised. + + Example:: + + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + + prints:: + + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """Helper to define a delimited list of expressions - the delimiter + defaults to ','. By default, the list elements and delimiters can + have intervening whitespace, and comments, but this can be + overridden by passing ``combine=True`` in the constructor. If + ``combine`` is set to ``True``, the matching tokens are + returned as a single token string, with the delimiters included; + otherwise, the matching tokens are returned as a list of tokens, + with the delimiters suppressed. + + Example:: + + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """Helper to define a counted list of expressions. + + This helper defines a pattern of the form:: + + integer expr expr expr... + + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the + leading count token is suppressed. + + If ``intExpr`` is specified, it should be a pyparsing expression + that produces an integer value. + + Example:: + + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`matchPreviousExpr`. Do *not* use with packrat parsing + enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks for + a 'repeat' of a previous expression. For example:: + + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + + will match ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *not* use + with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """Helper to quickly define a set of alternative Literals, and makes + sure to do longest-first testing when there is a conflict, + regardless of the input order, but returns + a :class:`MatchFirst` for best performance. + + Parameters: + + - strs - a string of space-delimited literals, or a collection of + string literals + - caseless - (default= ``False``) - treat all literals as + caseless + - useRegex - (default= ``True``) - as an optimization, will + generate a Regex object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True``, or if + creating a :class:`Regex` raises an exception) + + Example:: + + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + + prints:: + + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """Helper to easily and clearly define a dictionary by specifying + the respective patterns for the key and value. Takes care of + defining the :class:`Dict`, :class:`ZeroOrMore`, and + :class:`Group` tokens in the proper order. The key pattern + can include delimiting markers or punctuation, as long as they are + suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the :class:`Dict` results + can include named token fields. + + Example:: + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + + prints:: + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict(OneOrMore(Group(key + value))) + +def originalTextFor(expr, asString=True): + """Helper to return the original, untokenized text for a given + expression. Useful to restore the parsed fields of an HTML start + tag into the raw tag text itself, or to revert separate tokens with + intervening whitespace back to the original matching input text. By + default, returns astring containing the original parsed text. + + If the optional ``asString`` argument is passed as + ``False``, then the return value is + a :class:`ParseResults` containing any results names that + were originally matched, and a single token containing the original + matched text from the input string. So if the expression passed to + :class:`originalTextFor` contains expressions with defined + results names, you must set ``asString`` to ``False`` if you + want to preserve those results name values. + + Example:: + + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + + prints:: + + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """Helper to undo pyparsing's default grouping of And expressions, + even if all but one are non-empty. + """ + return TokenConverter(expr).addParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """Helper to decorate a returned token with its starting and ending + locations in the input string. + + This helper adds the following results names: + + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains ``<TAB>`` characters, you + may want to call :class:`ParserElement.parseWithTabs` + + Example:: + + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + + prints:: + + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r"""Helper to easily define string ranges for use in Word + construction. Borrows syntax from regexp '[]' string range + definitions:: + + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + + The input string must be enclosed in []'s, and the returned string + is the expanded character set joined into a single string. The + values enclosed in the []'s may be: + + - a single character + - an escaped character with a leading backslash (such as ``\-`` + or ``\]``) + - an escaped hex character with a leading ``'\x'`` + (``\x21``, which is a ``'!'`` character) (``\0x##`` + is also supported for backwards compatibility) + - an escaped octal character with a leading ``'\0'`` + (``\041``, which is a ``'!'`` character) + - a range of any of the above, separated by a dash (``'a-z'``, + etc.) + - any combination of the above (``'aeiouy'``, + ``'a-zA-Z0-9_$'``, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """Helper method for defining parse actions that require matching at + a specific column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """Helper method for common parse actions that simply return + a literal value. Especially useful when used with + :class:`transformString<ParserElement.transformString>` (). + + Example:: + + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """Helper parse action for removing quotation marks from parsed + quoted strings. + + Example:: + + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """Helper to define a parse action by mapping a function to all + elements of a ParseResults list. If any additional args are passed, + they are forwarded to the given function as additional arguments + after the token, as in + ``hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))``, + which will convert the parsed data to an integer using base 16. + + Example (compare the last to example in :class:`ParserElement.transformString`:: + + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + + prints:: + + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. +Deprecated in favor of :class:`pyparsing_common.upcaseTokens`""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. +Deprecated in favor of :class:`pyparsing_common.downcaseTokens`""" + +def _makeTags(tagStr, xml, + suppress_LT=Suppress("<"), + suppress_GT=Suppress(">")): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = (suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue ))) + + Optional("/", default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') + + suppress_GT) + else: + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printables, excludeChars=">") + openTag = (suppress_LT + + tagStr("tag") + + Dict(ZeroOrMore(Group(tagAttrName.setParseAction(downcaseTokens) + + Optional(Suppress("=") + tagAttrValue)))) + + Optional("/",default=[False])("empty").setParseAction(lambda s,l,t:t[0]=='/') + + suppress_GT) + closeTag = Combine(_L("</") + tagStr + ">", adjacent=False) + + openTag.setName("<%s>" % resname) + # add start<tagname> results name in parse action now that ungrouped names are not reported at two levels + openTag.addParseAction(lambda t: t.__setitem__("start"+"".join(resname.replace(":"," ").title().split()), t.copy())) + closeTag = closeTag("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + openTag.tag_body = SkipTo(closeTag()) + return openTag, closeTag + +def makeHTMLTags(tagStr): + """Helper to construct opening and closing tag expressions for HTML, + given a tag name. Matches tags in either upper or lower case, + attributes with namespaces and with quoted or unquoted values. + + Example:: + + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and + # closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are + # also accessible as named results + print(link.link_text, '->', link.href) + + prints:: + + pyparsing -> https://github.com/pyparsing/pyparsing/wiki + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """Helper to construct opening and closing tag expressions for XML, + given a tag name. Matches tags only in the given upper/lower case. + + Example: similar to :class:`makeHTMLTags` + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """Helper to create a validating parse action to be used with start + tags created with :class:`makeXMLTags` or + :class:`makeHTMLTags`. Use ``withAttribute`` to qualify + a starting tag with a required attribute value, to avoid false + matches on common tags such as ``<TD>`` or ``<DIV>``. + + Call ``withAttribute`` with a series of attribute names and + values. Specify the list of filter attributes names and values as: + + - keyword arguments, as in ``(align="right")``, or + - as an explicit dict with ``**`` operator, when an attribute + name is also a Python reserved word, as in ``**{"class":"Customer", "align":"right"}`` + - a list of name-value tuples, as in ``(("ns1:class", "Customer"), ("ns2:align","right"))`` + + For attribute names with a namespace prefix, you must use the second + form. Attribute names are matched insensitive to upper/lower case. + + If just testing for ``class`` (with or without a namespace), use + :class:`withClass`. + + To verify that the attribute exists, but without specifying a value, + pass ``withAttribute.ANY_VALUE`` as the value. + + Example:: + + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """Simplified version of :class:`withAttribute` when + matching on a div class - made difficult because ``class`` is + a reserved word in Python. + + Example:: + + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + + prints:: + + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = SimpleNamespace() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary + or binary, left- or right-associative. Parse actions can also be + attached to operator expressions. The generated parser will also + recognize the use of parentheses to override operator precedences + (see example below). + + Note: if you define a deep operator list, you may see performance + issues when using infixNotation. See + :class:`ParserElement.enablePackrat` for a mechanism to potentially + improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the + nested + - opList - list of tuples, one for each operator precedence level + in the expression grammar; each tuple is of the form ``(opExpr, + numTerms, rightLeftAssoc, parseAction)``, where: + + - opExpr is the pyparsing expression for the operator; may also + be a string, which will be converted to a Literal; if numTerms + is 3, opExpr is a tuple of two expressions, for the two + operators separating the 3 terms + - numTerms is the number of terms for this operator (must be 1, + 2, or 3) + - rightLeftAssoc is the indicator whether the operator is right + or left associative, using the pyparsing-defined constants + ``opAssoc.RIGHT`` and ``opAssoc.LEFT``. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the parse action + tuple member may be omitted); if the parse action is passed + a tuple or list of functions, this is equivalent to calling + ``setParseAction(*fn)`` + (:class:`ParserElement.setParseAction`) + - lpar - expression for matching left-parentheses + (default= ``Suppress('(')``) + - rpar - expression for matching right-parentheses + (default= ``Suppress(')')``) + + Example:: + + # simple example of four-function arithmetic with ints and + # variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + + prints:: + + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.tryParse(instring, loc) + return loc, [] + + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError( + "if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = _FB(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = _FB(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of :class:`infixNotation`, will be +dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """Helper method for defining nested lists enclosed in opening and + closing delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list + (default= ``"("``); can also be a pyparsing expression + - closer - closing character for a nested list + (default= ``")"``); can also be a pyparsing expression + - content - expression for items within the nested lists + (default= ``None``) + - ignoreExpr - expression for ignoring opening and closing + delimiters (default= :class:`quotedString`) + + If an expression is not provided for the content argument, the + nested expression will capture all whitespace-delimited content + between delimiters as a list of separate values. + + Use the ``ignoreExpr`` argument to define expressions that may + contain opening or closing characters that should not be treated as + opening or closing characters for nesting, such as quotedString or + a comment expression. Specify multiple expressions using an + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quotedString`, but if no expressions are to be ignored, then + pass ``None`` for this argument. + + Example:: + + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + + prints:: + + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """Helper method for defining space-delimited indentation blocks, + such as those used to define block statements in Python source code. + + Parameters: + + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single + grammar should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond + the the current level; set to False for block of left-most + statements (default= ``True``) + + A valid block must contain at least one ``blockStatement``. + + Example:: + + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + + prints:: + + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + backup_stack = indentStack[:] + + def reset_stack(): + indentStack[:] = backup_stack + + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + smExpr.setFailAction(lambda a, b, c, d: reset_stack()) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form ``/* ... */``" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form ``<!-- ... -->``" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form ``// ... (to end of line)``" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" + +javaStyleComment = cppStyleComment +"Same as :class:`cppStyleComment`" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form ``# ... (to end of line)``" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or +quoted strings, separated by commas. + +This expression is deprecated in favor of :class:`pyparsing_common.comma_separated_list`. +""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """Here are some common low-level expressions that may be useful in + jump-starting parser development: + + - numeric forms (:class:`integers<integer>`, :class:`reals<real>`, + :class:`scientific notation<sci_real>`) + - common :class:`programming identifiers<identifier>` + - network addresses (:class:`MAC<mac_address>`, + :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) + - ISO8601 :class:`dates<iso8601_date>` and + :class:`datetime<iso8601_datetime>` + - :class:`UUID<uuid>` + - :class:`comma-separated list<comma_separated_list>` + + Parse actions: + + - :class:`convertToInteger` + - :class:`convertToFloat` + - :class:`convertToDate` + - :class:`convertToDatetime` + - :class:`stripHTMLTags` + - :class:`upcaseTokens` + - :class:`downcaseTokens` + + Example:: + + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + + prints:: + + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional + scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (``0.0.0.0 - 255.255.255.255``)" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%d"``) + + Example:: + + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + + prints:: + + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """Helper to create a parse action for converting parsed + datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default= ``"%Y-%m-%dT%H:%M:%S.%f"``) + + Example:: + + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + + prints:: + + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (``yyyy-mm-dd``)" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (``xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx``)" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """Parse action to remove HTML tags from web page HTML source + + Example:: + + # strip HTML links from normal text + text = '<td>More info at the <a href="https://github.com/pyparsing/pyparsing/wiki">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + print(table_text.parseString(text).body) + + Prints:: + + More info at the pyparsing wiki page + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +class _lazyclassproperty(object): + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +class unicode_set(object): + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``, such as:: + + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + _ranges = [] + + @classmethod + def _get_chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in cc._ranges: + ret.extend(range(rr[0], rr[-1]+1)) + return [unichr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + "all non-whitespace characters in this range" + return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphas(cls): + "all alphabetic characters in this range" + return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def nums(cls): + "all numeric digit characters in this range" + return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphanums(cls): + "all alphanumeric characters in this range" + return cls.alphas + cls.nums + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + _ranges = [(32, sys.maxunicode)] + + class Latin1(unicode_set): + "Unicode set for Latin-1 Unicode Character Range" + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + class LatinA(unicode_set): + "Unicode set for Latin-A Unicode Character Range" + _ranges = [(0x0100, 0x017f),] + + class LatinB(unicode_set): + "Unicode set for Latin-B Unicode Character Range" + _ranges = [(0x0180, 0x024f),] + + class Greek(unicode_set): + "Unicode set for Greek Unicode Character Ranges" + _ranges = [ + (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), + (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), + (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), + ] + + class Cyrillic(unicode_set): + "Unicode set for Cyrillic Unicode Character Range" + _ranges = [(0x0400, 0x04ff)] + + class Chinese(unicode_set): + "Unicode set for Chinese Unicode Character Range" + _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] + + class Japanese(unicode_set): + "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" + _ranges = [ ] + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] + + class Hiragana(unicode_set): + "Unicode set for Hiragana Unicode Character Range" + _ranges = [(0x3040, 0x309f), ] + + class Katakana(unicode_set): + "Unicode set for Katakana Unicode Character Range" + _ranges = [(0x30a0, 0x30ff), ] + + class Korean(unicode_set): + "Unicode set for Korean Unicode Character Range" + _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] + + class CJK(Chinese, Japanese, Korean): + "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" + pass + + class Thai(unicode_set): + "Unicode set for Thai Unicode Character Range" + _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] + + class Arabic(unicode_set): + "Unicode set for Arabic Unicode Character Range" + _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] + + class Hebrew(unicode_set): + "Unicode set for Hebrew Unicode Character Range" + _ranges = [(0x0590, 0x05ff), ] + + class Devanagari(unicode_set): + "Unicode set for Devanagari Unicode Character Range" + _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] + +pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges + + pyparsing_unicode.Japanese.Hiragana._ranges + + pyparsing_unicode.Japanese.Katakana._ranges) + +# define ranges in language character sets +if PY_3: + setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) + setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) + setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) + setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) + setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) + setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) + setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) + setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) + setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) + setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) + setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) + setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py new file mode 100644 index 0000000..8ed060f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py @@ -0,0 +1,4 @@ +from .core import TomlError +from .parser import load, loads +from .test import translate_to_test +from .writer import dump, dumps \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0bb15cb941fce0312f89b24f0d2f23392c43aebc GIT binary patch literal 385 zcmXv~%Sr<=6rIeg4_eTze=v(0U&R)Rh~U<Zt_CE;CY344B;2G^>&EZ#AN-PRUHJ>H z%pLH;Jvrx|o8%^U)9E;g@x@P`KjQk0;y=<zZezMt1d#}$5>0ACkf$ouS)J*;&U>Ay zLYH;f^IQ$|upa7BJ&L+`OsevS#3L#aMo&hodjJDf8gga02nC{x-mwSXI>o(Y-Y_qn z#~!iMHWY~Np&EyLZ9oD}7D~&(Nq{U0$gz^+CMbGy4~>sziRK`}X95%C2)~wEXu5b4 z?KselQ9^>F8tBWGv4xwr*PXapGuvI9`OV^W3+j9`UoPnrwT+!Mt@B)|*_&<mm+S32 p7W-tKY=r@84?aGVGS;+>XYAA-!f>UH*eQ8~AK`GS2{|GY@&})jXh{G7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0420865d37b3cefaeeab1a9d660a800cc61ff2c GIT binary patch literal 948 zcmbVK&2G~`5Z?7q;+6!7iUZ<AB@VSjV<=R#2%!puxa9ynMM5j%U01f&Kg>FTCeDdI zNPFZRcoJWE3nV0FHfj_QTo`M<8Sl^Rx8Ll`;c%OweT(nD|H&EqPCwV?VRC|QZX>*5 zl1YAnuGklM!lm<$g>Hf~YjZF=K{xji6vH)a;z(S1!6vSBrH9dzzU*Q2Wgqtk-PUPU z=+^)hBtGsUqu57(g>FU&4ZGwmYkBLmZtGq7oN^`{{Aa?&F($m$L-ZxXqI?|oy20CN z*<^*XrMp0gtjroAx_+UIiO*E$>8w<pn^d|B(oCx|E>!4uo>4jlx;YRJ=n)W`uMD;@ z{LoPi*(`2UG>aihD=ih6sDS80F2s>JET7KglSI_BgNIFebe4mDlpY=*N2gJp)%#g# znpo@o&vp6fagxtz(7KqZQdSVv=M4%HB^9VqeGV=jNwON-CBDOZ_M7jlWgA^zEy4C# zqe!%^es?gD{F1dSN6m6nEJwX^@5)1^obmkTV!5|iKDf77hR+E6u9sF&#Erf5h6W@_ z$RWUBg;)X6>iR;M281Ae46$W=eruDUo&7(4yX!i8i(Me1e_$B;a08G0ThIQ%7heOY z8VL_J2>+(&YMR~=uBDfOFK1hbqLNch`9O$|(^#)&Y?FX$!H|Gt*Z`6Us3+ux8WZrK dAGmgG96CUX*`JL~wuTiqc)mLIh24%z*)LzN&o2M~ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab88c4708c8219dd523a31fb22579e24a420f67e GIT binary patch literal 10065 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 F{{sT1Vf+99 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f9243ffa9f955b893d5076bbaf688eb39b40c8b1 GIT binary patch literal 1248 zcma)5%}*0S6rY*>XuGt01x-X^FwsK~bU`G1gb<^6;lKe%)JC&ecBaji>Fzo^trXe| z<>bwH^#I=dANV6Y&rwhO3nV7K+42><IGgu&=l$lr`MuxFzATj-1mnz~{P4#>=(nC+ zjXZq3086*PQA9CERYVCjIBt?E!KgFA3})6y)nYcw!8`v3MN=kXg*`{CW27HuXtbJt zha&P8QIlH7sOnI>jmq{p)J2=;7<?J4;aV)3zVt*bn4h0t4s=)#0%n4}0!x2^lc<X% z?h`RZF(t<^J0YiN9rdATh8ckEP=lHp)A1heBC(+{YCRa_ZggQawY!++zLCp3vtdGJ zMDx<>Le?$BhWKY%fGS7Si3lCKh2;SIPKz>sC#L}MGg_j<Cr%fg-mW$T$WJ-~YzBK5 z>F8ihA0J_gK$@}5>-OPPvi7%i`;*{8Xye29d(y)_0xgj~?&7cHqq&WKXc@<(@S~Lb zl6f-rBui!4P^2=e@SehLp_R<s1$Pq>wqc#y_Jv!EIb|Yso5I~~c-~UF5G}Up^T12m z&t_$9sooHLuC}ne?C!Wpn9PJxDt*pp_LJz-e9$=1!OXlii)bv|q$A@dcQt`Z(z$R} zX&A^LZYFCb-HAR`8y!6Thizq*$AQn&waQJ#wHQ}-AroT)O4PL&#U2JBa36okWXRep zV_^YaCc=i7!uvO!ivmP|5D(J<p%Iw>7oqD6p)aShd?EZ!nJ80s5~i%S&s$98DQGIg zCR65a9CH8#M6DY1#8fVfB&#z4a~}Khz&>25%q{kmok|f#^@IDZi0vmVkc>`e<yNK- zAB$eOq?|C#G>-x(thH2DC|NUAre-BZfsoL5MT}``jt3ignpUa|fW<u>wFkeLDtUwL zE*BKHT9GFFT8LPHV*1Bd*uSG#rsohq=@W1WJ9r#y7`#awT!gQyh=WJr+qpb}p^Tfd zS~BG6fZ~+iAlHh*Acjl#NY4!53$4UaT|CtD!lr*oDBJfIm+S`XBUJg-W=vb0t?AQ9 QwE}ruBm{#8HYRq+Usj$vG5`Po literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9187e5aace616d671219057628c2f40ab9511eb8 GIT binary patch literal 2147 zcmZ`)&2Aev5aw`yw31^-Nn9rlQXpuf!V6cHV<$)=1dWj%>Pw6Q_NA(Wg(~hQYp-@y zF6}1r?xAqn=a7zlgC6=My!PZ*$f+}2%TC;Mg&C4Va)zAm8|wM|e1qZlcmMXw-(1H2 zp~394v9pPiZ=n)QK*D-e3q1&7!Udl~&k~lf-?5%89N}W?h??-Qb-!n#E*kHcXoPIP zc4GBB0Xxi}J4J77d;G)lo;ZF``fY00FWTL+araWYytle1R{Uqn&$_*0`KOik%WB_j zoj(9_j2}m_P`*RSmr*G;fr3q;gaYK9f=&)ov>aISu3$S%Sp}TX+4#03C%&y4G8$}b zY&;2MsGVV74PI;KmCO!Dx;g60JPa=8eXik1!|+cgJ>2|$*cr+AsIS7#QD1hVED@p1 zJ44y|c|Qmq=MU3IN8-UC7#*#zsp#>meVN>k9zJ=}+3k$tQ9Dj^)lZW4n^F4f#$bO; zMkB#dn2JnxMsHO%Oge`uPV&{!TRs2Lc@RUE(=iw{;5yhK3E%V7&|nV5q~<T|D5fwG z6FxP-{?0#VCmhqnCKiD!*OWc$pFqh|TUaGG78_^Zn7s)96ohlag}YdJvqY`3++?Mt z9OX`G!YVA9pK|nLr_GsFSe2!KJ-2j9R=Q=a^vXK!aSNwlg<I4Luc%`rF1$r{0);*G z5UTq2Dc$w7hRT3;O1D0x3!XkDRYw(XKEKL*Pg}$ONLz8Lv}-`jC2?CjQIhqQt_QpE zFzjV%s6BzWDIDoKX%Qx>?>8g`(IAlt@jzx8UTLnz8s2IU8n!gN(6D2`uM~xr4yr3C z`64O?ONd94+q?nyV2L+*6U>TpWQeeIA%n~x*ugBbDI>}Xc2JjhF#|~4DP};xZI)v3 znK^#I<vO8~uHs65V9QNm<ESAVL<;86gK#HSfqmLXdWlU9iu<-y7zGO!i-F(7LNFt5 zHlotNJj<(i8k1rTz4x&49@^vP@mhI&zq__xc8}Mo885beY`2E(me_4=bz3jGt)10Y zG`{v9tMBUip&DdSl!r=QN7s5@Wk~rT4+mK)a_vT$#ER2%CfSu$d%2PkLE>AI(xh$j zpxyj1isCnya<3OE7qcS$0ypHhP%-e}4)?${VuOoNxUj(G3eF8^!R(_qWD_O-235#< z2tp5E4Z-nc``;H&)G=WV`5A5*kOTUtB{8@XI}5C?0ILm`!nO~(7F4;wXT;9KB+~9# zZivqpe9~SJ#A&R8;6B=O;~vJ>&#AjQoBk*=y=Epd<*Z=)v#64;<#XA_MsuMqB~ac& z`va6&oEsN$&cXY1AS$f0%NeI<LF5|RFGbOo$kn3{qRd}J!I^XaR7oV}B3sy@i%bBY zEF?6N982MV$uF@8kmg8udZujZn|T|lZwpvtw{S){6JA&a+NKr);C?`E`4xJWU!oc> z9GA!4Rb+Lgk#dwS*&_8dD&H}QtL|jp21|yyhS!%b=&EtrABJ7rlQ&T@SU?8a;BgeV z0^{bzjjN^GevOc(T|uB5K`_k3VM6^YLGa6AKdEM92b~#|B+)?<Rv!d6)G@CRagkDQ z{u4a#EczLS`gOU46Pn{cTy2mIM{yELqLul_FprZd3yqhEQ!FTQ^{E)zds-dxTVh*I PZypBX4eq(#HSfm13$xb$ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..143219178f10427216fdc5fa67a6a1c372b2804a GIT binary patch literal 3582 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 GGxuN4nk|?B literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py new file mode 100644 index 0000000..c182734 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py @@ -0,0 +1,13 @@ +class TomlError(RuntimeError): + def __init__(self, message, line, col, filename): + RuntimeError.__init__(self, message, line, col, filename) + self.message = message + self.line = line + self.col = col + self.filename = filename + + def __str__(self): + return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) + + def __repr__(self): + return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py new file mode 100644 index 0000000..3493aa6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py @@ -0,0 +1,341 @@ +import string, re, sys, datetime +from .core import TomlError +from .utils import rfc3339_re, parse_rfc3339_re + +if sys.version_info[0] == 2: + _chr = unichr +else: + _chr = chr + +def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): + return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) + +def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): + if isinstance(s, bytes): + s = s.decode('utf-8') + + s = s.replace('\r\n', '\n') + + root = object_pairs_hook() + tables = object_pairs_hook() + scope = root + + src = _Source(s, filename=filename) + ast = _p_toml(src, object_pairs_hook=object_pairs_hook) + + def error(msg): + raise TomlError(msg, pos[0], pos[1], filename) + + def process_value(v, object_pairs_hook): + kind, text, value, pos = v + if kind == 'str' and value.startswith('\n'): + value = value[1:] + if kind == 'array': + if value and any(k != value[0][0] for k, t, v, p in value[1:]): + error('array-type-mismatch') + value = [process_value(item, object_pairs_hook=object_pairs_hook) for item in value] + elif kind == 'table': + value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) for k in value]) + return translate(kind, text, value) + + for kind, value, pos in ast: + if kind == 'kv': + k, v = value + if k in scope: + error('duplicate_keys. Key "{0}" was used more than once.'.format(k)) + scope[k] = process_value(v, object_pairs_hook=object_pairs_hook) + else: + is_table_array = (kind == 'table_array') + cur = tables + for name in value[:-1]: + if isinstance(cur.get(name), list): + d, cur = cur[name][-1] + else: + d, cur = cur.setdefault(name, (None, object_pairs_hook())) + + scope = object_pairs_hook() + name = value[-1] + if name not in cur: + if is_table_array: + cur[name] = [(scope, object_pairs_hook())] + else: + cur[name] = (scope, object_pairs_hook()) + elif isinstance(cur[name], list): + if not is_table_array: + error('table_type_mismatch') + cur[name].append((scope, object_pairs_hook())) + else: + if is_table_array: + error('table_type_mismatch') + old_scope, next_table = cur[name] + if old_scope is not None: + error('duplicate_tables') + cur[name] = (scope, next_table) + + def merge_tables(scope, tables): + if scope is None: + scope = object_pairs_hook() + for k in tables: + if k in scope: + error('key_table_conflict') + v = tables[k] + if isinstance(v, list): + scope[k] = [merge_tables(sc, tbl) for sc, tbl in v] + else: + scope[k] = merge_tables(v[0], v[1]) + return scope + + return merge_tables(root, tables) + +class _Source: + def __init__(self, s, filename=None): + self.s = s + self._pos = (1, 1) + self._last = None + self._filename = filename + self.backtrack_stack = [] + + def last(self): + return self._last + + def pos(self): + return self._pos + + def fail(self): + return self._expect(None) + + def consume_dot(self): + if self.s: + self._last = self.s[0] + self.s = self[1:] + self._advance(self._last) + return self._last + return None + + def expect_dot(self): + return self._expect(self.consume_dot()) + + def consume_eof(self): + if not self.s: + self._last = '' + return True + return False + + def expect_eof(self): + return self._expect(self.consume_eof()) + + def consume(self, s): + if self.s.startswith(s): + self.s = self.s[len(s):] + self._last = s + self._advance(s) + return True + return False + + def expect(self, s): + return self._expect(self.consume(s)) + + def consume_re(self, re): + m = re.match(self.s) + if m: + self.s = self.s[len(m.group(0)):] + self._last = m + self._advance(m.group(0)) + return m + return None + + def expect_re(self, re): + return self._expect(self.consume_re(re)) + + def __enter__(self): + self.backtrack_stack.append((self.s, self._pos)) + + def __exit__(self, type, value, traceback): + if type is None: + self.backtrack_stack.pop() + else: + self.s, self._pos = self.backtrack_stack.pop() + return type == TomlError + + def commit(self): + self.backtrack_stack[-1] = (self.s, self._pos) + + def _expect(self, r): + if not r: + raise TomlError('msg', self._pos[0], self._pos[1], self._filename) + return r + + def _advance(self, s): + suffix_pos = s.rfind('\n') + if suffix_pos == -1: + self._pos = (self._pos[0], self._pos[1] + len(s)) + else: + self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos) + +_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*') +def _p_ews(s): + s.expect_re(_ews_re) + +_ws_re = re.compile(r'[ \t]*') +def _p_ws(s): + s.expect_re(_ws_re) + +_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"', + '\\': '\\', 'f': '\f' } + +_basicstr_re = re.compile(r'[^"\\\000-\037]*') +_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})') +_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})') +_escapes_re = re.compile(r'[btnfr\"\\]') +_newline_esc_re = re.compile('\n[ \t\n]*') +def _p_basicstr_content(s, content=_basicstr_re): + res = [] + while True: + res.append(s.expect_re(content).group(0)) + if not s.consume('\\'): + break + if s.consume_re(_newline_esc_re): + pass + elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re): + v = int(s.last().group(1), 16) + if 0xd800 <= v < 0xe000: + s.fail() + res.append(_chr(v)) + else: + s.expect_re(_escapes_re) + res.append(_escapes[s.last().group(0)]) + return ''.join(res) + +_key_re = re.compile(r'[0-9a-zA-Z-_]+') +def _p_key(s): + with s: + s.expect('"') + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return r + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return r + return s.expect_re(_key_re).group(0) + +_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?') + +_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') +_litstr_re = re.compile(r"[^'\000\010\012-\037]*") +_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") +def _p_value(s, object_pairs_hook): + pos = s.pos() + + if s.consume('true'): + return 'bool', s.last(), True, pos + if s.consume('false'): + return 'bool', s.last(), False, pos + + if s.consume('"'): + if s.consume('""'): + r = _p_basicstr_content(s, _basicstr_ml_re) + s.expect('"""') + else: + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return 'str', r, r, pos + + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return 'str', r, r, pos + + if s.consume_re(rfc3339_re): + m = s.last() + return 'datetime', m.group(0), parse_rfc3339_re(m), pos + + if s.consume_re(_float_re): + m = s.last().group(0) + r = m.replace('_','') + if '.' in m or 'e' in m or 'E' in m: + return 'float', m, float(r), pos + else: + return 'int', m, int(r, 10), pos + + if s.consume('['): + items = [] + with s: + while True: + _p_ews(s) + items.append(_p_value(s, object_pairs_hook=object_pairs_hook)) + s.commit() + _p_ews(s) + s.expect(',') + s.commit() + _p_ews(s) + s.expect(']') + return 'array', None, items, pos + + if s.consume('{'): + _p_ws(s) + items = object_pairs_hook() + if not s.consume('}'): + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) + _p_ws(s) + while s.consume(','): + _p_ws(s) + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) + _p_ws(s) + s.expect('}') + return 'table', None, items, pos + + s.fail() + +def _p_stmt(s, object_pairs_hook): + pos = s.pos() + if s.consume( '['): + is_array = s.consume('[') + _p_ws(s) + keys = [_p_key(s)] + _p_ws(s) + while s.consume('.'): + _p_ws(s) + keys.append(_p_key(s)) + _p_ws(s) + s.expect(']') + if is_array: + s.expect(']') + return 'table_array' if is_array else 'table', keys, pos + + key = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + value = _p_value(s, object_pairs_hook=object_pairs_hook) + return 'kv', (key, value), pos + +_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') +def _p_toml(s, object_pairs_hook): + stmts = [] + _p_ews(s) + with s: + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + while True: + s.commit() + s.expect_re(_stmtsep_re) + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + _p_ews(s) + s.expect_eof() + return stmts diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py new file mode 100644 index 0000000..ec8abfc --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/test.py @@ -0,0 +1,30 @@ +import datetime +from .utils import format_rfc3339 + +try: + _string_types = (str, unicode) + _int_types = (int, long) +except NameError: + _string_types = str + _int_types = int + +def translate_to_test(v): + if isinstance(v, dict): + return { k: translate_to_test(v) for k, v in v.items() } + if isinstance(v, list): + a = [translate_to_test(x) for x in v] + if v and isinstance(v[0], dict): + return a + else: + return {'type': 'array', 'value': a} + if isinstance(v, datetime.datetime): + return {'type': 'datetime', 'value': format_rfc3339(v)} + if isinstance(v, bool): + return {'type': 'bool', 'value': 'true' if v else 'false'} + if isinstance(v, _int_types): + return {'type': 'integer', 'value': str(v)} + if isinstance(v, float): + return {'type': 'float', 'value': '{:.17}'.format(v)} + if isinstance(v, _string_types): + return {'type': 'string', 'value': v} + raise RuntimeError('unexpected value: {!r}'.format(v)) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py new file mode 100644 index 0000000..636a680 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/utils.py @@ -0,0 +1,67 @@ +import datetime +import re + +rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') + +def parse_rfc3339(v): + m = rfc3339_re.match(v) + if not m or m.group(0) != v: + return None + return parse_rfc3339_re(m) + +def parse_rfc3339_re(m): + r = map(int, m.groups()[:6]) + if m.group(7): + micro = float(m.group(7)) + else: + micro = 0 + + if m.group(8): + g = int(m.group(8), 10) * 60 + int(m.group(9), 10) + tz = _TimeZone(datetime.timedelta(0, g * 60)) + else: + tz = _TimeZone(datetime.timedelta(0, 0)) + + y, m, d, H, M, S = r + return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) + + +def format_rfc3339(v): + offs = v.utcoffset() + offs = int(offs.total_seconds()) // 60 if offs is not None else 0 + + if offs == 0: + suffix = 'Z' + else: + if offs > 0: + suffix = '+' + else: + suffix = '-' + offs = -offs + suffix = '{0}{1:02}:{2:02}'.format(suffix, offs // 60, offs % 60) + + if v.microsecond: + return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix + else: + return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix + +class _TimeZone(datetime.tzinfo): + def __init__(self, offset): + self._offset = offset + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return None + + def tzname(self, dt): + m = self._offset.total_seconds() // 60 + if m < 0: + res = '-' + m = -m + else: + res = '+' + h = m // 60 + m = m - h * 60 + return '{}{:.02}{:.02}'.format(res, h, m) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py new file mode 100644 index 0000000..73b5089 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py @@ -0,0 +1,106 @@ +from __future__ import unicode_literals +import io, datetime, math, string, sys + +from .utils import format_rfc3339 + +if sys.version_info[0] == 3: + long = int + unicode = str + + +def dumps(obj, sort_keys=False): + fout = io.StringIO() + dump(obj, fout, sort_keys=sort_keys) + return fout.getvalue() + + +_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'} + + +def _escape_string(s): + res = [] + start = 0 + + def flush(): + if start != i: + res.append(s[start:i]) + return i + 1 + + i = 0 + while i < len(s): + c = s[i] + if c in '"\\\n\r\t\b\f': + start = flush() + res.append('\\' + _escapes[c]) + elif ord(c) < 0x20: + start = flush() + res.append('\\u%04x' % ord(c)) + i += 1 + + flush() + return '"' + ''.join(res) + '"' + + +_key_chars = string.digits + string.ascii_letters + '-_' +def _escape_id(s): + if any(c not in _key_chars for c in s): + return _escape_string(s) + return s + + +def _format_value(v): + if isinstance(v, bool): + return 'true' if v else 'false' + if isinstance(v, int) or isinstance(v, long): + return unicode(v) + if isinstance(v, float): + if math.isnan(v) or math.isinf(v): + raise ValueError("{0} is not a valid TOML value".format(v)) + else: + return repr(v) + elif isinstance(v, unicode) or isinstance(v, bytes): + return _escape_string(v) + elif isinstance(v, datetime.datetime): + return format_rfc3339(v) + elif isinstance(v, list): + return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) + elif isinstance(v, dict): + return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) + else: + raise RuntimeError(v) + + +def dump(obj, fout, sort_keys=False): + tables = [((), obj, False)] + + while tables: + name, table, is_array = tables.pop() + if name: + section_name = '.'.join(_escape_id(c) for c in name) + if is_array: + fout.write('[[{0}]]\n'.format(section_name)) + else: + fout.write('[{0}]\n'.format(section_name)) + + table_keys = sorted(table.keys()) if sort_keys else table.keys() + new_tables = [] + has_kv = False + for k in table_keys: + v = table[k] + if isinstance(v, dict): + new_tables.append((name + (k,), v, False)) + elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v): + new_tables.extend((name + (k,), d, True) for d in v) + elif v is None: + # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344 + fout.write( + '#{} = null # To use: uncomment and replace null with value\n'.format(_escape_id(k))) + has_kv = True + else: + fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v))) + has_kv = True + + tables.extend(reversed(new_tables)) + + if (name or has_kv) and tables: + fout.write('\n') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..80c4ce1 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py @@ -0,0 +1,133 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at <http://python-requests.org>. + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +from pip._vendor import urllib3 +from pip._vendor import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +from pip._internal.utils.compat import WINDOWS +if not WINDOWS: + try: + from pip._vendor.urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) + except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b748f0296c083fcb439f5ed84cce1e037f2dad8e GIT binary patch literal 3496 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..488502ed2e67ded6f7bcde74d565637662db2738 GIT binary patch literal 559 zcmZ8eO>Yx15OvagY_>#Ha6qa!m}4cfP8KRsgsK9UN=T@JoGc-0yLPfpy<XS$E@b~h z{{a$LxN+dfFUb-90B26jrUU`DX7t`0J$uG}HXMcs*4JeJ&6gHJ-y5=Bz|jeWyAO#Y zig=5*c$>EQ4&C7$+TmT=<vrTtecI;%4fuc#c=#F}?5+bVE=%FOtM8nxd{$_DI-8y0 zd13KsnJ3ys^?v5Pc}$4e)JI!GRM<t`i=%iFjU~F*M)mN8&|3HmzY@~d_3d1oTwE)* z5jKYKsY%jI;5ZuBcb^w#W#uCCI37=?_#b<D1BUtb{v-bJ;p#I6@bVyB4;b^(E5X?M zCSzQ<)Jo%Jp+V>~R$2vMm$6D%cddfsyp)QA9x|4cFro##_XmqSk-uF^rb4^s@F8RA zwl|;w(BuLNpO9_Z+N7T)F;-TI7o<uonHP$~tt7YPe973<9qLCFf0!~;#bZC8E|ykJ z=7&c|WJZiMBdMKFlp4J=`t5^sSvTS)pn1&;OSbP!{u(DTt99@sFL<fMaku&MTaY@f G|MxF+9kPf3 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d3668e1cfbc0a0fd647e06abb75e0668c422750 GIT binary patch literal 1317 zcmZ8h&5qne5O&+1pP1}u6>-V|^^uXtI4lH`RfGs3Kn_F^yGUpx<n*{}*1fUYPIY@G zUJV=|4+2LnoH+6Zyn(Nrcm+;Ww`UNfr0(f1S65Yk-`DfW(NPkR{Vr~P`$ZfCf4a@V zB3gV*!z^f$!7`9ch9#@QWmrYasEU^{3*<E!%h4;g9Lceqyb6|MIXw&J$<?n3!iyG+ zHH%DX3#dhzwN{lT`Tl>FBu}y4C<%tU&&qau-Rj(`S{rT)VYxuyIqljCBtPUTJHG1p zSNj^tworM&B{ZNVuQi947NG))TEo`ud;`3IvH>*wZPQY?FqF4ygq<gUF}mbD>c`4t zO?T42v1(OmmClUCK62AYm|Uqmq&Q~|9XB4*@Ceyp7g+XVh{wC&yHMY>A@W`DQ?z40 zGukJ#j)(OwB!t-2AD^oYXf8NqSNek2t4ql3I~?Icpe(@{Uaz_B8gM?_BH<xu)gTzq zRyc$xBH?5nr+pr!X$xFazy=P<hcuw`TDn?-P?E6UYzsi}X*A?iR$#Z_=Y^tj#({45 zgR_T^AM;lGrfgjj#8d*e%D}=OoR9iM8KsRCItO&XphK!3`;yR)eKl|h4{i3-Lo<C; zxAvC+uT%WrUD}}92n*>(V7jJKL|0m2y1LA=yXKDma3kN(vu1O0+ph0kTw?j|`p&(3 z>3Q0y=9X`uEN{JR^!B~{^2#~=$Ovg!V|vhJ`kE#eP1hgWIvYT9q!UUrN3H8B7$s~R z#_W2Sgy_7vQ;ReAJEh@O@Bu9jDljt}{=mAKQ-CA|&`TlK<G{wx6THpnAbFy*;G00k zq=wPeZ=V8bv{D+lS`*ZY$oZGOT9c6J30Ofl+_RAv0!2<|%p&m|oHpdB9O1m(-{AE1 zM7HL60r~R<|FSifuiy~iGdLwVW$4=Sr=2ZGUnl$-C44rpe2Pv+r+ih{r9Xfpy7KvF zPv#>W(+cS?B<N=ki~)4&e1updPMq_`*Tan-IR%3MFlYVr(5NSWn2ucd@g9JTo}+(v zZ;^N4VlrbPOIXZi3~!M4$(;E%=97MsWwOq*tRD~0+DmW{qwCC5=g<77oZ}aL&FTHB TmTd_iU30bEed6%VC^`NIrIvmt literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7902bac0bf8545c558ce5f076ba984d1b04abaa0 GIT binary patch literal 16894 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 b=roTZ=~*;Sq{zkKRdYN=9>;&Gbm-p!J=M|- literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27ee3179982747872cc4e7bcf9a7e26ed8e38cfe GIT binary patch literal 6500 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 LWoe~+mHz$*(j|`o literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74dcadd5f70aa2dac644f14a42a7dbffa82dfdb2 GIT binary patch literal 8351 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d75f45cbd8b8b23491074caaf1ae961100dfb799 GIT binary patch literal 642 zcmY*W&2H2%5O&gCy0R!2Zk$FO5G!pH{wi7tp#l;T65;@Rs)Q_WJjr^S*kSCXT@DDT zufR+24!i`{9O1+(aKg!^2S)P9{^a@Q`(|Dq9B>xmhrILgXT;d={&5{~xSWRL?uDe- z8B>vp%czRa;)vm%+B=WwE>1AMVpmbb)Z_!3Pn*|)h7*2j(0P|+NZ#=;{{`pEwRTWh z)szT?z9HkluMuj(9EnhY!dy0`hgUD4r_j01q(@jaMwOVra*c$b9k-_3f;9-gzJ41h z`g=~c8XjXQ)G|Al1ty%o$zf|7kfC}9YE!`bQSAaSDUt=`mO#Q=ZJJ9^+IiBe#%pU} zz$<A2m*QwzP1aOs{9+)@q=9TLO@Tx6U_l$btIOe{SA2gC-j0q#2Zyz!V5{8nQK9M$ zk0$w_Fm^VNy6I5c&4j3=HbT6cPrH2~l+A?bZr8d_M2kjQ8m1jaMg8Xb|3+3A{!DAq z#(!rt3;2-!+B9Ho=$*Eb(%hB`$)y#gtBnxH?#MiC)ssxr?V|@iKQ1;@KFp6!PSRx> y`W<THye!MZ%i3H#&NiQWa5$ro^m_m4u>YjqcC%-@eLueyG`JffO`@CeEcypR>CXWG literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bde9e15eef535a1072974840ed51708f82f3415 GIT binary patch literal 1621 zcmZuxOLN;c5avUoD2kH&e${T6xM`}?mK-^mIy0S4r^%%UH=RjNnCWmR5|W_+1Pwq+ zltX_*FZ~hiq30g@OK|PU*B*Q7f|OG?H91&*yI8Eg4_N4%b~~`(`6Jo;;pc{B{b`)* z#|7{;4EdXFS($~b%+4HYGY2`g!7g=?i`{7r)p0$ucde}U+CknD*8w-mEFbyU6Mq5r zXp;pfU@g>QAqrU=wOI#sSQmBK3R+>SXqBy@wX%AHuCsNt&Nk2n+eDje3vID&v|Y~m zbcgMt-6e}Xv<J1D^dq*9_RCm657+@ZC~=E^%<iB&EJ6{xi|(>}=$>uiL-YxZ`}k9I zh##N__%qzY563S0+@P_8j`H7e<0o7E3Y9~8{68j!^@mEX*|llku)9@NhYr{Y+AEng z>7yHrhwmA8fpN(aetU(U-emut`60d!?7;$8!~P+Bf&17-N16N5>aD)J3<SQMVX0(4 z<*Z0l@Z*1<Ab52_WW;zjqd2-q@{D2`5ms=aqG|~l5lYk|B2q%7XoS@pjPvOGg}UH* zG>l+PuyjuQ!If#8o~;|{MIth+zPoZDaAn%4*VOgP8CO_0W_bmI@)H+yCUv+BR$g-^ zD9%%!VI54cDg=K^FeDkUh)0Veky7v6^kSUPiQqZIxzbzzuDKcS)wK_Wi$qAM3uu;C zxB+;|NnTFN0t9QrAj4ykOh8VzOp7m+Dq>2cf{=I4p$Y}$zf^+clW$-2YTAF6P@0S= zh&)e<0>Zj;K2s)g?YCaQ#t57}C#mWMq61qay2h*+vuaG!n7T2ZF>om@;Ty9CrdJp1 z2AfMOTE>LNw7~$GX3F_%f~Se-*<#nkT(M>5w~g5`fycTL#~DxKShosN^y4|sGcJTV zDecMyZ1WroNq8QUe9UzX5`^}MjElu^`90OOspPr#V3#Nv-AcApaSO{^B^zbX7-h9# zDezhfl-J&~QkB>+A~sEGE9I2pQ~^u*fxuEW2vI_}Ml(Vc$z$WxM+*f#1l>of#u_CO z?uI!#?Gosk8sz}%W6Bey+xd)PLDE<)3Ru;K1U$iF>4p{4e$_smrMJ9ox@H<h>=~Y+ zfpGiGp-AlzuDdsw_mffjizUvCEMxvI28AH=MB%|a5rZ*@78G*8#9%ay<1_gr|6-m! zPUB)eJW=Db$yCrs<0ns_4qgr5B#%ih74+Zn+aiB+noi%DU^$jYJh=Wl7*uz=Uo5o$ zWp(?%GRGyKgQ+>8<2O7vbi=0a)$Aj8-wtgbMriN2HM@EPJ8(Sv#5Qx)yWvzbKIHxb DIdRMk literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fe1c5e7917c3f73f5f3eaaa788c0f50bbf9621e GIT binary patch literal 18796 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..341ad1ee64203d962f92ad6c80c416ef2a6f858c GIT binary patch literal 5514 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1704103c623c24bd718e08555af6245ff5a2e02 GIT binary patch literal 2695 zcmZ`*OK%)S5T5CI?s)CB9b!;Gp@Rs{iewk^AP*2ii2_PQY%5M6j6kFDcCUBVvptiZ zUMFkT5|VQT@dI*5j_@1!0US7SL7FS4{DqvT>X~&O5<A;H)iu>s)zwvB_tp9Nz<}Q$ z@v$GC&l|?SIGFu>AijWB`~@8|LW7x%q~?f(#6;Rkt<chMJGAxN2_5}*Ll@q5>W%!+ z*Rl@Kjj*9<7w8}ifcBW5&W)PkylG4pVMZfe7`4KdX?$x4Y8!lUCy>9I20qLRThNxE zEq`Z-<$IL}OTa--mcwNhu(?M@c!V|CJiOmv3#<k2qkM%e?hyGWKYF0`Y#QyQz13S8 z8>gK1GNIx`Bx0Lxjkl@fc_tMd@HFT0RMGA{gQXj7vs}n!B2?5Li=Ij{u?8$VVIqdN zH<oFdY@I{0H;5(U>X}*1nv0@cE(@3tMew<iPqLhgqDXtF7Jmeq4ec7V;uq+Y@x**; z>>E>9A9#HX#stQu7y^d?=X+);YiJK0-MhN?`qm1_XxeA?jwK&4=SgE)bGFG-6EvIx z4K8R9hdNh);{oTVLypb-eRFC|VJ{vNh*S{&18cd>)mRD|Q<n4;eUPXDRRc~pCTfrg znvC+4k2nMpLqlW1XuaxA5K#DS$ZR)ZoNi_HL=lg;mP0MIEY14=uT-n)jim%D>4eI$ zz%A?0FEdH`!x$YnO~LlH+NHCdi=7KJL0{7pb`{;%I(}S5+pAaTYAw2Yny%I!AXiUZ z-LD<LGe`<L+jIILlRE|7;)QzI6fSpTvN5?r6G8J>s-!ngV|f~_=Q7)hx6+9=%`#qy zRd5N^&^|bRvkD(jH)JL%&tXYpaF&CzT`-hvS1~OH**Iljo3c!Btxjc?rfjTq+<F;A z2X?0z#5tb@vzI~G(H3k}!D*hx3Pz)%qg9k%9fZ=x73}#Zi;n)6PCpTGS{kKWIavlT zTr9o2Vn<{TM4Oa0Mzi$l0JekDpP49+=6ZS2tJwjCRI%$RrBzIdaw(tWlfzO;L_aH? zQ9R5fyb@8pdNM1UlBYZ_pxfnXX%DjmomhCy#LBDVncm+Fc^nGtx#&VI@5YLEcVpS@ zXDNdc?T%!3YZyhBiVNc6E<4|g^4+r^ss5$yp-eySU$}g^d#9Tx`I$r%Do)cg4|DP0 zTyMCCOx?hYV43Vnet!%*S9B3XI{Bn*y%vIFSn3oyW6meO8JIpiuGxggHWzD7Kx`sW z=nyFyI02eQiob!FtW;Q0)h;t1lYPX^<F=tJz|HeDZW2bSZ-AQQo}ugmKnlPRXXqy8 zJ^{+pl*Mf3Fc-Ag%9m34Lzj8bH-^Cq;0E$Rc1|^!&zu7b<~n*je>is4!Z6tPm^JkP zgBtR8=1sj7u*w{e_7PR4zG~sOsXZlAYwAp0(6N{x+60I;dmnto1(&cnPym>zRr+HF z$1eeN2X@_s#8G@ydUa077Q{p@LANHG(6@;ml&u<aXKAoUPCk?#3IuW)r@RAQ8C2RL zz~-<uE&yDjL$D43x7Pu;H#fhQh}F`;8O@%Y<SN^iaXy$x3t9eb@7qh2>Jupa9)9v} ztY4QBN|Yi?Ye63>RbH(<w7^8Uvc7SB4T$KQ>$f*=tgl6DcW+(2e!KLxIUuZ(@+3~w z1}$(`;xSz=&P>mi*=~gMvs#QWmf?}t%0e@n_2E^CH0$%L8bPVfVy9)7US4q}(!euN zlk$CVBW%40W5vaa(`6^$MK^6!^eIrqCFl%7hzlvdK!~|uxljs$MNA)39}2<3$0cvs z#Kgzdy{3sg19N+*VD@u?xCX7j;!=h(heTNi`ohAjpREHEE)X^(n6ua3fYU%t&gk=8 z11FyQ=+-RR;)34XTwm+ld4`8GWLl$uJ3+L=0jS(WFgSwN+IHz^4FEz#CQ65mM|q+B zs#g2@x<_!yxQ`B^PJ_tv(3gG`As_ArZ<byZv8)$GWe~wF1CM|xk|-?CVy83pC{iEd z%sD`vPK`J^6<#E!PJW%>@-&EsZ@(nksdu}B*B+T{Rk<^FV}!S!DnC!54V_^WDU9@? zvk3O!)r+-hN^h+H*+^fgKF6C+frf3f30S5dg4ot1P1xo|a{*A!HUs=-`6v8Oe8)Hc E1LSJ#TmS$7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d6bc2ba05b981588dc2cbf442eacd737a0a36cc GIT binary patch literal 989 zcmY*YO>5gg5Z#qz*%5W2rBEoPY@rkkiPf*PNeH1IITTWoQU?lwplq}&Td}NFb~jFJ z<X)0<FZ~1UvB%!~OLXmT=q0DlZtNx*@kXn+qtVQp)!Sw>Kw!V=z1_bKLVwJ|%-|Wl z2B-(%7}`M$ckvEp4s*}Yj>9}wgS*T84r<lMzXHh*kGRsR-4mj(f-l!B2)28vA_KvW zGENF9hAHEU=pH9AE$Dulr8)&75z>;Mrpbs+M$|}YK4=HQn;}gzx(_+*#!3+E?Mbc* zkt@Epw-OMrZAd!fNSEhaQq37jq!<uNrkUG8)tCjv(BOYFZNCGko8TC<dxkVxN2eIt zbT?x>4K!gMpaW31!KJ7~yTJr^QHj4fhh7K$MAAgHoXTlGscL-4b8Q*x&P7<rbO@z| zLn^~WWQ<D{4rI805JgLBF@H5=FXE^eK6|2*rS5^uo+gXS%i(rdq{Tv-D^0U(;iSlq zpT`GdLs~@e875>n8%Jn`Y8RvPV3nn@j>Vu@GX*PCoR7v28Bgd@rlX6%)l9@RQ)}(Z z=oYSO@3*!#I+xX7tZI;<YF>N))+{r^vH|PZ1!v3$7{N9G>La)k7k-K+xWwN<x*yoA z<OdC&;ZsLGF5$RM@X4bRucO`j6R-42C&8ur6;EnqjXC`}IbYT$&f)xLR61rl<Cp8H zDyWWoaFVD!A;h$tik!+35jl|E6!alQ%41GMLKxMwT{WTzdd{L~6Ncq>xvuIxs;Jho z<yUT>kE)s#r<yaj$h=hf{bMS-s`3m~1y((~b48@7KGULX$X(O^9dO8L-~f97A8-RV t;F4x8n=P-ZM-dZo6v;XeR!6&aCAArzwD}vW7k|}S6DVb6#=hI|{{d~D2QL5s literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e814d045aed375b426ad89259af396833fcf68a2 GIT binary patch literal 24117 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 WIkXW(lB<z@BQK7A(fFcq_WuCjmGtlc literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41565decf9a68d7439500ca6ea7bc1dfc4c45cfa GIT binary patch literal 519 zcmYjM!A=`75FPI(*>ovUdTB%tz30HXEkOk-LKW(<;?hb;D<R9QC&a<ob!=w|IrI|s zKiVT-&`ZC>S5Eu_CmbLZBh8!f(~Rf6<L&JfLj2?J&i+OKx9i6yTA}$8(*6t}KoA8v zEVPKe!r3?{B1Y1KJi-{G6~V>|kPKn*4Vws)){2CwqddU`qsz#iVDh_-k!bYb4>5zl zz7p|@2=Xi1fjnJrV6p@2Dw>$~U<k9pDa<;j;qG_nx9)-lIO)eenH#0#`JQh`QF5OY zV{Qbx<!dc<#%e4@Win5)<@=X}!Py+Gvzg|_CBHzM^|yR%udPp>8Q*={MZq>q%9xz$ z$~eY+OH~C|);E;2&L`7K%oSQ6hsLMYapUZjbYmYYEPZEQYJ(%W2%m+48!&Hz`bW4o zR2x}yhqUH~jw&V4SUNTIe8Sj)-7i1aVo)$$fBN7?2Nx5gK92Se59tpY{Ormy+)`?H tq06hiVzOM5kNNDJZj93ZM)kFC51;fNks!l%0<@bcX_HReC2vWWJOH~-n}GlT literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31dd0b2ccaf6d27de25b1e9eaf6692279ab4b252 GIT binary patch literal 19437 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 AT>t<8 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe3e7c331c1a04201d2b5c54493227fee6a82657 GIT binary patch literal 4175 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 KP@(J%jsFj&3P1?} literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46b29cb34389ee47edde9134a5e54f052a6752a9 GIT binary patch literal 4388 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 ON=Yq%V{O<se*a(1wk-<) literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f92fb12f2e456000d670f1010a6531ae15d44b32 GIT binary patch literal 22048 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000..f5b5d03 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.21.0' +__build__ = 0x022100 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2018 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000..c30e7c9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py @@ -0,0 +1,533 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url +from pip._vendor.urllib3.response import HTTPResponse +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.util import Timeout as TimeoutSauce +from pip._vendor.urllib3.util.retry import Retry +from pip._vendor.urllib3.exceptions import ClosedPoolError +from pip._vendor.urllib3.exceptions import ConnectTimeoutError +from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError +from pip._vendor.urllib3.exceptions import MaxRetryError +from pip._vendor.urllib3.exceptions import NewConnectionError +from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError +from pip._vendor.urllib3.exceptions import ProtocolError +from pip._vendor.urllib3.exceptions import ReadTimeoutError +from pip._vendor.urllib3.exceptions import SSLError as _SSLError +from pip._vendor.urllib3.exceptions import ResponseError +from pip._vendor.urllib3.exceptions import LocationValueError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + get_encoding_from_headers, prepend_scheme_if_needed, + get_auth_from_url, urldefragauth, select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema, InvalidProxyURL, + InvalidURL) +from .auth import _basic_auth_str + +try: + from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session <Session>` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response <requests.Response>` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` + + :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7, use buffering of HTTP responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 3.3+ + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py new file mode 100644 index 0000000..abada96 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/api.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request <Request>`. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response <Response>` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + <Response [200]> + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..bdde51c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..06a594e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from pip._vendor.certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..6a86893 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +from pip._vendor import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +# Note: We've patched out simplejson support in pip because it prevents +# upgrading simplejson on Windows. +# try: +# import simplejson as json +# except (ImportError, SyntaxError): +# # simplejson does not support Python 3.2, it throws a SyntaxError +# # because of u'...' Unicode literals. +import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from collections import Callable, Mapping, MutableMapping, OrderedDict + + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py @@ -0,0 +1,549 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..a91e1fd --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py new file mode 100644 index 0000000..3c3072b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/help.py @@ -0,0 +1,119 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +from pip._vendor import idna +from pip._vendor import urllib3 +from pip._vendor import chardet + +from . import __version__ as requests_version + +try: + from pip._vendor.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return {event: [] for event in HOOKS} + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py new file mode 100644 index 0000000..0839957 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/models.py @@ -0,0 +1,953 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from pip._vendor.urllib3.fields import RequestField +from pip._vendor.urllib3.filepost import encode_multipart_formdata +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + Callable, Mapping, + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, 'read'): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request <Request>` object. + + Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + <PreparedRequest [GET]> + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '<Request [%s]>' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request <Request>` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + <PreparedRequest [GET]> + + >>> s = requests.Session() + >>> s.send(r) + <Response [200]> + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '<PreparedRequest [%s]>' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + from pip._vendor import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response <Response>` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response <Response>` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest <PreparedRequest>` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '<Response [%s]>' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..d73d700 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py @@ -0,0 +1,770 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + <Response [200]> + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('https://httpbin.org/get') + <Response [200]> + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request <Request>` sent from this + #: :class:`Session <Session>`. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request <Request>`. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request <Request>`. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request <Request>`. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request <Request>` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request <Request>`, prepares it and sends it. + Returns :class:`Response <Response>` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..813e8c4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from .compat import OrderedDict, Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '<lookup \'%s\'>' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..8170a8d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py @@ -0,0 +1,977 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {'http': 80, 'https': 443} + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '<local>' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '<local>': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) + pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py new file mode 100644 index 0000000..6d1e627 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/retrying.py @@ -0,0 +1,267 @@ +## Copyright 2013-2014 Ray Holder +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +import random +from pip._vendor import six +import sys +import time +import traceback + + +# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... +MAX_WAIT = 1073741823 + + +def retry(*dargs, **dkw): + """ + Decorator function that instantiates the Retrying object + @param *dargs: positional arguments passed to Retrying object + @param **dkw: keyword arguments passed to the Retrying object + """ + # support both @retry and @retry() as valid syntax + if len(dargs) == 1 and callable(dargs[0]): + def wrap_simple(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying().call(f, *args, **kw) + + return wrapped_f + + return wrap_simple(dargs[0]) + + else: + def wrap(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying(*dargs, **dkw).call(f, *args, **kw) + + return wrapped_f + + return wrap + + +class Retrying(object): + + def __init__(self, + stop=None, wait=None, + stop_max_attempt_number=None, + stop_max_delay=None, + wait_fixed=None, + wait_random_min=None, wait_random_max=None, + wait_incrementing_start=None, wait_incrementing_increment=None, + wait_exponential_multiplier=None, wait_exponential_max=None, + retry_on_exception=None, + retry_on_result=None, + wrap_exception=False, + stop_func=None, + wait_func=None, + wait_jitter_max=None): + + self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number + self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay + self._wait_fixed = 1000 if wait_fixed is None else wait_fixed + self._wait_random_min = 0 if wait_random_min is None else wait_random_min + self._wait_random_max = 1000 if wait_random_max is None else wait_random_max + self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start + self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment + self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier + self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max + self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max + + # TODO add chaining of stop behaviors + # stop behavior + stop_funcs = [] + if stop_max_attempt_number is not None: + stop_funcs.append(self.stop_after_attempt) + + if stop_max_delay is not None: + stop_funcs.append(self.stop_after_delay) + + if stop_func is not None: + self.stop = stop_func + + elif stop is None: + self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) + + else: + self.stop = getattr(self, stop) + + # TODO add chaining of wait behaviors + # wait behavior + wait_funcs = [lambda *args, **kwargs: 0] + if wait_fixed is not None: + wait_funcs.append(self.fixed_sleep) + + if wait_random_min is not None or wait_random_max is not None: + wait_funcs.append(self.random_sleep) + + if wait_incrementing_start is not None or wait_incrementing_increment is not None: + wait_funcs.append(self.incrementing_sleep) + + if wait_exponential_multiplier is not None or wait_exponential_max is not None: + wait_funcs.append(self.exponential_sleep) + + if wait_func is not None: + self.wait = wait_func + + elif wait is None: + self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) + + else: + self.wait = getattr(self, wait) + + # retry on exception filter + if retry_on_exception is None: + self._retry_on_exception = self.always_reject + else: + self._retry_on_exception = retry_on_exception + + # TODO simplify retrying by Exception types + # retry on result filter + if retry_on_result is None: + self._retry_on_result = self.never_reject + else: + self._retry_on_result = retry_on_result + + self._wrap_exception = wrap_exception + + def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the previous attempt >= stop_max_attempt_number.""" + return previous_attempt_number >= self._stop_max_attempt_number + + def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the time from the first attempt >= stop_max_delay.""" + return delay_since_first_attempt_ms >= self._stop_max_delay + + def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Don't sleep at all before retrying.""" + return 0 + + def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a fixed amount of time between each retry.""" + return self._wait_fixed + + def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a random amount of time between wait_random_min and wait_random_max""" + return random.randint(self._wait_random_min, self._wait_random_max) + + def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """ + Sleep an incremental amount of time after each attempt, starting at + wait_incrementing_start and incrementing by wait_incrementing_increment + """ + result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) + if result < 0: + result = 0 + return result + + def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + exp = 2 ** previous_attempt_number + result = self._wait_exponential_multiplier * exp + if result > self._wait_exponential_max: + result = self._wait_exponential_max + if result < 0: + result = 0 + return result + + def never_reject(self, result): + return False + + def always_reject(self, result): + return True + + def should_reject(self, attempt): + reject = False + if attempt.has_exception: + reject |= self._retry_on_exception(attempt.value[1]) + else: + reject |= self._retry_on_result(attempt.value) + + return reject + + def call(self, fn, *args, **kwargs): + start_time = int(round(time.time() * 1000)) + attempt_number = 1 + while True: + try: + attempt = Attempt(fn(*args, **kwargs), attempt_number, False) + except: + tb = sys.exc_info() + attempt = Attempt(tb, attempt_number, True) + + if not self.should_reject(attempt): + return attempt.get(self._wrap_exception) + + delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time + if self.stop(attempt_number, delay_since_first_attempt_ms): + if not self._wrap_exception and attempt.has_exception: + # get() on an attempt with an exception should cause it to be raised, but raise just in case + raise attempt.get() + else: + raise RetryError(attempt) + else: + sleep = self.wait(attempt_number, delay_since_first_attempt_ms) + if self._wait_jitter_max: + jitter = random.random() * self._wait_jitter_max + sleep = sleep + max(0, jitter) + time.sleep(sleep / 1000.0) + + attempt_number += 1 + + +class Attempt(object): + """ + An Attempt encapsulates a call to a target function that may end as a + normal return value from the function or an Exception depending on what + occurred during the execution. + """ + + def __init__(self, value, attempt_number, has_exception): + self.value = value + self.attempt_number = attempt_number + self.has_exception = has_exception + + def get(self, wrap_exception=False): + """ + Return the return value of this Attempt instance or raise an Exception. + If wrap_exception is true, this Attempt is wrapped inside of a + RetryError before being raised. + """ + if self.has_exception: + if wrap_exception: + raise RetryError(self) + else: + six.reraise(self.value[0], self.value[1], self.value[2]) + else: + return self.value + + def __repr__(self): + if self.has_exception: + return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) + else: + return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) + + +class RetryError(Exception): + """ + A RetryError encapsulates the last Attempt instance right before giving up. + """ + + def __init__(self, last_attempt): + self.last_attempt = last_attempt + + def __str__(self): + return "RetryError[{0}]".format(self.last_attempt) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/six.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/six.py new file mode 100644 index 0000000..89b2188 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/six.py @@ -0,0 +1,952 @@ +# Copyright (c) 2010-2018 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.12.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000..148a9c3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,92 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.24.1' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30f06ba553ba33b720aa0388bb488166a74a1581 GIT binary patch literal 2124 zcmZ`)-ESL35Wf$9oIjH|Nz*udTnnKwG&XHh(V_~q6iO?#QPj8s9YU*(cWs}$_tCvQ zr?%235O4es32*!l{3Z9wQ~w2?m|5FxpyEzDo|&7Sot^p3`0HA&Y{2s;ZT|E-aDSn& zc=Ev9g_Z1?hQSQaU?#JK8CafWB5w=ZvssSiMJ~vD`Jmtxf}&T1Z#h;FPEhhnnlFlS zQ1L37cSJR)d9|SK)q^E(N$W~tIau*lG+!2tVAWgId_}AU>)yKNtKvei;caNXCN2h> z-X`!EL(^-*Z(THlEpH2SOWu2I*?XU@cptEa_aSedy8P0ad3u>|{cN0>roo$|kNPHC zWoy5f-p4;~aeK7Q)_H043A?~HezU;>H5Wm1<sHq=JDS!TO=<Kg_}yep@cS9F4~^E= z^j0~QLik5F++DXjl$^5Ng!Z}Hi^7oilplp|97Vzp2QCenEBS7kfY2_##wxVTY>6Hv zkw_IMeh^1e?Z1X%7%e+%JnVK4?!R$!0A8|H)E)j;`SvW*mr+0<B5+*hFMB-32ojJs zdDx2>CqXKdA5*DFKav5Xio#J9bpC{fbiid+J&@7M$wI2fD4q9P#TcIQBnHPEJXZty zoRcBkoJ%~(8E{30QKEn^cKv`yDYE&eT*(PAmHkwRhmZ`x<#gv>$RwY*2k<c(yE~u; zu^nsiZZf3P=(rtn)ynKAkGj*swf6PB_O(`B<{(KD0W3>M5ahCoWEsg4kZgrAMiK>K zNg|>F+)Wlxzs&rE9tlp4sSKeOiF9yJ9Z3yI1xOF8fR7Ce&$$mPc>qKir>3&b%vUCG z_L=d@I<Zc3z~`BH2Cr$Hn5Tsku+UubM1vA^4zpk%wAP6Q(6Oh#mR)!rauIXsLN(kM zso#4pCN9LS@!}pT08}u~m8&9G4Y@nJO51&w@O~<AqxQr2Q92lCXlWVJoysuLTZXf2 zyR@(1sJVMzwYA}NdwYi_0M&rE5_fw?@G%!5ol5~v5`aZ3nO?oe7-ueZXDQWjV3-T% z5Z)}bFWv2=RmzGefk9RRKs?s@&m2O~Ga*^+Uw6x@30DsQkW@j0S?MiXhG^#r$Q&?w zjL~IzeOo|oUPqf1W+!LGc`$z%@)DHl?-!j|`eUkiXG~?M9|^>0Cy<?^5h1sdo8cE@ zw$~%^`1<Fne`_$3;#&Xa?c1GhC-&oAKTH%AV)tbn9^dGVrl{15jCsf+*_pR~hY&yX z6(Q|-B3I$uJ;Vy)$taag$6Pkc@K#OzEh|uQOeaYfTA@JW7(8V~#`_c+^9|?_e28!j zIz%*rj+p=@oXj)$-1$HF%;2pNB!s&dPYbZmik=nxK^RHC-?B1i@d>H`Gf42hFQ5t# zpVNcX4I(+w*_@Hf5RF^|@&l~I0%GK}+`5_-31LwWs#_+cp921%(h^PN6(Cvt?V!S$ zc&>+aUmCKARt_A`W0)VhEwc)m2D908uGg_gGe^$HkZyginkrwkC4Z4}*p031Ia&od z(Ct09K&Zn|(o@1K&o{wvn$3=N*e6%eJ=}t(Y8XklQH2oU_c)BanJ@+*!Ds~mE)5`o zi(bHu8%VZrcmA7izkc?euDRSn#nK_~rP5cE?`Lx-TR%*XM(`(bPpEz9iiLXP5u5^+ z{6J6z?Hw#WtQ_t?dg3Se|FKY2a2U@8U4?U%!VZvFuFSa;L@X8jD;#DCqBCbzO~+a* iQ~{Q2u;y>hF{@V2gxAh3H|+YVRcu%d3qWi&?0*2j+Fg+V literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71ad34aa1926c8ccb0d585d078d538192ef7ea7b GIT binary patch literal 10688 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 Pn=dkJ1i56*nNR)?XD8U{ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..900a8ab5c4746712d336f93dac61febca34f454d GIT binary patch literal 10157 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c25d2329f08c21c05efcf8ec18dd5b02527ec049 GIT binary patch literal 23662 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cdf675a973e7c16a2780adfa340ba057e5ad71b GIT binary patch literal 10409 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 CB?k)t literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdecc0f76beea3bdf08830bf07efaa2ad7950d0e GIT binary patch literal 5877 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 D^Ls(M literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5b88ead3c3a8a3700cb6995c02a6e2de165b789 GIT binary patch literal 2769 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8165fe4452aaa44d5e813a3946369fda2805385c GIT binary patch literal 12729 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 E1A2M%$p8QV literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df73bfc96aab489b9adce136b70f2c7159d50c02 GIT binary patch literal 5591 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 BY#aap literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5031d4f5e0ce17985a1fc2b333ea0f92358a2370 GIT binary patch literal 18756 zcmeHvTZ|l6dR|p^^<{c`hQr~VlBg0zNt|7>$(6L0#MNpkl0%WUG~{w-m)ddGJw1J@ zXL_b@I#o?_8qJL%D%j1&+Q?3_jxPa*!Ny6DATb;V2o^z}0wWKBADkDbk_Q7ZVkiiL zAPx{fFV6S<r>gqG);jAv<RwG&sj5?_&N=m;|N8x>cx7&`XyNZ)R!@F=Mp@Q>;zjc3 z;^Z=Z!PB;7DNET+t7Wg-HqV`=)5@%8<UG@K*Im?Qn%VWN9CPbA9NlKVRal>qHd&k( z*Jp8_Q~748HMc$|=Y{5c>%jVf*24Ni>)`sq*5dkN>(Kh4*5UQTtt0D4q|Hq8XzSSe z@z#m;6LMW_o@_m}j!B`f+2%8?Q|qT%&#pf!*QKV{dT#x>*6H=rw&mycpZCu^w%1>H z$5L}@{v%7x`!7DqtiOco18M=+3vzuH*9X-it{3Hc3D<|zVO$@U>o2Gy>gY$-`WI1u zOdUu4aX-6r4n3V$nN@4)#HXa$k{unWZU&uZFZ3&oR=1-=RL$2q?a+S^wyN#wmakV( zl@A*&ztiL0tgm%Pe+mNg@%bBTYqxLsRpskzjas;rkB(pIsJ)d=cq0tE&Bo@{PODoD z8=Fl(n!Bw#VW-w<F0+Sd_L^VoDBoNx+(92}W)M@ec*hUAop#`(udCa=_O7p@`J3$; z`fK{3&-T&W&Gx-&v!TocmYk>*gu2n*s)T!8KZr87zx4{{IJ=FhRBFwJ-wx4cj#FNK zQ1iQCqtlK`SE_-(y85n+$}So~rOxJ^03#m4m5wJ;2|JZ-3|k}Vl0OG0m+=eEpzy7A zTUqOlvXukkXH-VHIJzpUayVvH9;7cs^Vj@(vl{w_0J=t6@{dRMcNM?jBno8@tO{5c zr5!r^na38+z_{oov$FQ5Xkjg7qhh7r&_P%U^<I>%sA^b^+&)Mj%_&g0)y4dS&gM?! zR#1W-Zs0fT|IpH>@c3sRT<Ge?Jxu1py{f)Y?=-QJ!G)H-u(?yIydHeH{n|bCYOT_} z_wvQC{`%IAZhoo$<u~5Auy&!_=$>!1gRt6co`2A7-+!gH(`TjpD);=h>gWqS-NZ~@ zxscGX+}(=`l}e-C2rHH2m_U%@Ti7}L>mM7ZOF3y*BT@LrV+KDVPzfg?2(n`j>_-kr zVy|HN@>_mb4MVM;#_c6XKZ8T$wyP~)-q#e*vU0XkiQ85xY!%2TcK_rPvq+nz6X7Ig z@so*sf|G$A6bAMxr-P;Ar1qVG{a9*TYbP_XU&HJxnLTfK@1Zkr^!0d+xw4r7Uc<FQ zcPG1B)Ze$k5Ks}q1EIU0Lw$bMddzFPUm92#0X=gJB~QO^eamV)@8b%@a8|A_6*MU< zl!%H$UeG64Oa9VX7EhswX5M@I{mR`dH`i8|GBMGFlS;$qd^JHrO`iAg3r?f3Y}a<3 zoLzF}ZO1O*ii_&n3n&*@<MdBVkapPj%2JMe!F8%sz|oafNA;RKFI6fZ^r}sBM{_j& zJPVFJG9NOt=DO;mDEJf3DmaB~AtQA))TMtEwafSgq|i`oA+ip{H3Ly~LBwpd@J_$c zy(WrEuY$3B%_lXP_EYi;=B>}NW{JfYP(-EcH}9;jRo+{E@5=I>Xzte9jpaM>)oN5) zz5DjN@7}swx%T$j+f%3iMfC9+e)04{Q(LocZ2BDfG8_FAT4#3TRmN0~i;jemNyE_E zx0M}QJI*n~Y8kR4SPu44*y_^-v|7p={vqq=7g$i-WS;sw&Z1leiXrruY~iJm7nLRQ z(Bv|H0f)BiMZ14^WO9EIx!2F3qfwdHr&%FfF=P!g&NciJQ9m|5>XUNL`4#XJ^85%V zq4mgu+(N!XXD74k1V<tHr$Tq&Jc1lP_{F`$1K!Q<=P3QJq3vC({W@eizf*urH;qj5 z`G*<yKv^E}Y-ZQd^`xH<V@YODJH>}kaKVSkJ+|djVSaxW3zgp~#S4}Fz`L8szWx&C zx-=KfZ0?1ARqN`Wei=1pfiB=I%JNQNmhB904fR2p_h)<U9t@zE6VVW|%uB9W&llMw zqx~?Nhk3cz==1`!;FA<**YDsLYY1wB0(606AEsV#3U(1c{&S`5A01thG4(JZX8$Le z;35Woi-S{Kp$S}Q0@h6zC5rL5CQunM-Z0-{yx|Apm{SGF!Aw+ouh$G4v1+Iuf?6ng z_`9w<E$`0ttFOKM%9k!l4Qp@Ky-wTrI@)V>wD0+FV-)<9z}v3g^Sw>qZ+q1)+$CRm zVaKa_+NafqzXI2((>~{g+kV;?s$rv1RSky^ZI5>P-Zxg)ye+@&Ylt9vyGnnq9iCr~ zhfTYpH-oO~4Zn$j*<rI0gaL>1#0hMNIGUL@+EU%od;%Buw;Q$Xv?n~V=iT@5Zt;7R z<yLAisjw(aB1p!yp^G%I_u+*<wy#-_#H@*qaaU6H#K&l(R`C;6y#-76?S+R>P<YgS zjK_Z2`2ea~_>SHiZF+@_gK0)tx`SO*JLQX!-I`#|&x&vIb?G9#wZ#EATF&Y(jjn8} zjLL5|JGE*vcnc@VQ=i%A(0Mk%%7xKPGHj5z9a$JL$k>Du@-Rw08P2l%N2U&!l7RMx z6BEkK;{-|pPQeN2>BmMRi%G(mmvJ-7)|<Ux`*ZZ}6|`vJm*~I6v7zP3bj31gm#)}p zTs(N%cw3LKTHl_h^I}|_hxP}hyI2lL1w61!RDeQ&4+(GKGM*AU9lI1-)P_CPjcB5+ z$f*UzFb`jFY-*#LAU~lAqI{*II<-p0s06;_=Q{_l<L<XP6t#LG?>dDHlmcs~6P)^s z9@uV9FYxuL<p=P{p{-Aa_9HAn=&*!8uBmDwcMA>!-j`j9vJu~dUN@Oxk{8}!EBpe9 zX{iFC4s(uXeGR|#ZvkhQ@e9s@A11Zb7JU{8GE`m_wiwgiRP*Y<M>e$8f;tGTl~;@E z5RL_ZMjcj1KEjKv7jb@69h37}bzGgm{gOJVp2BfXJ*}R>abBHL&*FGMdFnYF7u0F> zJdOwbMRi8KAkQ9BKdW9;FJZL9>gUvw`U1|5_(#<j)j7F;Or2L{Jab&Vt1hUExO+l< zNxh7klj;@qDvnQKCSO)RBdwoSuc_Bj_l$Z&UBdB{`igoJ$7j`7)mu1v>TBvUj?byL z)fF61tE=i7j?b(2)Uvvc-p{Ca)D6_Upo&<Sm8isk?@k=VReubo7Tv^JFR2!FS8YIL zmWy)tO0~9ozp7Pmp8CN=u++_rB@xlQ6nLY(dYipa)FZUE1g+l2#wOz6jSa66NPo=^ zRIT!=Z4gqllY&J!uY3gA3c3^qfJ%2`gHAV|>grC{*Wn%>_o}rTA~;`_J#TG0?ylCX z27%mc1|3X3o#OpQxGi1X-V3)oZ4Yi(Tj4#R**A4n?_uJXz=@YO8l4T9m~phv$;@ii zwuh<IXp+28`!FAvGG+jSR8>_3@g71*zZTK}q(<UF=ymG2tcKEIUBijL-_g4<C6^zB zy6SbStcL#_cy*Y;O&^vIZiDvPoe*y;#*V$l^evB4_mWwXOVS4$lbDs*K#dvMHQn>Y zT4KUxA@IIj2=9KQ+2mWrPvgB*k5B;@9#*1PqoIvw91mpH=_iaMeInTOTV1SvCtg?~ zjEuPnWP!`f8X*l`ftTWWpHG~Cmq2ow;qk#cy0O)0SDPvNFnrIuhFicHqeSxVYnWcz z<{-8G%B#~I;i?+89V2TxC9|gIyhaFWVS0$&iIwn`8tq!Mr@#zg&SXlmfXd(OZF$|E z?gA$X%HB;pJM0k6_5DWRd&Y|#e>J#`y5R@I7g|H-ab+Th#s>kDhu$UO^-CMyiLr!o zFKjf+Y`<5&!*XNDdnE9EFf3iyWPv$#?SIhogK&HvejA)v^OFUxH2wBgxILWKvbir) zB00=`ueR;icELGik4P6M-qURix4Gv9zJ}@ZT0Km=RSie{BfwNWP_Ul*V(-de@zR6z z^+X8D-mQds=R92{5q;ui#-Y;JVFaSQG5}KJJgh;Z%;ExzS6IA?BC=M*D_FZ;JBSDP zcL=}Ko-d#c%$Wld=IBL+EET6+3~h!nJRdMH$qZbS?tsx>c927v8x&CH2XiP3gL#yI zU{MyOoRzXPV0bbou*LiUFh%9SU;*XAz}DZR+ZG-S7wZnj{oa6M%?^qv4-IBf9uAKT z0G;99kK|rSaUMsd-(&E5oc-gpbB~?<6OXNj2Z_vnWDO4PpHv0oLq1$oGlNAK>pxcP z^(a7+rv?WEGI@HC|HRgq&(7>8cEIB^gMym<Smq#pXUWhka;faD_YXpCwS&5^Q%Ti7 z3mT?=f`bb>NdbQZ9N?MGGgjNT9$Vi8a`S;B-NGrd^(EYgi}n>9q6{Q|!V&mv=1uzR z54!rTf5YzBw`=v!jtclRPc(VR_#XM1!AaK$%#LfXrBhL{5eQrd^{(@rN8ae2Aj&aT z?*&nwej72-94HX*NdLJO>RZx07SZVFbio0BW5$HvU7`MqG5}Je#Y&<#QdJhs6JeDA z6m`IHGp%3?u6rz{6$pA%r1CUqu6~unXDi)KrwP;!3aSkg#ChhotAT)hD{N7e*M}I_ z!zhC=Aj&p72ubwUc(Y_MM<c`0f;nQu7K}cGS^pdwEgg!HFV0?n9X0w63q~J$jm0-m zL<c4;kRi{(CtuT*85f5W)^t7fH(A_ePxHwe!!mAnR5Y7hlLEO=SHLOJOkyaeMiTqz zC%BBl$`#=~76o)8@FxEN$Bq1R7U5gsnyoUdUvv(`=gehF8F<`BrZQW~?$8)R?3HK_ z;}HC8NZWB70Z%IdJQcCnOtpXqQiHI%-RU93yiZN68k!zN?DrsI3_D*l2A<mclF_HZ zB@ebd+@^kwA7J>!RfkI>h8rpq{cXX0s16$$PEN;Vj|>H6G)WbBNjGIUTPq04>7vyq zJCOG6&R9RA4_-$g7(Yq><%tQ%phjbJ3Q-|>_&N|2@>F#2&hoXJcb2cNRaV#DUi-%C z@~UAtg`3l(x9A8%+k_mIq{n}U2Tb5pC=p{lJ+_QfADO<U#6P&Eq9g5Kfy#^50yAS} z0Y&4wf&@n#>FEtTp{pnm`*wSwNap9vy#%KXIz^0a`;YL51Yj0nV!*}y6JwJeZ99Fg zr_n<?S2IsrpCT7B_3|--G?^umBv6HOwJL0OV&)N>eG5<PbrvG^(=kfMs(*r?nJC2t zqSHS(Hc>k3V-uv1T;)SK6r7+Tl`T}7P8!X~_rLQQDt*i89~&EDs6567Vp|!AfnySv zo537?7<KY~(?^U7jliV0{wEqHSirdWCoRSXo%(kD|By<_t<4bHRD8vDueAwJ2o8^^ zc{qyACVgSLM|8;ULkW0@T<TR__TH=Rd8$!|sTF@U?T-zstxgZV7diqZh+;uhhYr^z zD$YwA8)GD+N!bvoma)_Bsu)sqY3h`lX`J=TTj$Wd$&~qOX(+fL;9mlbK8KEO=r^1H zE2Uv>f;)IOg;R)P5p$45`y-r)XaQ<}Y!gZWqA;VsPX^X!!^}QX5F&6;rF(CNNJbEX z1mKcWIpgR&B7U47WFFZnzw7Gtu%HS9=P1JZ4}mA|&%iw*@_Zb~a}l`nAkHN@4;|!) z=HEwOYG&8c-&d&Fn-Af9?Uc}`JMzqL$Ir|>bWL7q;Hu(oF8D(=J8)gtf?ZqxzAEin z!5_9A8;+ft11j<#)ePSUtT^9)FD3n|&ycYZHmc3UjW!-JW5KZ)oGT1{T)kIqG#PLX z*P?Io(!eo|@m}fw!5zQmH|}9MlV}eMitu-{gW_rodd7}6&COck&@IP6C>-{%EI~D+ zCc0k;w3~Yja5fuCAt;Aa4=~pQntKtAYu+p6SIRFV+SzKu+#`CNGD;i}@-6}>1oDjD zhciTU^29tYA*hfHcR7_e;{nFVCk0xN&yqnt$5Br^$~2hSj=f6|cEY>VU&ZssAiW~% zKse8j$;+r`G!5kx=TcH${nsbnmoiDzL?Pw@8jj37B0h<H`1-QMfp_+WU@68ZKmE6u zN#i1>@+l47r*w8B_r~(u*Oumn_D_pDmuYskqC7Ad`e#uFOJzK{43=LL2#qq`PB$uk zlcAMl@AV#P#k?+MO`f8~W;w$zQQjN_<J3){vURllGyH;cC@i-`9L_CfUB}5Cmt<xE z<-DXTT-U)F&NDB<dQI4_QDUZxnPHds@fd8Q_#W*lgkL#`WgG~rjT&qh*ez%^;JFL0 z>g6zt%r>qnnfA-d9njNK-?i$tY$rgv8S21|;~odf0I{1^!)IilN522nQ6W6v>x%kK zJav!Wa|7U&PoaZb4ORt6G$M2hTw)02co1a3&h-5fW@U^inI2)*lSwdy_u<^}1`LhH z0DB3HqJ^usR@RnR)+*PQuim=0d}lRbW_vt?D9J-I^Q94H9>X-shW>FNGL4&&6&KH* z{HJ{u@3Z(W3xQ)9F6a+YB#H2Z1oXxw8KS#vLIz3<11A>Ejg8HKJRodq<reKC{*~Zr zAIGnMa*FiD6Rwd<_(%VNrd`a%04IAVu~~qAwq?qF1e!1%HWc;^D0wH$?6`FYs(#b9 z9=f*GKZCYeaERftJa{Y%Bas<ok6Huwk@F#*gjsPPy5Dh=jRS*>et=OPF!rViLHZJ- zK$U0vD=8OU6ZBHJi0%)7Jz|rD?x<qB9Wo2lJhdn@5vHNZ$Naf$)nEP`jXueQm%JB( za{{{7VJ9&B5PfTe<&~wPS=2KiT$I0g%V>vThI4`eNNC2SoNpo-$m>6YYDrm`0B>&W zzWyHX{#6#^ngr<xvzTv@0f-A&&=*ByHI5?D&D7`9&@FJ(50A5fd1y?es4j#7_#U$K z9!n|?E<Klt?)hWu82n7dg>w44=|WxS>-Yvpi`lE}#erC-jr9Q<ii8%a2id2u6}K{& zbBIkB&Aqg@O`jT_xY}?P^)bu~QX&GxIqEB{h&SD2Hhc96+UQ@x{oAAqT_G!r%_8=^ z(|>B55@U2u2|{9Up=$UA{}qJ-3Hm?UD=LRz3*_Jv$bkh3c-c5EK(iPRI4bif^PvqF zri=R-+;2ld;IQ;P<(j1WZeHL1&>C+K>A<rOo$p{n4W4}!&t}7%NZ5Y-{9>3_Svp<N zyhffzpWsHE9OV<+x9s5eF_(h=S1c)6aF?u|qGoL|y)NkgEca(0TRht@u^oD$GnMcE zNxBqQi7X<Hy$?s|p5OGk2I=>cEp3nt0zL48;dPuRgeXgAc4DQyV7phN+78heZn(+) zracb3^5`@(#6|Rm9e5OTa7x<Ac4KQho<+6Wh~ZU6ytmqLry3y;OcVDBe?f|4<i^`X zdWAwuwj)Y1WUA{c{R4M6cWyaE#Lx@N{o{1$J!V7<0+8P7AGtcxr|#_fZKwvlhOG~C ztDV}eAI5tM^(;8X1gtbta3`=uY>{WPrkzm{Gi>$qtj<b=BypR*&)Ob}#3B@HAV<5x zH#B-+LIuoM06TSb1%L%2PyO@c__KK4nt?w74N!FEGmFlGQ_48bDd(``xdqpCb9NCD zQFIsVNr@QiZOle+!lEMn8&1G8u&>}PM8WVRfPP||3Adw|>oZgl;At0<15B6O3IBRs z9Cx-}VY_{oc0y$yy6qci3G|h9Vrk%uD0erbe>lhnKa~0`$6{Mt<xp?!Kpr4VKMa8q zbCb$WK9&pn>((7`@*u1K%K(nh&P-SwWFKLB47S8cJIr@R|AE}gn|rVGULLcY1^(;| z+{YQrIfLhkMwbRz$V9Gs8%iPN#nna&Ap^q84l-O47EVigAaQ``(AW->E4z;k7fK;E z=^)*b_BPB{U1C;F3|ImoY;1_F+t{d$0t*`(Bm5tykgBb4m`|Ww-00kgs|@j#jM;FP z1t!gjA+o4@LD#P}uqQ(yD8&F2UPLFsZUgBZl}?boZTht;R5B7bp6d8P`z59wb`e<n z*f&c;$OM^tlgKN!qRi+~?&^ri$GS_Rs3+fJ{QbvY2{Sfnx4%$2jIZ(MrNr1KCg>Q& zf6_bxZmi*3rf`9HD*<UQ+K%@Eq$JTGK<ok%PtYPp8L)$++kk%@FPLm=OD=lciPPNU z3f19;#K}<;QI7S7^}{-W;54;+ogR`@h;umwa1AF0mP%8;TsJt~jW#ky%%h_FvCgV> zq*1wZh~wgUGS1m0^dO5mI*+rrfVXH9$ztG*4e%q{O}r|D;H7kgmFsKCh7zbPY;c^@ z-^WpWAOo8HEnX5i(|?1-T^8Iwqvu!<FA?`y|A1%2+G1ZS%3yfY&pqDym<3_BNiTtY z|4r)5S8-w;;r1|M)~@5?7o*%b2i#det-X*tjw?FZi_SdGa?S)0Ljrxu?bS6p5&R<> zLswgz2_k_|R+cV9-C$FVE<d=AYnW{+(vKZ%cPT;@W+bO`3XaCv2QP+HjqW2mSi=#j zkqFMmP^|-3UmUp7@*+$>x7xea3gV-bzHcYlSs))t%9bdI;Z?4rXR-lh?``qV;?y<p z-dzOO$bF_=CF^M*w&7MXzOTvrveOZ(i(#Y(4wm*ZavyAJfWap<z)!Eq)-ZOw35~DH z{JW7wk3r}-wk|5sgcD$Gh?_C=MoqT>55`Y65uXkL8_{dE9+duwqe^AbZ0!1QaAjLX zPrRQYy6172G8HkmDVfazOyDDXYw`-5X-XXS)@DO`%ZVy^k~;s-^dslTKLnyo(!uxs zAr5lRt;qtU91VJ1e%cXKVw6deZb1Z0p4%u4@-zgE4JaN1C~0qz+vM(;DdH+wLciMj z_mo)TGS<R8ws)2s`u48fKQ!jugUD!`!lFr>OOX#YPz>xH3(%%)ihbk+=faFW9U>o1 z&xD{SveeE#JOKninGl<78Q(q<AEb_Fk+-&Y^7sKAfd>N5MP+^y$jGlcKcLS;ufeUB zFwt~@-vNHe&^6s=FwJRz%H)R*+!(X5p*P?@#Qa!I`>A!bF`wKmnRb?JSx7DGC@nS; zdoj#@-AVG1qx)s(g2z!dOan!Fv=_=Zh>8s?9dL8C*%`4G;^1s-Jdv6FD&Aq}aZ6Uy z=={7UI`z4!PrZY?2(BfKd7CYnNY+F-qAaAg1*YPTlS)iPvnzW%hl-8<vv=anIaixO zWaCSqgglkq`(|v(vmy^4bSG`Y-@#aaN=~E8ZOw>X0G|~zCFC<5SOflZa1NklJgYQ1 zu^M`iKOXrLADYZaLjW$3q&;DR1mT(R@QX;S#p&~d(C$eRWjuE?Y?B%u8Xy`T8IQuk z@rdONfCQRxogqFI#~b=I8p@`RDm;}5ibON%Fo#EGa&(kO%4w7T>lb$$*cEepWT5ek z81IgaftKcF6AUB3W)OZI69>T=?cq9Ou9MWF8|920G7g8h8C7&NeKEuhd74uaQ~_&W zWU6j)i~`c%*vz;TvJ97T!evkv!k~EuNdg5RRKi9S!f1lAq_r8;zRubmSa%7j$T058 znu!yCi}OTA1_!;#LZU~hot|jqt>-y=(Vg^j;MoXV=uGHNLzC$*@iXWpeTl;%^deJ1 z?NiX5d^Ntx7vxnC_3>4Jir~Hw++7(@2*9-r5c3<C78(c4<5lH~l@RYJM{l>?>EEJ_ z=lOYB++=THh)s&)Dhk)e)xmB;jeMRO8v-774coM#zY@CrwUl^&A7`Jl>bzAZ-G~ZV zpcrXZoTQnV>2#VUEQy7mfdeLR8tCQ-OU8>X6mnJ!vXvQG)+?VsGv0cQGoz$i!2Kq8 zQ2?&7DWxiiPmrhZ{nnZY`t+CQCTp`H^D7(&KW2`{Q@BZs)Yg*W>G%rMU&0CT0=zXi zg-J-9A%lQO99x??1w`H84^#VBoHygMII|9laL({IBoO$J=ka%A_GW~{D3YlYDpRJ6 zL{;Z&oU$w$Qvcil0KntPsk7x6jW~UodI={c<;}$+t@@v(cK9lH=V528K{O`<v@teq zb~<P%j5{>r)2x4DroFp>NNIq<&d3Ym^BKfwi2P#bz1~eHk!DpSo=0?!CzxAgaua)2 zfSC6Xc%t685y%c!@0%1L_Sz2P&^UJp6b!?SI%{V~Qq+-C#}^Jp)llh7XBhpraqC9P zEBXHOW7=`LhnSL|{6*a=<geo-)-*Fvm(V7-vUlY3RLS@NUt(TMWlkV}u(!aBltRV< zxD8R-7lEYafWmIrFucS;_mP{htq`~<aV9}(laCm)D>U`iS0wo;3}-%UD(V`ljWGUW zoEdQt2UW5+k_Y^VO=vo>P0Z|ml>jw{r}eM%_5_O_uJpPH53pB+PI0^;^y{P=p+YNT zbTdC@#5W2+@%zt>QE}SSsq|6uQWoZ<6+a|{gu&>%ESg#HYWlT<jG%Tg&>!!+aoYFb zB_J$C+I~H5Pq`)fhJKENlGwNDK6KhEaXap?r164;$L%J1l-6F{2E9-Vm@6h2l5r)O z4|zX_IYY+DWB5QbsMdXnBV;L(d@I8R?rJmGi6JAPR8lj_N;-Iw<a3p6<c;v9ry)6M z{USQy$D{@1SZNFKkr+z)cgZm)iUT%&B9%7URqAr(&>LY=vP|$lP*Cl~-iI9=4IN`D zQ47-;ycoJLmfS^Q?Pmdy{#c-TL{dnw0_H@Dl|X53zrY?C-{Wd#rzol0U*PqFH}NDO ze0i<}$kfr{ZH_r7%Rt;<9$|{ZB<{xyTwJ{oBL*AzjK<NwgSH0%!}8AWm^%-+NEl^* zf$%H<*xy5s_?jGj|L$$;gWtt-n3MivmS$$e9t`Lz7(}7^dk~~lKRpSRj`1;7%_u~Q z=;$XQq|*S>Cqv|)9zeMH|Dn+K*6`~9hWY&K-$=qInib||;t(F71{Mxb#Y<1@TuwKb zyu@c(jewv?xxXbl*aNdU69C6l>qiU8{rz6tPH-kEz!&xI$QA<mByfsND;sCwI#e$~ z3IYDaXPGN59W>}7feKB-E{00e*l58SnT*j#SV$B=?W3tZ^>4EfGw{!O_5&8b#NwZz zNV2yne4+mtY8gUtH>jGX{PnM)MUVRD8cwYF0%8cnk<jueGetNl(Ecvn6-P7@bGqik z)uQ9N{D3u=k<Z@cKKIv7#Gj)EJhiMeZ?vvg@e9f*Ai{6};g6m%{^$;Obx07h1Bmg2 z1RZGO#tGj{|6iw4eMi);!S=s#=Uq4|_@I+tLl80u@U0Et3qi5L0!hR@L;)aeY!~l9 zHV-G?kn-cuk%!R8?8#+{LhcyEGM&jN*vC%m{E{VoYPbbAePHF&Kf@oa$TvX(L62dy z@s(u<|E0yjWVCe4tNsPFn(pUBIYcW!UH%0ZlA7Pj9fhf$2&7D#r3Km0Z<tfO3v;@* zw!**bEBKlb2XO7Lq95$y$Nw*Zx)=3XTn<0@*UP;8E(^`VV-c|Ep@<3zu5YljCT~bc z_<(10ri=s(8JJ#zVSe$ge*>4%tb7Dx$gGKh=)cS2M=bsx3z3fB;u+&230L$#;MqT7 zLGRB<j0g)^UH_QH&;gP&*<f=6H@M{_;7Q?Gd?N`8!k)>$;)TLoAzzv);bZDTp>VNq zps-k&Exl1(E}kr%DrAaCW#ay9VFpJR<xF9|aI|<;v$Lf#|7(YO4=aTK+Ch`?v1^|j zj2?viK26^IBx{{U2m7@;TlfZQ3jm{}ay5e^{Rs;?Q~Fofu!N)>_Atoz0D<|gp*T!m z8$}{nT?QN`3oL3zauxHaTQ7Byi^hL+6O@C-1ATzaDlCX<tuKz=EVr<KHP8on_n)$m z#iVPf53%uF{AH5)^2{KrR9ynmyo;AXGUhB>|7BL@%x72feW?B-t1q&6oy8l{;O4C> z*fK4Yo3>C<;Z5`L9(S4;w~1~Nl@d3r5r92|WO514>H+|=h36LX3(qbbDHQ)V4aHsz literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000..34f2381 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +from collections import OrderedDict +from .exceptions import InvalidHeader +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (' ', '\t') + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000..02b3665 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py @@ -0,0 +1,391 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to within two years of the current date, +# and not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address. + self.source_address = kw.get('source_address') + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + if self._tunnel_host: + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, server_hostname=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + server_hostname=self.server_hostname + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + hostname = self.host + + if self._tunnel_host: + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=server_hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000..f7a8f19 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host, self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s:%s", + self.num_connections, self.host, self.port or "80") + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host, self.scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] <https://github.com/shazow/urllib3/issues/651> + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s:%s", + self.num_connections, self.host, self.port or "443") + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host, scheme): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return host diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4de90e489a7ecf2966169df3524a15653fdd9460 GIT binary patch literal 208 zcmZ?b<>g`kf<1{+u^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{UbUr>};mRORi zUzS*;pO&AKl3G-(pIfA#locOuQEZxLUY25#9A8joWKfc3k)BnQW0+=YX{jHgUyxa# zo0(T!l9-dDTTzf#Zk(J|1rh|~__EZzl>8$7(xRN4%p_y|<ovvnqRb@y`1s7c%#!$c Xy@JYH95%W6DWy57b|5De12F>tZLm1h literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fae79b859d13fba1c8250612f5b7accaa39d3b3 GIT binary patch literal 1104 zcmZ`&%}(1u5Z<*N$AmyjRM8))$k!aeZ7FJys;Z$ihyyMPDV31W%JDA2!SPzVi%WB* z57Hj{4t<5bfUiCE6?*Ed6CkKzt(}=2+cV#MGrP60P(!eOhEI-v83_H>hpPo=^cJ>k zfuQIJQA~{lA7N@z>nl1kXocFKO<JW6Xp7F#8t4k0r*+UaH4ad7VYF52p2pH0a(bRH zHxoRMDT6Z$Q|T)1Ql?m>Ty@Iac9yw*+K*G_vNVqcPlqg3YqdXs00ohjR||vj4z_H7 zQ0Nk6_Z2Rsafu)=4w`1sh$TsQ6ec9hGFApImcR!f=#*>uKNlJ1L-_-V3Is33-%BqO zaULq><)QFSctV+w-cWeG0U<59k-p05%ZOz8i)ZSj)gOrD`N_uSrq}hdI9rWVslp^# zy~xtf>(OAOo#iGuODPxLxk!?@x9&weRU+<rH|WTOiM8xYQ3s&cl{mV38wA2OJfaHL zY>F1)ji!j#HAVFaJx2M5u;ArQonuQ!EgnoKBQi{Bk6-9eQcniLLIb#!&;&=>lSg1s ztk3|T*?gHA+M?!TbY??mte{wG@9+D;&Tin7&c~p;yXTMU?^(_gp6P~r#k~W+bLe-- z!H4bcr*_A08im1SQJrux3$M_q^e{+W5yCZGdS(N3;frg4E7Jh^ih=<uIkEyV2j7hv zJDm4nbZ@596Z+aTO)(Ej)U~*aMxjZ02z%118eYVu?-nrqcgfs%ng{rsp>NxFgPLdh z76E7WPTMDkd)tMj#5tSJU6_5QW>TWVKGnG=9n<G#wWtz8c|^z<zMh-1mnB~%wmYjS YoY&)f{6?20b>)`fn2zmOPQ|hR0Yb6r?EnA( literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea922b0ec78e17502b4235bfc8ef356e4d7be166 GIT binary patch literal 8323 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 M-)oO)1JnP%0eJ*p+yDRo literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e711e5370624f13b75772a7921ff85c001e85142 GIT binary patch literal 3250 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 Fz6aFZfBOIc literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f3e621e07bff97d23a870822fb012aa453e2358 GIT binary patch literal 14486 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..361b7f637db015f5a007b8bb862f2ee74902ced1 GIT binary patch literal 17905 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 Jo0&}N{{X6uUpW8( literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8a7e717e08b52d881834b8985459874c172b3bc0 GIT binary patch literal 4914 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 BBl`dV literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py new file mode 100644 index 0000000..f3e0094 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d52b95cc4c9b5fb253910b1080554ce875b8e3af GIT binary patch literal 225 zcmYL@O^O0B5QQVSkO42?4QAn#zo;+_g9mV<TPf0=^pGYdp_0z1NAM=z!IQZ47OqSL z@xk}K;;m}g?S8P73-4`n-?Cn5rQ<i@+ew10*=K8YW|Zf*?k8}hA`cQGC#b9zl057P ziW+h5r)Cz#q(m1-gHX-?YSP1Mx>&#loN|3-eBfI5_s;x}%leqdCm5v>mY^Z6RWXLr lnn0=m^s;P72I9s$O92p-Q33JG9j=}4ofVCiKlw+WU=O}vKj#1d literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8c4e67b5cb5b191c6a2a7f852acc035d4cfc5fb GIT binary patch literal 10320 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bb54321d80fd1323e6880bd5263f87553266830 GIT binary patch literal 7501 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 RW%qUOlDp>8@4EZp{{aQ#_16FZ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond <will@wbond.net> + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode('utf-8') + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000..9b42952 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,289 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + +Example usage:: + + from pip._vendor.urllib3 import PoolManager + from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations <https://cloud.google.com/appengine/docs/python/\ +urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + <https://cloud.google.com/appengine/docs/python/sockets/\ + #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import io +import logging +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..8ea127c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,111 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {'Connection': 'Keep-Alive'} + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..363667c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,466 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + from pip._vendor import idna + + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(':') + if len(split) == 2: + username, password = split + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when performing security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import +import binascii +import codecs +import os + +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + boundary = binascii.hexlify(os.urandom(16)) + if six.PY3: + boundary = boundary.decode('ascii') + return boundary + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd901c4a4f8ebf6b495b198894a39f99796f4b9d GIT binary patch literal 322 zcmXv}OHRWu5Vez3R8=b^maN!jQ4ExdRze8%0Bm3t35}fCX&wBN?S#*bxC1B2mQ}C7 z3a5yX-n=)X(VLmgY&JnLzUb+*iu^qk|B*y-AK}kpVu)dh6fQ7EEMcikR9d7_r$xrH zN0g8DaSG+QKc=NOvJD)Bvc`oy{_CH3FG0~z?O<no&{Xk<eAG_>>Nd2F1Gr&hk6bp; z5df7E;1juVtPknugIFgz8aU~wBeju?J5Q7&WdpGCOMTO^>k4dlbrI^-wsG>ZUar^V ziCAIhLi-Rs=WkZOE~+M)33~u^Tr=ZH>!cLrf>>I;&@J}_Kxh#F&h2|YzEy^`lHU#g L_~FKBGEIH~U65Ll literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ea5391fdfbb8c91bdc0bcdabdddb3be6c4067b7 GIT binary patch literal 24410 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 C8~w8Y literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2465a1ae1889cd698b869951ad54f28de89c7ab5 GIT binary patch literal 219 zcmYL@I|>3Z6h$Lgh~Ng?fyMaz;s_$*0&KLEkeOs8W6Xq?7(ca}aSyJ<)?HYc2;zlv z-sM(r*=jXO$b+@F@xG#dsfDr#*m@8rYtpH$?gZof*ZT$rrDslnX9z{5xIhaBgsh}A zwPQW;e3Vn;2R&D$yAoBu7*D6L0V7Q!wRKFX<ZSe5n3vZ$exY7yULhP&DVYtyuzb&U f!a^2`snA)VRBGuc?V8K8F*{WJsKh*eX9MH|AT2#5 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c022eac5801ef1a118978022eef88ab6b6cde06 GIT binary patch literal 1313 zcmZuwPjA~c6elHFmSx$<x?zW1#uivG1Ff|!4bl$7uzE{?07F{T=>ixi6xpN_*|H>% zwA~o=4ogq_1iK7aj{|n-2iOPbXW(%=<qPbv%l0V8L4oZNB;Wh-@%<%xt(K2~evdzR z{<?<HpGMda$mlDWVjC8U28d#6Wq5#Lw=-*M4{VHRoz|%P5)T||^-;%L{_GFq(WET6 z6y0e&VM&@X|NH-t@Ao!pM4mJ9<U*boIoTnnr=l25n7p}sdP=4Y4k<|rPG*9UMJmrp zoWqSYKZDz`^cQh11(5|AaTZHPVsa+|=Xc237%7HhHj-Wc3Q|Ew9jv{6<>m0P#(d-& z6sQH$@L$6eTNojU6uvb1TGT$bCm38{>L{Gx_t7Q(0dR#U?#iXu?B#vs2541Rb<tC< z=t&DS>`KF<wN*pa`9L)&-b28<JOSP^ytEZkjZ16gE99WDL)|@Op~z7dtxr7uBlT7m z@Qn%LKgrtIy_PKgT6y9(h{!jwD8G-u!yB;tM%I3*D<6jS%3d||ZNN2PUWHhIya)09 zVd4X{u|bu`|5D990?b!UWh+P3UOB5kVHHG86+nNR%g=oRv}qnGlK<^k!i(umPrJL_ z>Jqo1t{N{i9xk`jd>&^hCDVd3@)0K=7kPF;_+7HNONJ!QvSPt#N24of13J3;2Z$SX zd3%-*XGy|1qeMt(_f(MSOh__hWSHhLzvu+o7EEgYyEvP%ea;K6+mD1`T&6`{$=m`{ zgLbrep%G_^&{kULcfZ*`c=YVs<EZ!S;9&o0)IS{T>vr$j<I|HTaSGOMWENBQmVClf z33BV0y^x2GPk3CGAUY<=PD?w2WeLA!s?b>H01sGuEFTrra4s{k3SH0HB1?0o>kF`F zPU?{7T4kLg0P(_D)iyBNU0c(R1i!x`{vo*d`(;@2bPm5EoX0#&iVPwZ;gpBNaTGle zyZPRn-XBHf{IgGF^5AUDvrm)VhY!Q!uuRK)X)Yvm;ogffU+j#=O9NIjnzNi1Je=_? zONTpQ3I8}gV<Noy_u;0h-SR@evw?4F-G<;q4;ECrg)JOd9&Y0Rd)R?tRuB7ttU333 zH|Q3ewLv?mG`Fye`E9V$sZ|f_2&hxj^(dmnD2jLhN7`Ng|Ek@Ua#fnQ7Gku#FQAmO QjD6{WB+LTttiVS2Uv2S#UjP6A literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..740db37 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= {"r", "w", "b"}: + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95ec05de139b1259834e9b0d16e8a7a611c9072f GIT binary patch literal 563 zcmZWl%We}f6tz8*Hlz<&WCO|~3xt$KYoM)Yr3xVsNNl<R2^a}k&e+pB@k_QlG!-k5 z*zqCk_yE3Swyg3CthjDKsKVAge%#}8kMGm1tpS4ZgWq}oognlxAO4OF*gS!VUjPIW zSfdIp?nyMmg3M7ENg|5R_!EX)sS8t9rRh~YjNTx7QX)y_gYXffJQu?&&e}E3-9Mam z#SuMFS^vj)hb(!ERw&A<FYqfgSzCe^bTT2!0@h^@;PUnhuJx4H^Ko+HR$AeL6yw?n zIU(JxXEG$!sG2AFJOmfIZNpQ2#?D+!mK(XmpfS186>$-}%~pn}oMp;3uG@HNybEdd ztcX#E61X83twy<E&c<Cxu<M%DO{R?3(ny<l0=;gXF)+#4HxxFrMuuNssSm0JW3=Ug zHcktuPEDZG8Dod>z&>ile$9OQ@P29zPiH|tXbz5!=xgeg-%&Ou(A>H3_QPI1yUdqY z!B#z>=Rs>V-J>3y@>3b<|3)c;pQ^;zu3vQhW8=iRmXC8s;t-%uNHM^DGQ``MWF({F EH|8&$YybcN literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..888db62bf8251fe97ccc1cc2e70f9205811cdc44 GIT binary patch literal 3322 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 O?K*RA^SbZ(t^WZpYKF4_ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..970cf65 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,156 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used in Python 2.7. +try: + from pip._vendor import ipaddress +except ImportError: + ipaddress = None + +__version__ = '3.5.0.1' + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000..fe5491c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,450 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str + 'key_server_hostname', #str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + + if 'headers' not in kw: + kw['headers'] = self.headers.copy() + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + for header in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000..8f2f44b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplementedError("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + urlopen_kw['request_url'] = url + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000..c112690 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py @@ -0,0 +1,705 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = b'' + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(mode) + + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (basestring, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97914b23ff99698979d17beadf09d70a71c03c97 GIT binary patch literal 1000 zcmZ9K%Wl*#6oxa`%w#f`&ZRe6kXSK`5};JH5<--!5|z-jnoJj1LRLEQv}x@m*v?GL z^RVF^coJ_}^%YogPO4HwqI^2%*s*{AJ|CJ*$Aaf)u>PfAwya;6+&@JK-ovN9141h- za7z?Op<so@u*8d^L`r#F=4DYKl{~KSs<4Tj$5mbvby61&aYTbOgiBn}Bu&vGEzu@z z(IK6Dp3Rp;mvlvs^zyvM`(i)_d0gkqVuh@TRkAA9$eLIu>v`SbkHiMq5SwHZ@&<Vv zy1q4R-hxtVSTOD2OeH+ij7B0&q`ocO)d!KH(<F}BR7XinLz$#03*iS>1Xqk+upneo zVGa{#DV_2}!FbI$zW?bUi8Z^{#{RhPQ-5@1+#{c!d_F!o9KopRLgpVHoQ@AC<Nc9; zay*`xZlDyCn$Dv5oXJ#1u{KMRfwnoLQyh`(t1`X&l2V+`K>>&}ZA=z2NU2JuS4<C! z#+_zTvRG3c31;jGFv&E?t&EwLH^Z{2oij}@5~WQ&4Wwc;liV~^$|DpZp<X(b9F}S> z0xTsG6a=AZ{Y@7#(rnn5HE>MU5!fNpMl2yZhykL3Xd|F?ELlZ#5j{i&;Ub!dKB9$K zMyvov!zad}be8E%GD;;joN*rRCtudsU{S`D&KEQ_uqsVra22;RWi;td+<$^|aSz+$ z&c;UHz_B~gco0*O=v;m>Qv$R8IY6!$4{FNj&Vz1aQyOqi=?_ajh4CD}=N{beJkZRW z2hy7*99zi~(mT7PbXV=fZ|33aDNX0EUg+8G`K9D9XFGd)-o#6zbSsLLhBddY(|EBx zz5Is7{DXdo!$f+ZjYntOUZx}NQ5wZ?ee`*HV`^_j5@wve!yZ@Yzgu(*_&#$w6}PZj H?Nt8&1<Ma^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..078f93b6a232c7eda0ce165376b3186ca6cd5bb7 GIT binary patch literal 3175 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac6b6fbc71731ab4afc0302bed1eda6609e1adf5 GIT binary patch literal 1049 zcmZuw&2H2%5Vqqan{BtHKu^3u4&9WNs;z`j1xQ>_1%eBakd?;XDvR?|J6XzVZ|#G$ zN8W)a@s(4LTsbl0?N(c0q!~|U5`Xi3c3!Tntq`yu*^|$|C?P-bVPQTbN8si)1VIE< zBqhQVOwrOyJ&L)nSm~!eCDI!Qdg$H?)7~2*0uf#k5lVj?Ua&M0^aF`|H?R{qzVRT& z)G||?!xEfzvXeQs7RDes0yo<bBuS|tsVAuLE=kIyKca#O|B|M`93~A#Pejn`i9W!r z*#6sMRKIuIA{H91=&!)dI)s*7(Q7gz+!F*oqQ^0_t9h-I%-f=_j17c@$u!Ckd)7Bn zjV$HgiAKqOo21djBx_|d$#gQRm5|ybrA|)9oFACIYJVc0<-D2fY`3F>)3H`hM|+2d z$;YHAnysQTZKl-Lc~gDe&Bs$LI_DEviCQO}R;oDJO}e&Fi4$npe6s;Bs-j&*3XT_@ zKDc8#biMq)d~xC#osluQz;ghu^p=;7pk<kom7_He2w+2gW{RmqsTN=xOJJ^f4-F5^ zsk;FQVqMW0y{2$aZuRvXrVX>E0g|yd$M%a>mVbl$yy@D9OVH~}(9p`^vO2@{?pPg7 z2Yh`Wk~MV$l#%PdNT;&hgvNs8G7_|o<H$ywS6L}Jw=0~NwdfS)1J2L7OwBubfP1fD zK*co9t{-E-p_T$_s{;sFH#kv5BQ{_WbJe)7L#WxP$?`ARsWcj8O&={Dhw#q~%X$J0 xyqK1~`?O;Nch%EP-c_BEVlkqtx?Pv>-8k-mqvvxfFHl2+^@tAWzze;I{Q-q&<kA2D literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2c7126765dc543cc6d899642601df2376c77cc2 GIT binary patch literal 3230 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c474aba4360a41acaf230871c118ae42f3363b47 GIT binary patch literal 1978 zcmZXV-EQPG6vyKvlS$KQcj*cVRcNsgAdN(47Rrk52qDT+sR&Ujwu_cZZ0d=fnansJ zYdh0Unch%td589rJ05^1$t_oX1+F-DX4+Xcl4Hjo$M!kD|H;>DYk>vN-(>TbO=$h2 zKNgP-jjy0c{h}5{+)B|gLKd~D!|l{Lc1_#mjnq5#pxvO}@78gXHmMJ_PgiIF^$J~m zX0=;4V8v>q>K^IKoR^A)Nm}GW-ROOwe|4x-5k@>=nS#%aeMTq~heXIE8|(>@iwJ2G z@aWoy@)U}U;WhPV)|GW_J+oX(p>ZJIMKB3jKU<mo!kT(BYh>S!?YuS?z?ehP*uNcr zu{^F^YG0z?5JhkY=UfFCo~J_=jU_%EGBsoZ6Ff*JEW>fa*%nX64Cnn3ixf^Ij(9E^ z?F43BuONb?dbDT0wXLHedvl@6aisU?m}v*+?dKWkbB3XxGQ~uiWbAhPxLDe#-KhLT z*1J~gyGn_q556}3tGs!?9T!#b6X9ju58ig*On+LU1-|@u(k(<XA&PY;M0DevLl|T? z72W<Q40q(??DGlzEDDRsr;k*;GZ+c}N&NW9lkQQsNQ$i_lZtS@byj4j+tKJ;cbXD{ zi)b#orQkg2Z+A<T@UCF8$TP`0#k6WAGK@6=+G9-}+D&*_zU}yE9eK8Gdv)yurWWfk zddoxuK6EimOrW8x8L%+2FKziyL4>bd)tFhA=o;yGDquo$eCb@&ZP&D+=fauU;wA9Z zytd@anSE(pxM0gwzFLXF8jQIx2g!Km2%&-*nmM%bhYgH4z=%f<0Z$XRT`8GROPp|y zhlXm2hh)NVp8++pj3OpwTyj3e0Eodwld*TE1c_ih%c8u@Anc4{riCDJEb<fsd>9;9 za)tBQECr=3c9<jgLk3n)a{;*K89tn<AynJ1^Ef|K57&~D8nX!#Nj$Cj>#1qM7Iu61 zL<<!{*x5fiI{Y4vP6q5`VNsAoGKuFw?y$3n6)J%cciz<Vod~|YJO2EFM1U;d)*v12 zi}Ux{Spkv)4=i?{@BA?y<O=`#=%Q0KDT`r_Jg8O&OoauR@|@7NE$#sh)moX=-VG^H zq`g`N31k+4HH%o)oLj9{mo8PU9Kprs(us4C5>>g{7gZDN6VR4nHiZBrU|Lm;{!}qp zIZ_FsSp+dQ=gu`}5ci=|yroamoS)7}u70iQ{<n#NCajmi9ZdTB2!?7k+;1Tdwd@uY z7rCGe&t6Ba?IZCJ=G>}5=TrxZQNst&fGlSL>1c+OX84^MWVA8l#2LDBu0aX94f*Xa z<L&?Dx0<t8C6fj;qM<XY1&U=2F~R$LyWeaHW@gnf+b0?2z=B@>s!R-mG2ShTy=(ya zYe5WL5prUbXIafdO`G|~y@-Q9dan`p<9zcIbJQDs%gWWex8154rjU|zDmHYllVlK+ zvM88n+m*jKb>+<`>1?;;`UjAI7IQ+Cn-F{lQ>6aYSSub15V%=~;-DQ=K^VrRDg_He zp}l>)QIKd1Qji^)oORNC!lZCvKs<m~72GMopkb1iiJ7sugn>DgVZr|*&1uQmm->Gv P^^aPIz2*4t`5*oV6wE11 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b279440f1f771133e2d3ccaeb3478a2ada58b85d GIT binary patch literal 12664 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 ODd{D1_AfO0GyVth#113? literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c051929692ea5630db328627443bb1dc9e1f0192 GIT binary patch literal 9556 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 b+L9K?8CT1>>$%r+6SzwMME;aW&wu*g(K|Y= literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62c003d81c64827907f205bc8f9115debf8ebf15 GIT binary patch literal 8779 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14d50cce394c63beafc4c8658870ec3e0f3f9152 GIT binary patch literal 5189 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41ae1374385eec72ba2c116de8ddafad0f43b4d6 GIT binary patch literal 3141 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000..5ad70b2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,134 @@ +from __future__ import absolute_import +import socket +from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py new file mode 100644 index 0000000..d3d379a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/queue.py @@ -0,0 +1,21 @@ +import collections +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000..3d54864 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,87 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000..e7d0abd --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,411 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True, + remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = remove_headers_on_redirect + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000..dfc553f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,381 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac +import socket + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + from pip._vendor import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from pip._vendor.urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.7 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + + return context.wrap_socket(sock) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000..4db71ba --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py new file mode 100644 index 0000000..d21d697 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py @@ -0,0 +1,342 @@ +# coding: utf-8 +""" + + webencodings + ~~~~~~~~~~~~ + + This is a Python implementation of the `WHATWG Encoding standard + <http://encoding.spec.whatwg.org/>`. See README for details. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + +from .labels import LABELS + + +VERSION = '0.5.1' + + +# Some names in Encoding are not valid Python aliases. Remap these. +PYTHON_NAMES = { + 'iso-8859-8-i': 'iso-8859-8', + 'x-mac-cyrillic': 'mac-cyrillic', + 'macintosh': 'mac-roman', + 'windows-874': 'cp874'} + +CACHE = {} + + +def ascii_lower(string): + r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. + + :param string: An Unicode string. + :returns: A new Unicode string. + + This is used for `ASCII case-insensitive + <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ + matching of encoding labels. + The same matching is also used, among other things, + for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. + + This is different from the :meth:`~py:str.lower` method of Unicode strings + which also affect non-ASCII characters, + sometimes mapping them into the ASCII range: + + >>> keyword = u'Bac\N{KELVIN SIGN}ground' + >>> assert keyword.lower() == u'background' + >>> assert ascii_lower(keyword) != keyword.lower() + >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' + + """ + # This turns out to be faster than unicode.translate() + return string.encode('utf8').lower().decode('utf8') + + +def lookup(label): + """ + Look for an encoding by its label. + This is the spec’s `get an encoding + <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. + Supported labels are listed there. + + :param label: A string. + :returns: + An :class:`Encoding` object, or :obj:`None` for an unknown label. + + """ + # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. + label = ascii_lower(label.strip('\t\n\f\r ')) + name = LABELS.get(label) + if name is None: + return None + encoding = CACHE.get(name) + if encoding is None: + if name == 'x-user-defined': + from .x_user_defined import codec_info + else: + python_name = PYTHON_NAMES.get(name, name) + # Any python_name value that gets to here should be valid. + codec_info = codecs.lookup(python_name) + encoding = Encoding(name, codec_info) + CACHE[name] = encoding + return encoding + + +def _get_encoding(encoding_or_label): + """ + Accept either an encoding object or label. + + :param encoding: An :class:`Encoding` object or a label string. + :returns: An :class:`Encoding` object. + :raises: :exc:`~exceptions.LookupError` for an unknown label. + + """ + if hasattr(encoding_or_label, 'codec_info'): + return encoding_or_label + + encoding = lookup(encoding_or_label) + if encoding is None: + raise LookupError('Unknown encoding label: %r' % encoding_or_label) + return encoding + + +class Encoding(object): + """Reresents a character encoding such as UTF-8, + that can be used for decoding or encoding. + + .. attribute:: name + + Canonical name of the encoding + + .. attribute:: codec_info + + The actual implementation of the encoding, + a stdlib :class:`~codecs.CodecInfo` object. + See :func:`codecs.register`. + + """ + def __init__(self, name, codec_info): + self.name = name + self.codec_info = codec_info + + def __repr__(self): + return '<Encoding %s>' % self.name + + +#: The UTF-8 encoding. Should be used for new content and formats. +UTF8 = lookup('utf-8') + +_UTF16LE = lookup('utf-16le') +_UTF16BE = lookup('utf-16be') + + +def decode(input, fallback_encoding, errors='replace'): + """ + Decode a single string. + + :param input: A byte string + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: + A ``(output, encoding)`` tuple of an Unicode string + and an :obj:`Encoding`. + + """ + # Fail early if `encoding` is an invalid label. + fallback_encoding = _get_encoding(fallback_encoding) + bom_encoding, input = _detect_bom(input) + encoding = bom_encoding or fallback_encoding + return encoding.codec_info.decode(input, errors)[0], encoding + + +def _detect_bom(input): + """Return (bom_encoding, input), with any BOM removed from the input.""" + if input.startswith(b'\xFF\xFE'): + return _UTF16LE, input[2:] + if input.startswith(b'\xFE\xFF'): + return _UTF16BE, input[2:] + if input.startswith(b'\xEF\xBB\xBF'): + return UTF8, input[3:] + return None, input + + +def encode(input, encoding=UTF8, errors='strict'): + """ + Encode a single string. + + :param input: An Unicode string. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: A byte string. + + """ + return _get_encoding(encoding).codec_info.encode(input, errors)[0] + + +def iter_decode(input, fallback_encoding, errors='replace'): + """ + "Pull"-based decoder. + + :param input: + An iterable of byte strings. + + The input is first consumed just enough to determine the encoding + based on the precense of a BOM, + then consumed on demand when the return value is. + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: + An ``(output, encoding)`` tuple. + :obj:`output` is an iterable of Unicode strings, + :obj:`encoding` is the :obj:`Encoding` that is being used. + + """ + + decoder = IncrementalDecoder(fallback_encoding, errors) + generator = _iter_decode_generator(input, decoder) + encoding = next(generator) + return generator, encoding + + +def _iter_decode_generator(input, decoder): + """Return a generator that first yields the :obj:`Encoding`, + then yields output chukns as Unicode strings. + + """ + decode = decoder.decode + input = iter(input) + for chunck in input: + output = decode(chunck) + if output: + assert decoder.encoding is not None + yield decoder.encoding + yield output + break + else: + # Input exhausted without determining the encoding + output = decode(b'', final=True) + assert decoder.encoding is not None + yield decoder.encoding + if output: + yield output + return + + for chunck in input: + output = decode(chunck) + if output: + yield output + output = decode(b'', final=True) + if output: + yield output + + +def iter_encode(input, encoding=UTF8, errors='strict'): + """ + “Pull”-based encoder. + + :param input: An iterable of Unicode strings. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: An iterable of byte strings. + + """ + # Fail early if `encoding` is an invalid label. + encode = IncrementalEncoder(encoding, errors).encode + return _iter_encode_generator(input, encode) + + +def _iter_encode_generator(input, encode): + for chunck in input: + output = encode(chunck) + if output: + yield output + output = encode('', final=True) + if output: + yield output + + +class IncrementalDecoder(object): + """ + “Push”-based decoder. + + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + """ + def __init__(self, fallback_encoding, errors='replace'): + # Fail early if `encoding` is an invalid label. + self._fallback_encoding = _get_encoding(fallback_encoding) + self._errors = errors + self._buffer = b'' + self._decoder = None + #: The actual :class:`Encoding` that is being used, + #: or :obj:`None` if that is not determined yet. + #: (Ie. if there is not enough input yet to determine + #: if there is a BOM.) + self.encoding = None # Not known yet. + + def decode(self, input, final=False): + """Decode one chunk of the input. + + :param input: A byte string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: An Unicode string. + + """ + decoder = self._decoder + if decoder is not None: + return decoder(input, final) + + input = self._buffer + input + encoding, input = _detect_bom(input) + if encoding is None: + if len(input) < 3 and not final: # Not enough data yet. + self._buffer = input + return '' + else: # No BOM + encoding = self._fallback_encoding + decoder = encoding.codec_info.incrementaldecoder(self._errors).decode + self._decoder = decoder + self.encoding = encoding + return decoder(input, final) + + +class IncrementalEncoder(object): + """ + “Push”-based encoder. + + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + .. method:: encode(input, final=False) + + :param input: An Unicode string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: A byte string. + + """ + def __init__(self, encoding=UTF8, errors='strict'): + encoding = _get_encoding(encoding) + self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd4509a4577246764e058c099ac552a8cc79451e GIT binary patch literal 9684 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 bGq05C^HQNQTb`JnuDn*Zrf15PnfLx51y(N` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f91cb64d90908211abd5496b170d66ff68cf6da3 GIT binary patch literal 4098 zcmeHKOOGQp5YD`kOy;!@o(l^N3kw6=lk_v)BZOd=Js>T68BQyqR;TSGPCDIDJDHj7 z1HXhnfW(;t;&&{Pulx&6l<j`FXBcrtBA;ebWtUxLSGlV4_~4+|g3s^ay&vvAXtn<2 zO!@f(h_B#}{<hI-q1KBQ+7Q@85?kmhw$WAWpsQ%3COYV5bkRR!7yT1@h-0sTeZ+Af zaENLgp<5MhqdNueq8hIuj@Jd=K>vm}5yx9M;BCZlPv9NI@vgvqbRWHU4euijeNf>; z#PI;|Q3D^N>v)JBqEFDLfMfL8Pp@8VpwG`*$B*(~dp!+47kGq|C`BZh(33bE;h2i? zAFqGpg73nmR<6+G0&SIQt0^X#mV^s@BIQn_bonwPlj-VIds32`IWSCZ^in$`i!{;B z!X-(By3?3MIHCAddwllIBaLFLJ^S{_)8}VTwQ-th2(LmCQ`kD+S+B;r$J%7H@LV_V z5t{0r=lHs*(3V2m3hgMgx^}3Hd-;B~r>B#Aui}h>%2+C6tBj*EZr+}!#M86ld(Czi zVMLNuN~ihW1xZkPL3M9v=ldmNn9iWV84b>Ca8`qB?&37&+y*yna9)0Rse@g51U`$w z8Ek7ZnzPPiWOxH>koTs!J{jqzWtePxL?%w&#_LF*E#*<ofoTH6cIlLiSHX->IX};o zd0@KSd4@Z}B^6_?cujGpBRnPvM#r!6+v|itNMhXp2zQrW-v-WOTi|%M6D|2yH=;5U zGDt`*wg)Ut<8Vb1H699@WV$gh@?8*-A;Y=_DFuQekd9!qpid3o8?w#VWNo>tszMF3 zf)*<LT7^}qkOFdBE3Z{pT!jZJtU`sQs!*f1pt%YN#p)Dxr9uiw6}F<nE>+lt3Y*=j zFRF5Rx1^NUP`ntf)3$4!PNh={NS%(N(~&ycVHS=^ly^hANcG{sD-OqR+QlkE*sa>8 zautpiA)Hpd1qfqsk9_m4jvE}2mUC;(VQnphN#SSt=%ux;Vy!Fvd{kR7$uOSh-NFEm zb#a`o0^ju5j+kO?@#QIZRb&yN-L16`EA3K1Y9A`vhf@1KT_*uv2XcQI%KV-@tX|C& zk1~A0+VWdb-%MP%z6#5$je&y{S0OEz#(0V`Ug5ZNLf2uec*rBlT|;JMoj9G4sFD%y z!&P%1<PGjBej$!LyLe#6fR(`u<Yw#^QQ254pNo{YYWXW!m+voS>{`ZFACRvaB!g8h zaOwpzVauy99I&Xd$Yq^~@*JMAE%;*FoG!CE6WKkevpcx0%I|Co$ZQi5Q@$tDYnCp; zB=4Y9rhKKg7~-y^X+~|Dk#|;v>aGd3r>qZ9ELb~QUMmxWynCt3@nXJNIE-rE$PdGW zlHk%hv30|DA*e$d5mGEOMRqlO^&Smbat&XJIBB!+??6dNMipaHptx8i#ta$on=$Mv z!UjxRQ(f55s7q#LG9+Mev}V1ts(HwsV!q*gwcZzoi%h0G2){B`3P@vp#aN#k>qAsH zg|W@DYF8$dUTMxd)jX^hCN>MPTg}5e5cAE_Jgnx2#XLOpG87;NylVbh5zmig)UD@P zND>kz5Xn<0vJ~^WIT?v^E_0saN!A-cVv`e4`~xnL_X<My2H6%5X8wA)*FpErCG-XJ zY?}`&O+vOK26(5SPv<nEc_&JA&cYd}Xdoa~FXhPHh(a^5oTKq#H4B#^H?Zn2KumTT zMKJPK<7(T{i>PQkpzmPa1r6q5G9$TcMsyg=+F%Xara;!O$TDVm`%>qF{DFg#dBzUl zrPIi92L`YERTI-I)0pk^2cKbh#D{YlL;)9t7X-3R-e;X+Bi02%$kn=i*hl7few>@T zq_*srZtj+zA8)cw5TG;)0@i-^_2Z|{&VFuX5u8{2`)k!-X5>6v;r@A;^~Y(9a7O!! ztUsCsfk&NWc#iBSSe}~$Xssr*EH=iD@Atp&FUe9T30;M8tY0pZ3oDxCd{F!a=NKB- otgrrj=*wRNC(D<t`^6$f>llBz2ZqpJpf%fWZ*KgL|Hcjc4YZDGy#N3J literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dbd19fb9e5533a99579dede22d77548e9a856ae GIT binary patch literal 1920 zcmcIl%}yLg5bo}oogK!QAmUiY=FrBml$Br?V>_`CK`}oEON2w#N(c%X4cooT!0gP> z-TY=Zhk%sim^WCCd54_x7=6ttufQo)GhTufE4TEhtN*LNs`|QS`S$IAK>0nozdczY z<WC$7iw~VIpz1aVLAHpXf+ci|o{mG$Nm$p}awz$Rq}(Oa-4E0vCHNJqm2&l4lCn)A zTv53oTb}Sl722xwg}=|#jvSFyF>+4NDV$<WQVY)h2m%h}SnkNQm5Dg*=z4cQiFRb7 zi<KYVSIR?Q$&O4T6&cCRu6$QVseyMhahS+@xqqRR<)<p{?3x9>GVJpCxhL~{=ae_& zZkF<9l*egt@j?=}WUA!?Uv93>a4jWYf4#D{(Ol#0OmQJi6ek)~{{{Xc8#QXHhbqZ( zu!G_Z6l@)+D^T?v5Iy(?<dW<&J#Ofav`4@Rbfd;>CCQGZvSY8bmdeCgx~5d7K&hvV z0<Zi=lm`l~jvBd&kHF-{QKTB}ED=)aMprd<_QLRmex81IB%Zax{Ahm8v|n`gRPv<# z{N>BWn?@ezvvI0Tlq9n!d3yY`wReV-MGcQ+Dl*l$8HdI&4)y%hjz$Hruz-oCXcq*b z<5VGWu1!XB5h%7LlW2$bfl0!-AchR6VLftA2hJrKxWc`pmvj}zeP$}6BD@RIV>mvi zzmOgsct4Rg6;+t`%lS)S4$N1Dk3BIm@Oz*EnY0mo2=1Pqo_-IZ{+mwafiI(+4=Kps zvd3gdtXT0h>i*9pDu6%Yo12?_HREY!xD>H@7(C){c4N)kaUwai(V@w@k%?On#ZwOS zmq>qs{JjyaAXtC3ytdxtpY!j7>(F4pFjh?r%{qt<uyK2}PkU65NwP||Kkc&~6SU}m z(sv9owC7+j228L^Y9KhmnZ)oF<2L)%J(xNeKX4%ct{oY=Pg}2aprwb_Mc>sN>nfS6 zf-A6!oX+70tIt`#1r~HNb!z>g0(cFW01C#Jq6%=Yg2g1(rj>Q`rCGEAdFC-jN9ozr z&=vK?Bm?K@CFl${+e)NcaeVCv<YvK7RB|5#xMAWu)<+fsyUyv?@Ny5Bc>6f1brPA@ z9Q6TgRTC&iQQ-AA(2Xo2hLc<^&BKCbAY5|x;61>G``!VB7Cyy;Gavxa$0Z;EfCT*+ zo(=-LNA5rj+Rk0_79u85=WGm9=wrR`Sc9Ait|*6eq&@;g|3ZyvsvDhzV9`I=)m_;7 z3@<NGQ%n1n)JCkkr?V7OQzW#)C5&PutS2PoYH1zNWIcIeAbD6X$|3g&IF!ZUE$cuw zw3R$kMl1a56xRW)d)P;7tv~e5B#bmVmP~leV^huqb!kw1>T$6%47*XBhT&O#*O+{v z(HK&tu5;O{AMZxyxKqzm=Xycc5qvGM)i4xUD-6{G)Z_uGB;F~lx%Il6XUY_*){d1c zbtMlDB@h&!%JuC?;xGhrAQzh(kuNw<8nambYnE=oxxyHi`IJF|9HSGCU-2LM^lwi4 B^jrV{ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9feea2d8137f0e6606726e58369b87988d1ef3d2 GIT binary patch literal 5061 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..efe8e7c3fcfaff33c9e349c5c7fabd095fef0c25 GIT binary patch literal 2673 zcmbtWS$7mg6z-nxSu+zt#0A{iohZpDibC810Th?G#C2TS&U6Jj_VkR^Jpm#L65Pdo z1NB~_qTnuzprZZ=k1ze|lTY{ECvWvINkBYDk2R-mSAA7|Z}oSVniZu|LF0DBS@6)W zU7Gg0nzUP<2Ls&0JuF<UqPe=8^7UG(lG4@K@QsRbgXWrUdYk5^g)wGM8Wod~jGJX7 z%Sf7$G$T1T&q$t;3?msv3T_7@9l~TRJ84$3j1}DyW2FSkF_z=CyxS?vNo}l<$PSSf z8IcoNch2@~rRa85O2XLHDN0j%WsYkMYdv!(ek&9#ZtKN}2Ɠ)Y5x8|-E%r0t4P zFA#3B{^UQmmV)Jh<<%O#sEHtQBCj4;^-(KYC#(&<N?GqwWmeltU+cC0YQ3>hdTZB3 z{nlW6Xf3|<vc=ZOMr+usv7%w8;RVSl`hBk|f>88ZD~4AtvO*!OTh<J&8X8_@jn<{* zipcT&kX8S|PSASvxT_g>{8hsCy+}yM4~MF1rQHl33~&!E7DB7&?6{PhbyKdfO|Ka2 z2<0xlV!9b7D<7u^SywgAgpu^BQB}RJntG<W4{{GXSwz|{eUrW^6{V&W%lc4{5ogpn zs$tw&UFXP})36gJMBLeC#EzU1U+_*d6#i(O_JT$;iZepWx(xSfvV#@>xvAWc-nbKq z^0*_*qjldEGA!3*d1TDCmxfD%tH#|cs&-?1@ukt|(zRpKzif2LvSsDF$_=m4>jh!t z_<rw(MzH?!>ez$=lWvcTz^%*j>@X-F8wP!ijeHmtBjQx`ohcTYK2c04>1!?gCq|^A zY=#adhgHX&$&<sdO^3|!HmTA}s_aW>Xo;eFKht_|0gsP6QfpzTN0%lqwjb#@XWM~O z6Sf@}Y`a!>o4y(sZTqpN<F{61Nm=3)pKVU@FO^NH{CzU_P$|x(3Pyrdc{1J9mI3bJ zDJ-TVD?J@qCWl2P?p_mAWh-U;RSC6n^@%y0$7+s7l{S`&j48v_=WDDaH6(Rj>oF5L zWroKsp0WxxX4s3<oXw7Z9Dm7|p3Pg^<jw#4k&Zf-nOx0g<|+%_N}Qxb!c;=dj7UgQ zCq9dNqBy5ZHUFO!txQ7X|5Bt9v_;Vz9?hmmDyJS#kcxuyxu1xjqX+7n4z&{y^p8=b zBICTaVkSt<k0D6;bwF)Ud``!ZuACkhha)MR+PzZMH7+m5yJf~1GhwUJcA?UzQkM;? z`F}Ndr*OF9{7ZwUv4KUi466A==dl+;Pc}AH(#@n?-0jU|MXRpJW3U$6GA?o%W)8UX zk=nEM2_sESeWRW-%ycH3%NII|rOr8BbGuKPck(Hxo;H8M>1UjI*4frM=bm@|1s7hl zu;=1S7WMX(`O>-kiX~TGwRBnk)z@5m-Sq>@R}8LPwfcq|*W7gTEw>KccKaQ74&Qb6 zJ@?*sf8~J(A9~n+#2KmbwYGMhH}<Gs3+j!>WEeHa*KgQ3@%W}Ep4?2Zh2SZItpt+< z+X$W}c!uCvg69aHCwPJ2MS_<IwiCQe@Cw1J1g{aiPVff7n*?tWyiM>9!Mg-I2zC;@ zNANzu2LwQX1iJ{P2tFkEh~Q&_-2|Tyd`hr~U@yUE1fLUpLGUHPR|H=Zd_(Xp!9Ifh z1P2HX5`0H+h~O~6_XIx>{77(w;3tBg34S5mLiiNnR>DcbZG=w~K128{;d6w~6TU$B zBH>Gf+X-JLe1-5;!q*62CwznOO~SVb-zI#A@Lj?kggXh}BYdCm141A~!d-+@gdY-q zMEEh`Zo*FpKPB8lxR>xV!p{l6ApDZ>E5fe{zajjVa3A4*!UKc{3BMyeM0l9+d%_<G ze<VCY_!HsJgunE3#aY{S>(y4NA8kfW$)#SZ&}dalLyc5nN|G;02&sZJ&L_9pnt=aR zOkV|YL0wQ)+f%429dW6Bm5($%-<7K3&Z-{Mi5KUtX<akdsYDJhWMQU?sa(1{-<|GG Y&ok#`Og*J%_?Jq4xxBeq+pMMk0)Ubbh5!Hn literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py new file mode 100644 index 0000000..29cbf91 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py @@ -0,0 +1,231 @@ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { + 'unicode-1-1-utf-8': 'utf-8', + 'utf-8': 'utf-8', + 'utf8': 'utf-8', + '866': 'ibm866', + 'cp866': 'ibm866', + 'csibm866': 'ibm866', + 'ibm866': 'ibm866', + 'csisolatin2': 'iso-8859-2', + 'iso-8859-2': 'iso-8859-2', + 'iso-ir-101': 'iso-8859-2', + 'iso8859-2': 'iso-8859-2', + 'iso88592': 'iso-8859-2', + 'iso_8859-2': 'iso-8859-2', + 'iso_8859-2:1987': 'iso-8859-2', + 'l2': 'iso-8859-2', + 'latin2': 'iso-8859-2', + 'csisolatin3': 'iso-8859-3', + 'iso-8859-3': 'iso-8859-3', + 'iso-ir-109': 'iso-8859-3', + 'iso8859-3': 'iso-8859-3', + 'iso88593': 'iso-8859-3', + 'iso_8859-3': 'iso-8859-3', + 'iso_8859-3:1988': 'iso-8859-3', + 'l3': 'iso-8859-3', + 'latin3': 'iso-8859-3', + 'csisolatin4': 'iso-8859-4', + 'iso-8859-4': 'iso-8859-4', + 'iso-ir-110': 'iso-8859-4', + 'iso8859-4': 'iso-8859-4', + 'iso88594': 'iso-8859-4', + 'iso_8859-4': 'iso-8859-4', + 'iso_8859-4:1988': 'iso-8859-4', + 'l4': 'iso-8859-4', + 'latin4': 'iso-8859-4', + 'csisolatincyrillic': 'iso-8859-5', + 'cyrillic': 'iso-8859-5', + 'iso-8859-5': 'iso-8859-5', + 'iso-ir-144': 'iso-8859-5', + 'iso8859-5': 'iso-8859-5', + 'iso88595': 'iso-8859-5', + 'iso_8859-5': 'iso-8859-5', + 'iso_8859-5:1988': 'iso-8859-5', + 'arabic': 'iso-8859-6', + 'asmo-708': 'iso-8859-6', + 'csiso88596e': 'iso-8859-6', + 'csiso88596i': 'iso-8859-6', + 'csisolatinarabic': 'iso-8859-6', + 'ecma-114': 'iso-8859-6', + 'iso-8859-6': 'iso-8859-6', + 'iso-8859-6-e': 'iso-8859-6', + 'iso-8859-6-i': 'iso-8859-6', + 'iso-ir-127': 'iso-8859-6', + 'iso8859-6': 'iso-8859-6', + 'iso88596': 'iso-8859-6', + 'iso_8859-6': 'iso-8859-6', + 'iso_8859-6:1987': 'iso-8859-6', + 'csisolatingreek': 'iso-8859-7', + 'ecma-118': 'iso-8859-7', + 'elot_928': 'iso-8859-7', + 'greek': 'iso-8859-7', + 'greek8': 'iso-8859-7', + 'iso-8859-7': 'iso-8859-7', + 'iso-ir-126': 'iso-8859-7', + 'iso8859-7': 'iso-8859-7', + 'iso88597': 'iso-8859-7', + 'iso_8859-7': 'iso-8859-7', + 'iso_8859-7:1987': 'iso-8859-7', + 'sun_eu_greek': 'iso-8859-7', + 'csiso88598e': 'iso-8859-8', + 'csisolatinhebrew': 'iso-8859-8', + 'hebrew': 'iso-8859-8', + 'iso-8859-8': 'iso-8859-8', + 'iso-8859-8-e': 'iso-8859-8', + 'iso-ir-138': 'iso-8859-8', + 'iso8859-8': 'iso-8859-8', + 'iso88598': 'iso-8859-8', + 'iso_8859-8': 'iso-8859-8', + 'iso_8859-8:1988': 'iso-8859-8', + 'visual': 'iso-8859-8', + 'csiso88598i': 'iso-8859-8-i', + 'iso-8859-8-i': 'iso-8859-8-i', + 'logical': 'iso-8859-8-i', + 'csisolatin6': 'iso-8859-10', + 'iso-8859-10': 'iso-8859-10', + 'iso-ir-157': 'iso-8859-10', + 'iso8859-10': 'iso-8859-10', + 'iso885910': 'iso-8859-10', + 'l6': 'iso-8859-10', + 'latin6': 'iso-8859-10', + 'iso-8859-13': 'iso-8859-13', + 'iso8859-13': 'iso-8859-13', + 'iso885913': 'iso-8859-13', + 'iso-8859-14': 'iso-8859-14', + 'iso8859-14': 'iso-8859-14', + 'iso885914': 'iso-8859-14', + 'csisolatin9': 'iso-8859-15', + 'iso-8859-15': 'iso-8859-15', + 'iso8859-15': 'iso-8859-15', + 'iso885915': 'iso-8859-15', + 'iso_8859-15': 'iso-8859-15', + 'l9': 'iso-8859-15', + 'iso-8859-16': 'iso-8859-16', + 'cskoi8r': 'koi8-r', + 'koi': 'koi8-r', + 'koi8': 'koi8-r', + 'koi8-r': 'koi8-r', + 'koi8_r': 'koi8-r', + 'koi8-u': 'koi8-u', + 'csmacintosh': 'macintosh', + 'mac': 'macintosh', + 'macintosh': 'macintosh', + 'x-mac-roman': 'macintosh', + 'dos-874': 'windows-874', + 'iso-8859-11': 'windows-874', + 'iso8859-11': 'windows-874', + 'iso885911': 'windows-874', + 'tis-620': 'windows-874', + 'windows-874': 'windows-874', + 'cp1250': 'windows-1250', + 'windows-1250': 'windows-1250', + 'x-cp1250': 'windows-1250', + 'cp1251': 'windows-1251', + 'windows-1251': 'windows-1251', + 'x-cp1251': 'windows-1251', + 'ansi_x3.4-1968': 'windows-1252', + 'ascii': 'windows-1252', + 'cp1252': 'windows-1252', + 'cp819': 'windows-1252', + 'csisolatin1': 'windows-1252', + 'ibm819': 'windows-1252', + 'iso-8859-1': 'windows-1252', + 'iso-ir-100': 'windows-1252', + 'iso8859-1': 'windows-1252', + 'iso88591': 'windows-1252', + 'iso_8859-1': 'windows-1252', + 'iso_8859-1:1987': 'windows-1252', + 'l1': 'windows-1252', + 'latin1': 'windows-1252', + 'us-ascii': 'windows-1252', + 'windows-1252': 'windows-1252', + 'x-cp1252': 'windows-1252', + 'cp1253': 'windows-1253', + 'windows-1253': 'windows-1253', + 'x-cp1253': 'windows-1253', + 'cp1254': 'windows-1254', + 'csisolatin5': 'windows-1254', + 'iso-8859-9': 'windows-1254', + 'iso-ir-148': 'windows-1254', + 'iso8859-9': 'windows-1254', + 'iso88599': 'windows-1254', + 'iso_8859-9': 'windows-1254', + 'iso_8859-9:1989': 'windows-1254', + 'l5': 'windows-1254', + 'latin5': 'windows-1254', + 'windows-1254': 'windows-1254', + 'x-cp1254': 'windows-1254', + 'cp1255': 'windows-1255', + 'windows-1255': 'windows-1255', + 'x-cp1255': 'windows-1255', + 'cp1256': 'windows-1256', + 'windows-1256': 'windows-1256', + 'x-cp1256': 'windows-1256', + 'cp1257': 'windows-1257', + 'windows-1257': 'windows-1257', + 'x-cp1257': 'windows-1257', + 'cp1258': 'windows-1258', + 'windows-1258': 'windows-1258', + 'x-cp1258': 'windows-1258', + 'x-mac-cyrillic': 'x-mac-cyrillic', + 'x-mac-ukrainian': 'x-mac-cyrillic', + 'chinese': 'gbk', + 'csgb2312': 'gbk', + 'csiso58gb231280': 'gbk', + 'gb2312': 'gbk', + 'gb_2312': 'gbk', + 'gb_2312-80': 'gbk', + 'gbk': 'gbk', + 'iso-ir-58': 'gbk', + 'x-gbk': 'gbk', + 'gb18030': 'gb18030', + 'hz-gb-2312': 'hz-gb-2312', + 'big5': 'big5', + 'big5-hkscs': 'big5', + 'cn-big5': 'big5', + 'csbig5': 'big5', + 'x-x-big5': 'big5', + 'cseucpkdfmtjapanese': 'euc-jp', + 'euc-jp': 'euc-jp', + 'x-euc-jp': 'euc-jp', + 'csiso2022jp': 'iso-2022-jp', + 'iso-2022-jp': 'iso-2022-jp', + 'csshiftjis': 'shift_jis', + 'ms_kanji': 'shift_jis', + 'shift-jis': 'shift_jis', + 'shift_jis': 'shift_jis', + 'sjis': 'shift_jis', + 'windows-31j': 'shift_jis', + 'x-sjis': 'shift_jis', + 'cseuckr': 'euc-kr', + 'csksc56011987': 'euc-kr', + 'euc-kr': 'euc-kr', + 'iso-ir-149': 'euc-kr', + 'korean': 'euc-kr', + 'ks_c_5601-1987': 'euc-kr', + 'ks_c_5601-1989': 'euc-kr', + 'ksc5601': 'euc-kr', + 'ksc_5601': 'euc-kr', + 'windows-949': 'euc-kr', + 'csiso2022kr': 'iso-2022-kr', + 'iso-2022-kr': 'iso-2022-kr', + 'utf-16be': 'utf-16be', + 'utf-16': 'utf-16le', + 'utf-16le': 'utf-16le', + 'x-user-defined': 'x-user-defined', +} diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 0000000..295dc92 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py @@ -0,0 +1,59 @@ +""" + + webencodings.mklabels + ~~~~~~~~~~~~~~~~~~~~~ + + Regenarate the webencodings.labels module. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +import json +try: + from urllib import urlopen +except ImportError: + from urllib.request import urlopen + + +def assert_lower(string): + assert string == string.lower() + return string + + +def generate(url): + parts = ['''\ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { +'''] + labels = [ + (repr(assert_lower(label)).lstrip('u'), + repr(encoding['name']).lstrip('u')) + for category in json.loads(urlopen(url).read().decode('ascii')) + for encoding in category['encodings'] + for label in encoding['labels']] + max_len = max(len(label) for label, name in labels) + parts.extend( + ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) + for label, name in labels) + parts.append('}') + return ''.join(parts) + + +if __name__ == '__main__': + print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py new file mode 100644 index 0000000..e12c10d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py @@ -0,0 +1,153 @@ +# coding: utf-8 +""" + + webencodings.tests + ~~~~~~~~~~~~~~~~~~ + + A basic test suite for Encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, + IncrementalDecoder, IncrementalEncoder, UTF8) + + +def assert_raises(exception, function, *args, **kwargs): + try: + function(*args, **kwargs) + except exception: + return + else: # pragma: no cover + raise AssertionError('Did not raise %s.' % exception) + + +def test_labels(): + assert lookup('utf-8').name == 'utf-8' + assert lookup('Utf-8').name == 'utf-8' + assert lookup('UTF-8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8 ').name == 'utf-8' + assert lookup(' \r\nutf8\t').name == 'utf-8' + assert lookup('u8') is None # Python label. + assert lookup('utf-8 ') is None # Non-ASCII white space. + + assert lookup('US-ASCII').name == 'windows-1252' + assert lookup('iso-8859-1').name == 'windows-1252' + assert lookup('latin1').name == 'windows-1252' + assert lookup('LATIN1').name == 'windows-1252' + assert lookup('latin-1') is None + assert lookup('LATİN1') is None # ASCII-only case insensitivity. + + +def test_all_labels(): + for label in LABELS: + assert decode(b'', label) == ('', lookup(label)) + assert encode('', label) == b'' + for repeat in [0, 1, 12]: + output, _ = iter_decode([b''] * repeat, label) + assert list(output) == [] + assert list(iter_encode([''] * repeat, label)) == [] + decoder = IncrementalDecoder(label) + assert decoder.decode(b'') == '' + assert decoder.decode(b'', final=True) == '' + encoder = IncrementalEncoder(label) + assert encoder.encode('') == b'' + assert encoder.encode('', final=True) == b'' + # All encoding names are valid labels too: + for name in set(LABELS.values()): + assert lookup(name).name == name + + +def test_invalid_label(): + assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') + assert_raises(LookupError, encode, 'é', 'invalid') + assert_raises(LookupError, iter_decode, [], 'invalid') + assert_raises(LookupError, iter_encode, [], 'invalid') + assert_raises(LookupError, IncrementalDecoder, 'invalid') + assert_raises(LookupError, IncrementalEncoder, 'invalid') + + +def test_decode(): + assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) + assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) + assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) + assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM + + assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM + assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM + assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) + assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) + + assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) + assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) + assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) + + assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) + assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) + assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) + + +def test_encode(): + assert encode('é', 'latin1') == b'\xe9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf-16') == b'\xe9\x00' + assert encode('é', 'utf-16le') == b'\xe9\x00' + assert encode('é', 'utf-16be') == b'\x00\xe9' + + +def test_iter_decode(): + def iter_decode_to_string(input, fallback_encoding): + output, _encoding = iter_decode(input, fallback_encoding) + return ''.join(output) + assert iter_decode_to_string([], 'latin1') == '' + assert iter_decode_to_string([b''], 'latin1') == '' + assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' + assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' + assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' + assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' + assert iter_decode_to_string([ + b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' + assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' + assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' + + +def test_iter_encode(): + assert b''.join(iter_encode([], 'latin1')) == b'' + assert b''.join(iter_encode([''], 'latin1')) == b'' + assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' + assert b''.join(iter_encode([ + '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' + + +def test_x_user_defined(): + encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' + decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' + encoded = b'aa' + decoded = 'aa' + assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) + assert encode(decoded, 'x-user-defined') == encoded diff --git a/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 0000000..d16e326 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py @@ -0,0 +1,325 @@ +# coding: utf-8 +""" + + webencodings.x_user_defined + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + An implementation of the x-user-defined encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return codecs.charmap_encode(input, errors, encoding_table) + + def decode(self, input, errors='strict'): + return codecs.charmap_decode(input, errors, decoding_table) + + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, encoding_table)[0] + + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, decoding_table)[0] + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +### encodings module API + +codec_info = codecs.CodecInfo( + name='x-user-defined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, +) + + +### Decoding Table + +# Python 3: +# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) +decoding_table = ( + '\x00' + '\x01' + '\x02' + '\x03' + '\x04' + '\x05' + '\x06' + '\x07' + '\x08' + '\t' + '\n' + '\x0b' + '\x0c' + '\r' + '\x0e' + '\x0f' + '\x10' + '\x11' + '\x12' + '\x13' + '\x14' + '\x15' + '\x16' + '\x17' + '\x18' + '\x19' + '\x1a' + '\x1b' + '\x1c' + '\x1d' + '\x1e' + '\x1f' + ' ' + '!' + '"' + '#' + '$' + '%' + '&' + "'" + '(' + ')' + '*' + '+' + ',' + '-' + '.' + '/' + '0' + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' + ':' + ';' + '<' + '=' + '>' + '?' + '@' + 'A' + 'B' + 'C' + 'D' + 'E' + 'F' + 'G' + 'H' + 'I' + 'J' + 'K' + 'L' + 'M' + 'N' + 'O' + 'P' + 'Q' + 'R' + 'S' + 'T' + 'U' + 'V' + 'W' + 'X' + 'Y' + 'Z' + '[' + '\\' + ']' + '^' + '_' + '`' + 'a' + 'b' + 'c' + 'd' + 'e' + 'f' + 'g' + 'h' + 'i' + 'j' + 'k' + 'l' + 'm' + 'n' + 'o' + 'p' + 'q' + 'r' + 's' + 't' + 'u' + 'v' + 'w' + 'x' + 'y' + 'z' + '{' + '|' + '}' + '~' + '\x7f' + '\uf780' + '\uf781' + '\uf782' + '\uf783' + '\uf784' + '\uf785' + '\uf786' + '\uf787' + '\uf788' + '\uf789' + '\uf78a' + '\uf78b' + '\uf78c' + '\uf78d' + '\uf78e' + '\uf78f' + '\uf790' + '\uf791' + '\uf792' + '\uf793' + '\uf794' + '\uf795' + '\uf796' + '\uf797' + '\uf798' + '\uf799' + '\uf79a' + '\uf79b' + '\uf79c' + '\uf79d' + '\uf79e' + '\uf79f' + '\uf7a0' + '\uf7a1' + '\uf7a2' + '\uf7a3' + '\uf7a4' + '\uf7a5' + '\uf7a6' + '\uf7a7' + '\uf7a8' + '\uf7a9' + '\uf7aa' + '\uf7ab' + '\uf7ac' + '\uf7ad' + '\uf7ae' + '\uf7af' + '\uf7b0' + '\uf7b1' + '\uf7b2' + '\uf7b3' + '\uf7b4' + '\uf7b5' + '\uf7b6' + '\uf7b7' + '\uf7b8' + '\uf7b9' + '\uf7ba' + '\uf7bb' + '\uf7bc' + '\uf7bd' + '\uf7be' + '\uf7bf' + '\uf7c0' + '\uf7c1' + '\uf7c2' + '\uf7c3' + '\uf7c4' + '\uf7c5' + '\uf7c6' + '\uf7c7' + '\uf7c8' + '\uf7c9' + '\uf7ca' + '\uf7cb' + '\uf7cc' + '\uf7cd' + '\uf7ce' + '\uf7cf' + '\uf7d0' + '\uf7d1' + '\uf7d2' + '\uf7d3' + '\uf7d4' + '\uf7d5' + '\uf7d6' + '\uf7d7' + '\uf7d8' + '\uf7d9' + '\uf7da' + '\uf7db' + '\uf7dc' + '\uf7dd' + '\uf7de' + '\uf7df' + '\uf7e0' + '\uf7e1' + '\uf7e2' + '\uf7e3' + '\uf7e4' + '\uf7e5' + '\uf7e6' + '\uf7e7' + '\uf7e8' + '\uf7e9' + '\uf7ea' + '\uf7eb' + '\uf7ec' + '\uf7ed' + '\uf7ee' + '\uf7ef' + '\uf7f0' + '\uf7f1' + '\uf7f2' + '\uf7f3' + '\uf7f4' + '\uf7f5' + '\uf7f6' + '\uf7f7' + '\uf7f8' + '\uf7f9' + '\uf7fa' + '\uf7fb' + '\uf7fc' + '\uf7fd' + '\uf7fe' + '\uf7ff' +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__init__.py new file mode 100644 index 0000000..97e08d6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__init__.py @@ -0,0 +1,3286 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import errno +import tempfile +import textwrap +import itertools +import inspect +import ntpath +import posixpath +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +try: + FileExistsError +except NameError: + FileExistsError = OSError + +from pkg_resources.extern import six +from pkg_resources.extern.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pkg_resources.extern import appdirs +from pkg_resources.extern import packaging +__import__('pkg_resources.extern.packaging.version') +__import__('pkg_resources.extern.packaging.specifiers') +__import__('pkg_resources.extern.packaging.requirements') +__import__('pkg_resources.extern.packaging.markers') + + +__metaclass__ = type + + +if (3, 0) < sys.version_info < (3, 4): + raise RuntimeError("Python 3.4 or later is required") + +if six.PY2: + # Those builtin exceptions are only defined in Python 3 + PermissionError = None + NotADirectoryError = None + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None +add_activation_listener = None +resources_stream = None +cleanup_resources = None +resource_dir = None +resource_stream = None +set_extraction_path = None +resource_isdir = None +resource_string = None +iter_entry_points = None +resource_listdir = None +resource_filename = None +resource_exists = None +_distribution_finders = None +_namespace_handlers = None +_namespace_packages = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +def parse_version(v): + try: + return packaging.version.Version(v) + except packaging.version.InvalidVersion: + return packaging.version.LegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Warnings + 'PkgResourcesDeprecationWarning', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + from sysconfig import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % ( + int(version[0]), int(version[1]), + _macosx_arch(machine), + ) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet: + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + return ( + entry + for dist in self + for entry in dist.get_entry_map(group).values() + if name is None or name == entry.name + ) + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False, extras=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception + if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + + `extras` is a list of the extras to be used with these requirements. + This is important because extra requirements may look like `my_req; + extra = "my_extra"`, which would otherwise be interpreted as a purely + optional requirement. Instead, we want to be able to assert that these + requirements are truly required. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req, extras): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, + replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins( + self, plugin_env, full_env=None, installer=None, fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req, extras=None): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (extras or (None,)) + ) + return not req.marker or any(extra_evals) + + +class Environment: + """Searchable snapshot of distributions on a search path""" + + def __init__( + self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.6'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + py_compat = ( + self.python is None + or dist.py_version is None + or dist.py_version == self.python + ) + return py_compat and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match( + self, req, working_set, installer=None, replace_conflicting=False): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + try: + dist = working_set.find(req) + except VersionConflict: + if not replace_conflicting: + raise + dist = None + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) + to the Python egg cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? + You can change the cache directory by setting the PYTHON_EGG_CACHE + environment variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except Exception: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ( + "%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path + ) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def _get_metadata_path(self, name): + return self._fn(self.egg_info, name) + + def has_metadata(self, name): + if not self.egg_info: + return self.egg_info + + path = self._get_metadata_path(name) + return self._has(path) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError( + "Script {script!r} not found in metadata at {self.egg_info!r}" + .format(**locals()), + ) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + self._validate_resource_path(resource_name) + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + @staticmethod + def _validate_resource_path(path): + """ + Validate the resource paths according to the docs. + https://setuptools.readthedocs.io/en/latest/pkg_resources.html#basic-resource-access + + >>> warned = getfixture('recwarn') + >>> warnings.simplefilter('always') + >>> vrp = NullProvider._validate_resource_path + >>> vrp('foo/bar.txt') + >>> bool(warned) + False + >>> vrp('../foo/bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('/foo/bar.txt') + >>> bool(warned) + True + >>> vrp('foo/../../bar.txt') + >>> bool(warned) + True + >>> warned.clear() + >>> vrp('foo/f../bar.txt') + >>> bool(warned) + False + + Windows path separators are straight-up disallowed. + >>> vrp(r'\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + >>> vrp(r'C:\\foo/bar.txt') + Traceback (most recent call last): + ... + ValueError: Use of .. or absolute path in a resource path \ +is not allowed. + + Blank values are allowed + + >>> vrp('') + >>> bool(warned) + False + + Non-string values are not. + + >>> vrp(None) + Traceback (most recent call last): + ... + AttributeError: ... + """ + invalid = ( + os.path.pardir in path.split(posixpath.sep) or + posixpath.isabs(path) or + ntpath.isabs(path) + ) + if not invalid: + return + + msg = "Use of .. or absolute path in a resource path is not allowed." + + # Aggressively disallow Windows absolute paths + if ntpath.isabs(path) and not posixpath.isabs(path): + raise ValueError(msg) + + # for compatibility, warn; in future + # raise ValueError(msg) + warnings.warn( + msg[:-1] + " and will raise exceptions in a future release.", + DeprecationWarning, + stacklevel=4, + ) + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_egg_path(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_names = 'SourceFileLoader', 'SourcelessFileLoader', + for name in loader_names: + loader_cls = getattr(importlib_machinery, name, type(None)) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + module_path = None + + _isdir = _has = lambda self, path: False + + def _get(self, path): + return '' + + def _listdir(self, path): + return [] + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with zipfile.ZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + fspath = fspath.rstrip(os.sep) + if fspath == self.loader.archive: + return '' + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp( + ".$extract", + dir=os.path.dirname(real_path), + ) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def _get_metadata_path(self, name): + return self.path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.7 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir(''): + if _is_egg_path(subitem): + subpath = os.path.join(path_item, subitem) + dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) + for dist in dists: + yield dist + elif subitem.lower().endswith('.dist-info'): + subpath = os.path.join(path_item, subitem) + submeta = EggMetadata(zipimport.zipimporter(subpath)) + submeta.egg_info = subpath + yield Distribution.from_location(path_item, subitem, submeta) + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: + raise + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + + # capture warnings due to #1111 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + loader = importer.find_module(packageName) + + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + new_path = sorted(orig_path, key=position_in_sys_path) + new_path = [_normalize_cached(p) for p in new_path] + + if isinstance(module.__path__, list): + module.__path__[:] = new_path + else: + module.__path__ = new_path + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path = sys.path + parent, _, _ = packageName.rpartition('.') + + if parent: + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent or None, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) + + +def _cygwin_patch(filename): # pragma: nocover + """ + Contrary to POSIX 2008, on Cygwin, getcwd (3) contains + symlink components. Using + os.path.abspath() works around this limitation. A fix in os.getcwd() + would probably better, in Cygwin even more so, except + that this seems to be by design... + """ + return os.path.abspath(filename) if sys.platform == 'cygwin' else filename + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_egg_path(path): + """ + Determine if given path appears to be an egg. + """ + return path.lower().endswith('.egg') + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + _is_egg_path(path) and + os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint: + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = tuple(extras) + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + PkgResourcesDeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + + # Get the requirements for this entry point with all its extras and + # then resolve them. We have to pass `extras` along when resolving so + # that the working set knows what extras we want. Otherwise, for + # dist-info distributions, the working set will assume that the + # requirements for that extra are purely optional and skip over them. + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer, extras=self.extras) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + def is_version_line(line): + return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution: + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__( + self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = self._get_version() + if version is None: + path = self._get_metadata_path_for_display(self.PKG_INFO) + msg = ( + "Missing 'Version:' header and/or {} file at path: {}" + ).format(self.PKG_INFO, path) + raise ValueError(msg, self) + + return version + + @property + def _dep_map(self): + """ + A map of extra to its list of (direct) requirements + for this distribution, including the null extra. + """ + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._filter_extras(self._build_dep_map()) + return self.__dep_map + + @staticmethod + def _filter_extras(dm): + """ + Given a mapping of extras to dependencies, strip off + environment markers and filter out any dependencies + not matching the markers. + """ + for extra in list(filter(None, dm)): + new_extra = extra + reqs = dm.pop(extra) + new_extra, _, marker = extra.partition(':') + fails_marker = marker and ( + invalid_marker(marker) + or not evaluate_marker(marker) + ) + if fails_marker: + reqs = [] + new_extra = safe_extra(new_extra) or None + + dm.setdefault(new_extra, []).extend(reqs) + return dm + + def _build_dep_map(self): + dm = {} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata_path_for_display(self, name): + """ + Return the path to the given metadata file, if available. + """ + try: + # We need to access _get_metadata_path() on the provider object + # directly rather than through this class's __getattr__() + # since _get_metadata_path() is marked private. + path = self._provider._get_metadata_path(name) + + # Handle exceptions e.g. in case the distribution's metadata + # provider doesn't support _get_metadata_path(). + except Exception: + return '[could not detect]' + + return path + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def _get_version(self): + lines = self._get_metadata(self.PKG_INFO) + version = _version_from_file(lines) + + return version + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + def __dir__(self): + return list( + set(super(Distribution, self).__dir__()) + | set( + attr for attr in self._provider.__dir__() + if not attr.startswith('_') + ) + ) + + if not hasattr(object, '__dir__'): + # python 2.7 not supported + del __dir__ + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if + # found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = self._get_version() + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """ + Wrap an actual or potential sys.path entry + w/metadata, .dist-info style. + """ + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, +} + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + try: + line += next(lines) + except StopIteration: + return + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): + return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + py31compat.makedirs(dirname, exist_ok=True) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + try: + mkdir(dirname, 0o755) + except FileExistsError: + pass + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener( + lambda dist: dist.activate(replace=True), + existing=False, + ) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) + +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d4addab5d5e5d8e363111d099247971b5c9283b GIT binary patch literal 99636 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%0A9&jbHn5JtvEeRm{M>y>^aCI{U=ADvHOQmhC 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 WS3hXi=L;)<*veku$6a0BTmLuJXaQ9K literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b724cc37cc1f1fcfc4d8c4f1c0947538b5bf4c02 GIT binary patch literal 646 zcmYk3%We}f6o!xOnPd_rp(_@BgIToGCaq{CgiukcBB6qm3fhs-FpQltmyAcpPDrZ2 z0`VZQ<Q;etZ&~FPSYZbhaV-D#@%8iXvwpt|Hh!kNZ}%y{FPGd0vz@25s&`g6a8g11 zw<R&z<}{|9a#pdK7kdPFhx@$smBhaAidOT2w*@WQ9xy10yx>6zwMT(K9Ebp43%~XR z6rH%k$ppgg#@+)7vihN*mco>`=AI1~r^%vN<_Wi`<7jjZ82A@Bz3BM&q!yLd+6 z6D4r>a82-FO$(-3;gt-BU+gN2Y-c~yYq){hDhGQlxeR?nr82=REd|d}nfA-c7*V3} z1!65tYdpSwKDi2+@tRbBFo9U+N++^3Of0h>fISQJTSpD%i&TqfkzzEJ6&I+Y8Ak7m zBso#X^`iwp%93U=JkZmV+XAb@>GA1lbQLvuvzOOOr&YDLZ0e7rthkGm(DO!1S*fTg zZxa+s&M^}<Ta6AgIkP1D&C2wWd+cO%7&v#f|4AqrkR4laV8=qbaRzQY*Jt>^Hn`)& z*&CAcu#0XA+g7acD;2lIQVXonZQCAU*sGhN=`HM=a#<&NJ(Xrq3&GVt0QB8r=f!{0 ccSi<~XOhn=@x=YDazp{Kh4xst*CM<051@LQYybcN literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e04f7474a9400c00140b6f956a9d9013e1e756f8 GIT binary patch literal 209 zcmYL@O^O0B6oezV7z8ii4O}?SUsM=GJb)YB%A@V1B|R|-@1^6<jl6>=aqBHynO=wm z^;J=;TD99Pk#x^GyE>mWK5C@0Oy*{S6dTcPtZ#zq`HR;TJn5JP1u-KioRNwcjs*J> zamEunjdGl$kHdZ_W`~l@pqR|(um!JuPg@R|F}<_5r%_&BfmNt{aLzFJ{{xa@S5dAQ cFe)n@0iw1#ApZKx<LB?_WM$N%{=~`R4c6#76#xJL literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7e297d012970e83a31222f02d6ffdcd12e0ef83 GIT binary patch literal 20697 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95f1a6a32801dabc4790625c9f82be2d4e131f6d GIT binary patch literal 203052 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..723f78a70953c0cd569b0b4f91f3644e8968857c GIT binary patch literal 24410 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 GN%_B>V*aH7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py new file mode 100644 index 0000000..ae67001 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py @@ -0,0 +1,608 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a9095c3ec7990b37b68462fb3a5e2e53948be5c GIT binary patch literal 745 zcmYL{%We}f6ozLqX>)7Z096;POeGePXq<+&v<RWnc8O4>A{HYd%bDYuxSg>rUj{OJ z9)@?|Ay{Y2idSHT-KeUq`E-u;`}kbuVmRzae*L1)zy5AT(VyTvtgbiC{b#N{AcDAz zsyL0SR@$nPG>Ic<K>}^qfKBK?7kWiEZ9_lZfI+$mTWJS|X&1KB9_*xj7^MSv!g_mA zx&=>fqVco8K58^hRy%ZVWa%s;yi!uzRTp^84VPlItuz;w<W6KZ_&q`_w<RNFH6X;e zs-k-7oem*R^Yv-XbhzuCJ|WcEh1A~mH(5n_xz?0CW5R?mLqamCmYNp}8)S-RceLQ5 zX!b9qX2@Aya?6=Pxzy-->B9-M7BSPjSXisfTZ{{C7j8buWQEmIQT!ODeRwiCZN^tp z&=Sy%b$M<P6@a)1WrCw6%A~NG&z+UpG$Xi|o|}8=gv)0C;^qqZ*FX5E3x+<flYfQ2 ztSd#c$+X$Ke5eA=riVud9w+Ff`7|DeHssDa?aS4E#F0({+8&{AwDdjE8{ud(pc4=# zuX_RE@6dyQEsvj(9tAt#-w*7kQ&Y=uO*PJC2|gcOX*|Cr<kTFCH#Hn(MAfsY%}<M4 zT^{DgXJ_~`R$Lu$VXS}q;JXsvUT3!rHq1I@r7R6rcLmYRNT)MqFsYdUsULfaeb#g7 h{JbV=x$3^FB)F2j4;7hRkKLpn_mg()cgyd<_&+?s;vxV5 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97a48b1350aef444aec7fdad6861d2e16656cb76 GIT binary patch literal 583 zcmYk2OODhq5QdXZKazB35E3g+KraUK8Zjdwgg5{jW@QPL+_5|39=}w!Gc;>1!yPzD zwyfp~tgxpA!jeC^qN>0C{2#lnEz<ePo_;B3Me!>ae@~qrAJX;L3B2H?Ds)LpJ)<*S z(W)%?j8|%|7j&VQbg5T#rE6O2hBmsTtzOf$-q20zoAU)<@)fUn!&|-{YTEJ5=VII4 zC*@*WO^?{lTNQ%<sh!0z)m)C!OKYYxhtdStN7IK?-<Nr!o>~AF!;M9NsRQV(JE9zJ zLMj^op_x?axdu?O7siWI;iJ|JkEf;}gUa7m01@S>VHB9R0^mCB!5j{5GP;aqMveuW zj8(#??OFD+k0D|b!xUnHRmMCadto~pldaQm9{Eq<LH}XXza`lYQ_1{~0w3q@jNji$ zieY3ykdYzTTg8)6qLJ(l0GIy4ydC+Q9^ClqMc7{s2UIWj7gty0nmFmsrSTzYo_}@b z?sb3oM!X2o1#6Wj?sfna-bU<&Col@bEfUB2TQ*2D5CCap^8ef&r}~|?JSy=%|C`Tg KJefUPw&fp!O`!V# literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3e28247a1b87928c7b3c4042fd53ea57694aa0f GIT binary patch literal 1035 zcmah{&2AGh5cba|*@iSdP*tLE2p6Or$U;j+D^(Q&ByJTF2#FQQa@XE;)BVHtZb?*5 zt<*jS9C-(x#8*yz1x}1NZ7AZvNHaS#UVk(5jh`<scM-@BzW(t8Md+ssu7!Z}3{<}Z zBapx;%5aD?5|WID6uTTrz0i~1q$SWDB<K+d+l$D9s3SY-rSxMQF6C|6bzjjE?K2eK z666gUb}j)M4XIt>2f9crBUzG_g)-I`NuB7V$Zfw=Np4tN<&lAS|I#&f3EiRyyW1cx zXoGe@^#d@k&^bECF%ejhGhdJkd`iC%gTCSuBB<~Z^v#3vty$0=fV@zW8#&;E1Fq#D zO1aj9<HQ_7CX<FYiBa=s1mFvCWu54CFcO7Wppe`w98y7{j5oXQ(AXcW-L!~!s`o~V zROB^K2)VD*+n~A!<^rGK3v@zH9TeXG4tSPEskUCuGikf#Fwx94t}PZrVq0_HbI{5$ z^6NAJ3Tv1!sJRN_A{A2UAXCA?gt2YCl|QY;lZch|#v>DNk0&a99B=LH1aE^fDIX@e zHatxqelGLl&1f<Uv@}&|iXzoPc{FB9>Y`GS)B&qyE(#TtJUZgzBp(MXDzcKBQ8~38 z#&UVg*gZFwTOq=;;eTlvUESJ;p?&aSV#aKjv8)hP>iiyKpDLctPt*$FHbW1Ia^$Jy z>xAlqXO|X)--WR0!^g^TZC8wRPmil9YZiV5V?8r1Wdl5<bGQcB-TAjtQ>6d*SgWp5 zv);}cRcjCpdv1idGL?c6lw(7=$E4g}mg=dty&84|&z&WCTv+=0{f0A}aA=h6fdP7% n>rC5jv+yR<pf_FJFilVX?wqkbS3<kgD)DI__dO5$q)mSVyP68h literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b630aec4cbb0e1e217a887645cd6e34218732c57 GIT binary patch literal 2887 zcmcImOOM+&5GEyCmc8CxZ?bt7EznaTpd012$Ob8b?E@`(@uhn*P!L*?_R5hZg`}Kh zk(&b~e<lARzeLxb`WJfY482P2g;cqZ&>)A>ko;zbGoSq3_I8gz`w-mz^<A5g-|(Sq zEtnibS3khO38yic(Gi_lBWq@lY)XD2+~W2d!fnx7*rT>+FUY73Z(F<#Z`<arBOG|^ zaOW4|b$*AFh-VkO!Kq5)TniS>vQ+BA<<UG+QJNGxnT!(6#(5HIcn)z#*({hGLsus- z2r{Caj4V#M^@faWZu1sMz~&CfHt%p3q{F+s2eQMrcps$8xA_jpF5l$?kUhS~uYla* zSHZ&l!u>fJM@gh#g%m)rp~U_@bcI3T6joY82>~PTiARf;67g6%@MwlV-umFgJkY|Q z2hty>F&9$#GwGjB89P#k$)h=c7_w}B|E?Y%O{OxwH$Hs)*gx^JC_9J}rGq#=c$p<H z9)#0#UkROOI!$BcXU`@~3YF$E6v}6Fk?>UdSr9%8CQ&l+nbI;3bq;IpWUmUB!Rkyh z)<xSfe1x9wl^)(HwQH{0u*kUDhlwVdz9tL0K$q#zvx?SPpw5aG9_vxrfi-_QE?sy; zP+Y?p9#93k)P}|!Sc0-DzCW6SJ<EU;?Npx$c^S)LEY^(et|0BMxQDubh9kG(s45h} z*p)gI(5<0d3gK%A;gl|{GK4+IbiCsv6h#-d#(`3dT{v22fOyW>wHgCZS8c!!?9ik% zpieGLkOTB`4~7QR1YEmWgNnK})T&E7S-r$M-zIQPpVgqC?tel7d%vhdL0`~*Y$(@! z(HC)}#b78VfsW>)OtP99=rERu31eTvQDq4X$~{nbMmhBQSS(2}1N5TD*evCFjPpKY z&+{N&Y9tn~#A1?oof4B>VlK+7IPBwqnIUiB@R5a<GptBMR9LABce$2pum6lb1l7le zC3y_}6B4bw4(Hd0{DNc8y9Z^|mWfnJIVM6L+G{w4p5MBBP5*}KBz_v@77W#wY_8<% z2Gk9?uCYwa)%z=8H!57*i0+!9Fv0FOL1Dp|Xv0F3f6sXv5spdf!v^3_!*!;VjvAmh zBD}S)Ru$oyf_>5ewGrzzLm@3ZZGzg2`V2|b6ao^@w<|C=D{`}BJc*wZc?*ZzIQ(aF zLmv4GdL6l;e&}_OU&lHAGlG9Tn6MHvR^tD;!bwl3BGkr3!%I~xTDadV`S~gCQAn)& J_TX~|`kxO=2#){& literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af9134c11f488ed84ce459df0c9738f29453f57f GIT binary patch literal 8895 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 bG^|`<k_;gXWAZPU)`6^H4Os76mNoHzCsx~z literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f541ab31008e0a029a524543293e805c5f0f9200 GIT binary patch literal 3900 zcma(UO;a03wtGezjXn?pV=&lB#`q(a`4CR**j_sh0?S?!5UjunnUr^GP&atw`A~XB z#8z+)!KvCx)!z08;Nw>9PuR=e_q>O`?#X|F)4tb2fa4riRKI!s-s{)h@3UDL7|0R$ z{nMRzst*zJU!3%RX+Y*-#6ly45k`FyP@4vttp&QRQ>1Br%1)_o+D^k)_l+Q9X9CkU zgRGqma&}J1rGTEd^FhHb1OxU!P_&D|pgpK~Y2cOYA%z?MaB#*R0X)M@|7<X7j|OA* zn3`w(bHTVh9!%I1!Fl^UC65WqvHWYo^8CWSZhycFJk|OT#z$jhpV}55VugKraPbYX zCjlQg!Y=_{Ji;#nK6r#*0lajCUj=;V2>%%H;UoMSFR(M9yUZ<~=jDCMtueAd?CX3` zQLgV(wf7XCVk00o&8O@cUSwzYDI10PEWgHQ$B13wGqC<DpFwGu&+$n<z~>O>m&OPi z1KAtA$R}E#@O0}_7&jNlzGmM7+W2p1pYdD#vnsJ~!x?TXt+#txS&5xv<A2rJ1ZcYh z`Y-c4p#KVtJD`o)clq6eKd|%c!fWz|Qo^(RE}ZiN;N0W)fb-!g&ged@U>^Z*l#c?> zI_7<B-{<%FDBR+6eh+r}T;1pauN>oF@M*wrsM~$PA1n}%o#z=o4<|7JuYxBpvPtmd zBwqkeE;4PMlrO!-NG$7e(A|n7zmsss3)+!Lq{+NpFZQBP7TdxL6KA^<HWQfF%PE<U z6QJ#^CoV{4dy`to<X|Mc9WQkK4gMl|6bV^eb4AQ+FPglKYs+bwv$=>?#Y!Z&Onnmx zCe2mFbA6d^@E!g_W)`Dh%L{p#%FMEtaN+uZrrW6MEyeR{GQU!7d{t{WwavALG*(>k zoD00hGT(8VFW1|=>1}&l$m|JPI7Zib(!_iBf2eaFMqC2GiA@=?HAZb+*+`eeOX05T zd#u5~?|6a-JWRS@<}CPCL(A*&EOElLesE)JJL-gN+Umqy#8&()>i7&~wz;s9$Xctd zS-0ly%qk^lQPXikH{gyVbB+^4tm7kIaGdWuu7AYII1Y=Nj`MdS&ci_!IQ&Zm+_UQ@ zyt3<x%68;4*sl_Z%2vy9?!>pk+q>*$(`oO1GM8-M*=Y&?#`dkdcPkr}w%4BV!Z>k# zf96Fy{NdAPt6PbA(rG7A<j0lv^BqU<IO>Qdk1NhD4_PECZMXT{1t0HJPF*;jZNC(w zaHe6jB9t;>>S}&SzdNK)59zf-T0W%HhxFbdo$u;1&a6z~t-9&&{%k#+l6pt@(tw~5 zZu|(`n`=d0xUPasnl5X(O|ZGlI>P<IiNU!|9rnN<e$jo4Fk-B;ds>UMO-3QOwYnr_ zD#}2G(4euTzNE>C?ZgG(Nb|n$23yR1@ENLrLBuT5v$&56qIWjK%c;#wK=vR?#);ZW zVC*Q}WnD}mK8;|ePwj1sJ1X^e0a2StBT&Kn&L%0~s!c`!Nyr}Fio(!-(Z-=fz=pIA z+n}}Opwmw}2Yd<nIB-G$m;GO-`MiIcCLqT@yy`rR_!@wB(}L-*2{fe?OT#zK43>ef z!Av+=R_0IV$-h(uu-w!6F`H9y-{<Uj5L>7DR<EK!YC)=aNo+ytC-Jlucbd;ENG*&U znDzZLt+YL9EKgf*$gExz%~}oDi+OClpSxBR!g;n_=D(cTjzqvQF^@A_DeE1em!3_u z1OBjCV~8ow{0ESi#e^KtJ^F^e(!L?#e2OI6^PH$t@(NmacQVl#JxJ}*J-wC2!L%`g z9(+Uh>Cf~V0?iyGf6_O}w<Ody(aXjjaSZro#NQJ0z(fqRr}k2<toRvVPQh&aE8_95 zu!D}eP!3jRLW4oHIGH35l!EvN!h?Y~pnV781~`SJ2sCKNfDZyz68}aRYHD4HVKAra z-Kit1oi@xgx*>)ZEJP$MH?byvoVzGqO}@oU=nnN)fFCU7(ee;PLhVmamKwE{T75(2 z)$(3a3tXcrgf!3vZX$I*YKqH9z5+m+P!ZGuX~fNEP;;db@&sh04mC<#MH$15mpyRR zSzJ{?Fb4pdOe*I7wj4g?RmctOSW*X?q+I5dZsx!)?-c~c@j@?goJ~*`PXZuRqeWT* zn4;G;lNz+3{!E(F3_1aLcjQ#e&-N8Gu`=NgBM5J-BBu+;9%+#s`U<?zqT>1<J%B=T z0PW@=m86lj4>5&*6eSHYj}i%ZxMd(mQBAR_*69a2(9L7%tY|BGO3|}DI!j|5zQM|2 z)S>A9IQQzQxCjU7rspk~bkq0nBd!Cfoa?#a$i(e7R1t9-7&3)b8T<k71J0De!5N8A z4(pj-6Aw@jdvy~3*09jOKpNT`h{Rag2sOce7hsfN46D&S^R6Y;iep2fL63`L5hh?Z zl7Jb}EO0rk-W|DrO2IW1qU8r=P2E5|h9%Gv@Q}Yf9duy9+i<*}fT?;IdC#pqfqFS3 z#!$mK1mg%M5TJL(5`r%g9QWuRrb_>(!1xMAjL~2ksf>Bn91=(^Kg7<z-AOtEIzRq9 zK!lC}uM0Nsg|8;K{oy-}c^1kY7a=rYjA#gPfn`b<2r>v%rezVs+9mP`3J3-epbaHm zwy*rI(%5@38$`Q2o`pQ|y)7|_Yp{38Os{Rl0{*2Ty-t)nuE?=CgH-gfN=}*k+VwlU zhLxk2^#g9)^gPGs37kHb27`BF5=*nXy!OXx{mF_n<4(H`&kvw2FEpx)U)46G+2~`& z@>;b~t4pKN`=%FHS5~U<+N-TBEv_!F)}>a3inI2lzPRzEy0HX=;?hH?LQ9X9@YPrc zYoE+zs$N~G$#iXVqfwRmlg1K)Wtmrmb!T~LeM1_(33y51D-}aoX1=a97FO45pzLvd zwNYEF0$v2-I_&7cBk$(Txs&;F?QwPSTbb|kSL-!d=ucLv^>3kd_owS?wMAKkO1FkJ zx2j&=C&I|JOGi)O_1apkQQcU@cd&XC%i+G3YW<;eL@UCDoKy25yz)cmRDl+^(62_c z)#A-W#pLgWFua#~&(jAOn6V9D1WKZ*oue19C~74-qL+-4)+>=m5F|>F<R(o4-9#B} b1O`%zbc7axTGWa(1qC$)d|0KAXa)U$l{)ch literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6fd86f310929830b799ede864c27bdfd173bae7 GIT binary patch literal 19813 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..426e5676230a4e4fecb44c7fc7d1ec78572257f3 GIT binary patch literal 514 zcmY*W&2AGh5VpOWG)jK}!KrT$q14b)(Mkv*xcAbY7FCvGJ1eJN+ZubfCE|j_gCqwI zyaP|-D<@u|C+td<V5IpxzxrmzANTjCD9bN?c>Mz-^t(8ZQf1>q)^MCbB8d&^aDzM2 zkgjSfTw=u3O|9z9NLE|ijAboH-%+z8$t9YN|KvV2tI`v`2+s6TG2M9wF-@c%bkNSG z0}t9pw(PBl*}qtiKhN3G^-Gb5d64qfSwCeBPcuZc!4iK(Te2ZrlxfJtJ)UQl=S*<x ztQOqpwPK)Jb(gBpFVe`kTLm+mYRfzI6G7Se{u|BQ1CNRh9O%*+sUXk}=wij#Sva+C z2l+-YKODb`%d>U`=JoRQ{G47<ul-!x5V<k)J8y4K#A;20ioK7{nLzzbo9Tn=L8w64 zpsaL2Jr_5;)wZR5)FvGHFX`ET6PMxk%9<ntB2etvBu!a9PwYW41|<XKU!dG15m0GI kxXx>%U|hnb=V85nV7HV`-gQp)M!heMq13)0lWJQ11wJ5)od5s; literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0395df3d48ba38e0b1892aaff1966baa86e457b4 GIT binary patch literal 10580 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py new file mode 100644 index 0000000..892e578 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pkg_resources.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py new file mode 100644 index 0000000..0c8c4a3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pkg_resources.extern.pyparsing import Literal as L # noqa +from pkg_resources.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py new file mode 100644 index 0000000..cf75e1e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py @@ -0,0 +1,5742 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2018 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes + - construct character word-group expressions using the L{Word} class + - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes + - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones + - associate names with your parsed results using L{ParserElement.setResultsName} + - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} + - find more useful common expressions in the L{pyparsing_common} namespace class +""" + +__version__ = "2.2.1" +__versionTime__ = "18 Sep 2018 00:49 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + r""" + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted); if the parse action + is passed a tuple or list of functions, this is equivalent to + calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py new file mode 100644 index 0000000..c1eb9e9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if prefix and sys.version_info > (3, 3): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'packaging', 'pyparsing', 'six', 'appdirs' +VendorImporter(__name__, names).install() diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0e5398e74c1c7e87d5c9207d01435091009b744 GIT binary patch literal 2428 zcmZ`)TW=dh6rS0e9mh#4gc4doG!lqlsf|l7q7|hov=ypAQPotXSd`VqGfvi7?`&tr zNo+PRIN}lU!h7?`f8dFqF|R!JFYv@Uv$oSV>a6C>?C#vo`M&ebH%m(m0_E@I;`4tN z2>BOZX2pljU8wpJ7*06NNQZn&xX1lt!u^TYp*-k#f(l=F6YphkLMV*dBCYTh%pjXx zw6ii_?Jj%~1m=>C$7#ps%RJ!WG3^8*<PonOlL_ra{2Z_I1^8Oy4Ze6xI(6RUOVBQG zA9grzm!FE9OZ9M2NM(c?A2%43ui2vqkJz;<SJ^<AgcXU|W$APX>q*6WY0lGphsnaE zGEcH>ba~$`B)D4uhDft3)Iq8R%M&wHZcLhM10BI($?jgVBQ)zNIbcdk6X(f5Y`EEf zfz!d%V{EbBgQ`CTQ__;e#L&{4V9zW4Vy&bveNMS|;=z}I6L8Jn>_p-aT*_@NuFlp9 z?ZSK~>uX``^6b=ZcWrA*6j{<0wo(0vi@lvzU;{0(o(f@iRYL<96NOMX^WUglsB}Lu zqP?G}c28zpDBT{Y_I5vxZ|WQQ7yJBrH!k+CUNOC!JAIXX-n((@R{Kf2NQ=wUpj<vI z@`G#L{<sYX8x}^&Ot)eCSP3nMsw;H6@~0igX`Y%m-Y7=4K6^m|>Ie*>5pB@%>eDxX z-I$H*QXB&XTMsJIORs<_NgsH(N}eMBJZF(3!T5Uz3i4u0B&xd$=qqg);LEBg&CtY8 zIZHH4W|+_ZRJh_2mTp+G*`h9n(BQdGL#Y<w)h=qcPmH`fhsSed2%B_#@hz`j8`woW zuwW48jJXLfzz%edqH`zoC;!Ml3Xa0kS8LqcBE~a*8TJDh5l(<p`Z|6s9f!uh&0T*C zps1W75!eB`*&AjVQkDUwmC@`Vg(R8NizPY7aLnh!pdDe@K=NTGSgM)KXW@f%FuO_) zcXpwLKeJ3b4Vqd4H#S?5T_|9$6m!n8(fUa~vi=|`Y@<2`p2Bgo6}iyb`s|!Gz;N0C zk7$GKL<<{LhdL8}%<i~4=_+ijn_x(|LIZf-gL(#r*Cuq4Q&{RyF;DJ6)qj9F1A~V^ z92y9`cb`0eb`*~8lwldHlA{P9i6)d16ZFF}x<HO<WzF^JZBmBnXXr=V+Y4L|Mtnue z+7_U0YI_Z3C@`3kAIXcgXHb8DuiWp~d&DeE$nSJQe+9)weI0){hvy+E1tc(&`$8dZ z0JNjJlRhI^CcF3>QO#t+=jgwMQOkRUG*lPCjQ@NB>#YA$1^H-wmJ0~J5-*0S68uY+ zOEo}koI<bJ_AuwDkd9A|4^ypVTC%jqMsmoIN$%G{qH@sTOROt%J<O`4oQ?+xcB2*J zsWvLz9wKixHd_sK9?$6H4AaXtKpdR9$1%v_2xPDVU)v^xL&GdkoSw9c)iv=zDXDA( z_rM@AHp0+kx>c`I`F&g(<wPNM)CahJR4CC)51k+<xdFmTeui`y)+y;ehDmx23<*|f zlX|ocPlGn1WoQGsOdFm@BmWEyUt8i0nL|h%4H1@-7|?>fnp(m3CEOS%Ks0yZdgI5Z zgs85nH#3r@IdB0Yw1M}c(<g)^mxd*o5(ytMa8--kobqC`<*N^2U%N1$W22-fK%U<r zf3@k2a2IA((iecBue>FF(?KoIMG_PhfW_+oH3@J8Oe+wf-;CoI!^Ei-yw&2E%WfPi zOlw;&lq`fYBZX8@7tnlyW*v<q^Ql2~R+!+ZuTB=~LEtsQX1&p@f8_qaZ3!ZUmpkwh zx+735ja^@-hqeZebGSWPp^J%|VM9E!R-fVG@7mSYZ&&Wz!F$VHbaj9Een9^R*_MO> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py new file mode 100644 index 0000000..a381c42 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +import os +import errno +import sys + +from .extern import six + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + six.PY2 or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/LICENSE b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/LICENSE new file mode 100644 index 0000000..6e0693b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2016 Jason R Coombs <jaraco@jaraco.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/METADATA b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/METADATA new file mode 100644 index 0000000..571a5cb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/METADATA @@ -0,0 +1,77 @@ +Metadata-Version: 2.1 +Name: setuptools +Version: 41.0.1 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: UNKNOWN +Project-URL: Documentation, https://setuptools.readthedocs.io/ +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* +Description-Content-Type: text/x-rst; charset=UTF-8 +Provides-Extra: certs +Requires-Dist: certifi (==2016.9.26) ; extra == 'certs' +Provides-Extra: ssl +Requires-Dist: wincertstore (==0.2) ; (sys_platform=='win32') and extra == 'ssl' + +.. image:: https://img.shields.io/pypi/v/setuptools.svg + :target: https://pypi.org/project/setuptools + +.. image:: https://img.shields.io/readthedocs/setuptools/latest.svg + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20CI&logo=travis&logoColor=white + :target: https://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/pypa/setuptools/master.svg?label=Windows%20CI&logo=appveyor&logoColor=white + :target: https://ci.appveyor.com/project/pypa/setuptools/branch/master + +.. image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white + :target: https://codecov.io/gh/pypa/setuptools + +.. image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat + :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +See the `Installation Instructions +<https://packaging.python.org/installing/>`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +Questions and comments should be directed to the `distutils-sig +mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +<https://github.com/pypa/setuptools/issues>`_. + +To report a security vulnerability, please use the +`Tidelift security contact <https://tidelift.com/security>`_. +Tidelift will coordinate the fix and disclosure. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. + + diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/RECORD b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/RECORD new file mode 100644 index 0000000..070258f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/RECORD @@ -0,0 +1,186 @@ +../../../bin/easy_install,sha256=LiluxTy4EBpMojFMeh6Mfb2JFkjbHwMj2uJsLpKnGsE,304 +../../../bin/easy_install-3.7,sha256=LiluxTy4EBpMojFMeh6Mfb2JFkjbHwMj2uJsLpKnGsE,304 +__pycache__/easy_install.cpython-37.pyc,, +easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 +pkg_resources/__init__.py,sha256=pp8b7Asoaheso-q8lIMS1tpQp88xjAkYgCIRX-JsPlE,107982 +pkg_resources/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/__pycache__/py31compat.cpython-37.pyc,, +pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-37.pyc,, +pkg_resources/_vendor/appdirs.py,sha256=MievUEuv3l_mQISH5SF0shDk_BNhHHzYiAPrT3ITN4I,24701 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pkg_resources/extern/__init__.py,sha256=cHiEfHuLmm6rs5Ve_ztBfMI7Lr31vss-D4wkqF5xzlI,2498 +pkg_resources/extern/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/py31compat.py,sha256=-WQ0e4c3RG_acdhwC3gLiXhP_lg4G5q7XYkZkQg0gxU,558 +setuptools-41.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +setuptools-41.0.1.dist-info/LICENSE,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 +setuptools-41.0.1.dist-info/METADATA,sha256=_i0otxacylu95CLISnMjTjG7DZ2vYZOvwedcoJ06JNE,3303 +setuptools-41.0.1.dist-info/RECORD,, +setuptools-41.0.1.dist-info/WHEEL,sha256=HX-v9-noUkyUoxyZ1PMSuS7auUxDAR4VBdoYLqD0xws,110 +setuptools-41.0.1.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 +setuptools-41.0.1.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 +setuptools-41.0.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 +setuptools-41.0.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +setuptools/__init__.py,sha256=WBpCcn2lvdckotabeae1TTYonPOcgCIF3raD2zRWzBc,7283 +setuptools/__pycache__/__init__.cpython-37.pyc,, +setuptools/__pycache__/_deprecation_warning.cpython-37.pyc,, +setuptools/__pycache__/archive_util.cpython-37.pyc,, +setuptools/__pycache__/build_meta.cpython-37.pyc,, +setuptools/__pycache__/config.cpython-37.pyc,, +setuptools/__pycache__/dep_util.cpython-37.pyc,, +setuptools/__pycache__/depends.cpython-37.pyc,, +setuptools/__pycache__/dist.cpython-37.pyc,, +setuptools/__pycache__/extension.cpython-37.pyc,, +setuptools/__pycache__/glibc.cpython-37.pyc,, +setuptools/__pycache__/glob.cpython-37.pyc,, +setuptools/__pycache__/launch.cpython-37.pyc,, +setuptools/__pycache__/lib2to3_ex.cpython-37.pyc,, +setuptools/__pycache__/monkey.cpython-37.pyc,, +setuptools/__pycache__/msvc.cpython-37.pyc,, +setuptools/__pycache__/namespaces.cpython-37.pyc,, +setuptools/__pycache__/package_index.cpython-37.pyc,, +setuptools/__pycache__/pep425tags.cpython-37.pyc,, +setuptools/__pycache__/py27compat.cpython-37.pyc,, +setuptools/__pycache__/py31compat.cpython-37.pyc,, +setuptools/__pycache__/py33compat.cpython-37.pyc,, +setuptools/__pycache__/sandbox.cpython-37.pyc,, +setuptools/__pycache__/site-patch.cpython-37.pyc,, +setuptools/__pycache__/ssl_support.cpython-37.pyc,, +setuptools/__pycache__/unicode_utils.cpython-37.pyc,, +setuptools/__pycache__/version.cpython-37.pyc,, +setuptools/__pycache__/wheel.cpython-37.pyc,, +setuptools/__pycache__/windows_support.cpython-37.pyc,, +setuptools/_deprecation_warning.py,sha256=jU9-dtfv6cKmtQJOXN8nP1mm7gONw5kKEtiPtbwnZyI,218 +setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +setuptools/_vendor/__pycache__/__init__.cpython-37.pyc,, +setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +setuptools/_vendor/__pycache__/six.cpython-37.pyc,, +setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 +setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 +setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +setuptools/_vendor/pyparsing.py,sha256=tmrp-lu-qO1i75ZzIN5A12nKRRD1Cm4Vpk-5LR9rims,232055 +setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 +setuptools/build_meta.py,sha256=ioZE7tGSWY6vy7KLune0Iq334ugXuO39imcKC8prjBY,9387 +setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 +setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594 +setuptools/command/__pycache__/__init__.cpython-37.pyc,, +setuptools/command/__pycache__/alias.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_egg.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc,, +setuptools/command/__pycache__/build_clib.cpython-37.pyc,, +setuptools/command/__pycache__/build_ext.cpython-37.pyc,, +setuptools/command/__pycache__/build_py.cpython-37.pyc,, +setuptools/command/__pycache__/develop.cpython-37.pyc,, +setuptools/command/__pycache__/dist_info.cpython-37.pyc,, +setuptools/command/__pycache__/easy_install.cpython-37.pyc,, +setuptools/command/__pycache__/egg_info.cpython-37.pyc,, +setuptools/command/__pycache__/install.cpython-37.pyc,, +setuptools/command/__pycache__/install_egg_info.cpython-37.pyc,, +setuptools/command/__pycache__/install_lib.cpython-37.pyc,, +setuptools/command/__pycache__/install_scripts.cpython-37.pyc,, +setuptools/command/__pycache__/py36compat.cpython-37.pyc,, +setuptools/command/__pycache__/register.cpython-37.pyc,, +setuptools/command/__pycache__/rotate.cpython-37.pyc,, +setuptools/command/__pycache__/saveopts.cpython-37.pyc,, +setuptools/command/__pycache__/sdist.cpython-37.pyc,, +setuptools/command/__pycache__/setopt.cpython-37.pyc,, +setuptools/command/__pycache__/test.cpython-37.pyc,, +setuptools/command/__pycache__/upload.cpython-37.pyc,, +setuptools/command/__pycache__/upload_docs.cpython-37.pyc,, +setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 +setuptools/command/bdist_egg.py,sha256=be-IBpr1zhS9i6GjKANJgzkbH3ChImdWY7S-j0r2BK8,18167 +setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 +setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 +setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 +setuptools/command/build_ext.py,sha256=81CTgsqjBjNl_HOgCJ1lQ5vv1NIM3RBpcoVGpqT4N1M,12897 +setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 +setuptools/command/develop.py,sha256=MQlnGS6uP19erK2JCNOyQYoYyquk3PADrqrrinqqLtA,8184 +setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 +setuptools/command/easy_install.py,sha256=telww7CuPsoTtvlpY-ktnZGT85cZ6xGCGZa0vHvFJ-Q,87273 +setuptools/command/egg_info.py,sha256=w73EdxYSOk2gsaAiHGL2dZrCldoPiuRr2eTfqcFvCds,25570 +setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 +setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 +setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 +setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 +setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 +setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 +setuptools/command/register.py,sha256=LO3MvYKPE8dN1m-KkrBRHC68ZFoPvA_vI8Xgp7vv6zI,534 +setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 +setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 +setuptools/command/sdist.py,sha256=gr5hFrDzUtGfp_0tu0sllzIyr3jMQegIkFmlDauQJxw,7388 +setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 +setuptools/command/test.py,sha256=oePJ49u17ENKtrM-rOrrLlRhtNnrzcSr0IW-gE9XVq0,9285 +setuptools/command/upload.py,sha256=GxtNkIl7SA0r8mACkbDcSCN1m2_WPppK9gZXJmQSiow,6811 +setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 +setuptools/config.py,sha256=lz19l1AtoHctpp1_tbYZv176nrEj4Gpf7ykNIYTIkAQ,20425 +setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 +setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 +setuptools/dist.py,sha256=qYPmmVlLPWCLHrILR0J74bqoYgTSZh5ocLeyRKqnVyU,49913 +setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 +setuptools/extern/__init__.py,sha256=TxeNKFMSfBMzBpBDiHx8Dh3RzsdVmvWaXhtZ03DZMs0,2499 +setuptools/extern/__pycache__/__init__.cpython-37.pyc,, +setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 +setuptools/glob.py,sha256=o75cHrOxYsvn854thSxE0x9k8JrKDuhP_rRXlVB00Q4,5084 +setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 +setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 +setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 +setuptools/monkey.py,sha256=FGc9fffh7gAxMLFmJs2DW_OYWpBjkdbNS2n14UAK4NA,5264 +setuptools/msvc.py,sha256=uuRFaZzjJt5Fv3ZmyKUUuLtjx12_8G9RILigGec4irI,40838 +setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 +setuptools/package_index.py,sha256=F9LBC-hQ5fkjeEVflxif0mo_DzRMrepahdFTPenOtGM,40587 +setuptools/pep425tags.py,sha256=o_D_WVeWcXZiI2xjPSg7pouGOvaWRgGRxEDK9DzAXIA,10861 +setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 +setuptools/py31compat.py,sha256=h2rtZghOfwoGYd8sQ0-auaKiF3TcL3qX0bX3VessqcE,838 +setuptools/py33compat.py,sha256=OubjldHJH1KGE1CKt1kRU-Q55keftHT3ea1YoL0ZSco,1195 +setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 +setuptools/script (dev).tmpl,sha256=RUzQzCQUaXtwdLtYHWYbIQmOaES5Brqq1FvUA_tu-5I,218 +setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 +setuptools/site-patch.py,sha256=OumkIHMuoSenRSW1382kKWI1VAwxNE86E5W8iDd34FY,2302 +setuptools/ssl_support.py,sha256=nLjPUBBw7RTTx6O4RJZ5eAMGgjJG8beiDbkFXDZpLuM,8493 +setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 +setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 +setuptools/wheel.py,sha256=94uqXsOaKt91d9hW5z6ZppZmNSs_nO66R4uiwhcr4V0,8094 +setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/WHEEL b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/WHEEL new file mode 100644 index 0000000..c8240f0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt new file mode 100644 index 0000000..e87d021 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/dependency_links.txt @@ -0,0 +1,2 @@ +https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d +https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt new file mode 100644 index 0000000..4159fd0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/entry_points.txt @@ -0,0 +1,65 @@ +[console_scripts] +easy_install = setuptools.command.easy_install:main +easy_install-3.6 = setuptools.command.easy_install:main + +[distutils.commands] +alias = setuptools.command.alias:alias +bdist_egg = setuptools.command.bdist_egg:bdist_egg +bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm +bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +build_clib = setuptools.command.build_clib:build_clib +build_ext = setuptools.command.build_ext:build_ext +build_py = setuptools.command.build_py:build_py +develop = setuptools.command.develop:develop +dist_info = setuptools.command.dist_info:dist_info +easy_install = setuptools.command.easy_install:easy_install +egg_info = setuptools.command.egg_info:egg_info +install = setuptools.command.install:install +install_egg_info = setuptools.command.install_egg_info:install_egg_info +install_lib = setuptools.command.install_lib:install_lib +install_scripts = setuptools.command.install_scripts:install_scripts +register = setuptools.command.register:register +rotate = setuptools.command.rotate:rotate +saveopts = setuptools.command.saveopts:saveopts +sdist = setuptools.command.sdist:sdist +setopt = setuptools.command.setopt:setopt +test = setuptools.command.test:test +upload = setuptools.command.upload:upload +upload_docs = setuptools.command.upload_docs:upload_docs + +[distutils.setup_keywords] +convert_2to3_doctests = setuptools.dist:assert_string_list +dependency_links = setuptools.dist:assert_string_list +eager_resources = setuptools.dist:assert_string_list +entry_points = setuptools.dist:check_entry_points +exclude_package_data = setuptools.dist:check_package_data +extras_require = setuptools.dist:check_extras +include_package_data = setuptools.dist:assert_bool +install_requires = setuptools.dist:check_requirements +namespace_packages = setuptools.dist:check_nsp +package_data = setuptools.dist:check_package_data +packages = setuptools.dist:check_packages +python_requires = setuptools.dist:check_specifier +setup_requires = setuptools.dist:check_requirements +test_loader = setuptools.dist:check_importable +test_runner = setuptools.dist:check_importable +test_suite = setuptools.dist:check_test_suite +tests_require = setuptools.dist:check_requirements +use_2to3 = setuptools.dist:assert_bool +use_2to3_exclude_fixers = setuptools.dist:assert_string_list +use_2to3_fixers = setuptools.dist:assert_string_list +zip_safe = setuptools.dist:assert_bool + +[egg_info.writers] +PKG-INFO = setuptools.command.egg_info:write_pkg_info +dependency_links.txt = setuptools.command.egg_info:overwrite_arg +depends.txt = setuptools.command.egg_info:warn_depends_obsolete +eager_resources.txt = setuptools.command.egg_info:overwrite_arg +entry_points.txt = setuptools.command.egg_info:write_entries +namespace_packages.txt = setuptools.command.egg_info:overwrite_arg +requires.txt = setuptools.command.egg_info:write_requirements +top_level.txt = setuptools.command.egg_info:write_toplevel_names + +[setuptools.installation] +eggsecutable = setuptools.command.easy_install:bootstrap + diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt new file mode 100644 index 0000000..4577c6a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/top_level.txt @@ -0,0 +1,3 @@ +easy_install +pkg_resources +setuptools diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/zip-safe b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools-41.0.1.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__init__.py new file mode 100644 index 0000000..a71b2bb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__init__.py @@ -0,0 +1,228 @@ +"""Extensions to the 'distutils' for large or complex distributions""" + +import os +import sys +import functools +import distutils.core +import distutils.filelist +import re +from distutils.errors import DistutilsOptionError +from distutils.util import convert_path +from fnmatch import fnmatchcase + +from ._deprecation_warning import SetuptoolsDeprecationWarning + +from setuptools.extern.six import PY3, string_types +from setuptools.extern.six.moves import filter, map + +import setuptools.version +from setuptools.extension import Extension +from setuptools.dist import Distribution, Feature +from setuptools.depends import Require +from . import monkey + +__metaclass__ = type + + +__all__ = [ + 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', + 'SetuptoolsDeprecationWarning', + 'find_packages' +] + +if PY3: + __all__.append('find_namespace_packages') + +__version__ = setuptools.version.__version__ + +bootstrap_install_from = None + +# If we run 2to3 on .py files, should we also convert docstrings? +# Default: yes; assume that we can detect doctests reliably +run_2to3_on_doctests = True +# Standard package names for fixer packages +lib2to3_fixer_packages = ['lib2to3.fixes'] + + +class PackageFinder: + """ + Generate a list of all Python packages found within a directory + """ + + @classmethod + def find(cls, where='.', exclude=(), include=('*',)): + """Return a list all Python packages found within directory 'where' + + 'where' is the root directory which will be searched for packages. It + should be supplied as a "cross-platform" (i.e. URL-style) path; it will + be converted to the appropriate local path syntax. + + 'exclude' is a sequence of package names to exclude; '*' can be used + as a wildcard in the names, such that 'foo.*' will exclude all + subpackages of 'foo' (but not 'foo' itself). + + 'include' is a sequence of package names to include. If it's + specified, only the named packages will be included. If it's not + specified, all found packages will be included. 'include' can contain + shell style wildcard patterns just like 'exclude'. + """ + + return list(cls._find_packages_iter( + convert_path(where), + cls._build_filter('ez_setup', '*__pycache__', *exclude), + cls._build_filter(*include))) + + @classmethod + def _find_packages_iter(cls, where, exclude, include): + """ + All the packages found in 'where' that pass the 'include' filter, but + not the 'exclude' filter. + """ + for root, dirs, files in os.walk(where, followlinks=True): + # Copy dirs to iterate over it, then empty dirs. + all_dirs = dirs[:] + dirs[:] = [] + + for dir in all_dirs: + full_path = os.path.join(root, dir) + rel_path = os.path.relpath(full_path, where) + package = rel_path.replace(os.path.sep, '.') + + # Skip directory trees that are not valid packages + if ('.' in dir or not cls._looks_like_package(full_path)): + continue + + # Should this package be included? + if include(package) and not exclude(package): + yield package + + # Keep searching subdirectories, as there may be more packages + # down there, even if the parent was excluded. + dirs.append(dir) + + @staticmethod + def _looks_like_package(path): + """Does a directory look like a package?""" + return os.path.isfile(os.path.join(path, '__init__.py')) + + @staticmethod + def _build_filter(*patterns): + """ + Given a list of patterns, return a callable that will be true only if + the input matches at least one of the patterns. + """ + return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) + + +class PEP420PackageFinder(PackageFinder): + @staticmethod + def _looks_like_package(path): + return True + + +find_packages = PackageFinder.find + +if PY3: + find_namespace_packages = PEP420PackageFinder.find + + +def _install_setup_requires(attrs): + # Note: do not use `setuptools.Distribution` directly, as + # our PEP 517 backend patch `distutils.core.Distribution`. + dist = distutils.core.Distribution(dict( + (k, v) for k, v in attrs.items() + if k in ('dependency_links', 'setup_requires') + )) + # Honor setup.cfg's options. + dist.parse_config_files(ignore_option_errors=True) + if dist.setup_requires: + dist.fetch_build_eggs(dist.setup_requires) + + +def setup(**attrs): + # Make sure we have any requirements needed to interpret 'attrs'. + _install_setup_requires(attrs) + return distutils.core.setup(**attrs) + +setup.__doc__ = distutils.core.setup.__doc__ + + +_Command = monkey.get_unpatched(distutils.core.Command) + + +class Command(_Command): + __doc__ = _Command.__doc__ + + command_consumes_arguments = False + + def __init__(self, dist, **kw): + """ + Construct the command for dist, updating + vars(self) with any keyword parameters. + """ + _Command.__init__(self, dist) + vars(self).update(kw) + + def _ensure_stringlike(self, option, what, default=None): + val = getattr(self, option) + if val is None: + setattr(self, option, default) + return default + elif not isinstance(val, string_types): + raise DistutilsOptionError("'%s' must be a %s (got `%s`)" + % (option, what, val)) + return val + + def ensure_string_list(self, option): + r"""Ensure that 'option' is a list of strings. If 'option' is + currently a string, we split it either on /,\s*/ or /\s+/, so + "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become + ["foo", "bar", "baz"]. + """ + val = getattr(self, option) + if val is None: + return + elif isinstance(val, string_types): + setattr(self, option, re.split(r',\s*|\s+', val)) + else: + if isinstance(val, list): + ok = all(isinstance(v, string_types) for v in val) + else: + ok = False + if not ok: + raise DistutilsOptionError( + "'%s' must be a list of strings (got %r)" + % (option, val)) + + def reinitialize_command(self, command, reinit_subcommands=0, **kw): + cmd = _Command.reinitialize_command(self, command, reinit_subcommands) + vars(cmd).update(kw) + return cmd + + +def _find_all_simple(path): + """ + Find all files under 'path' + """ + results = ( + os.path.join(base, file) + for base, dirs, files in os.walk(path, followlinks=True) + for file in files + ) + return filter(os.path.isfile, results) + + +def findall(dir=os.curdir): + """ + Find all files under 'dir' and return the list of full filenames. + Unless dir is '.', return full filenames with dir prepended. + """ + files = _find_all_simple(dir) + if dir == os.curdir: + make_rel = functools.partial(os.path.relpath, start=dir) + files = map(make_rel, files) + return list(files) + + +# Apply monkey patches +monkey.patch_all() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65e8434d6c1f498893b45caec066f6ad13d54383 GIT binary patch literal 7710 zcmb7J&2t+^cAqZ*0}!MjilQuvw#Srd2r>oAk}S)yqg5<f&Q>;D#+KK~tW>i@bb}ml zFavcD_<;fs3AMF8#NMsF?PW{c!&df|KOi~gw3of5YObkD)n4)k_>|x40R|++Y!aZl zr@N>7_3PK~dp?<-u4wrEi@)$pE^69;P-pzJ(RhF&zt%O4X|Bd}W`w${tEb@_>S?;B zdRlHlJ&U7f$t|I8hIY5?mUUWdg_Z7<JEhu%u-ct=r_nC5QaIB+=blsJc3A74ch7fc z-C5NyhZnkY?p*hxdr|d`aNfNHSe5X#?q&C~8k-6ix>wvQ-9>j%^{e6Q-8bAf&@Qs+ z@XfB{I=aT+a+lZ)JI8A5Jey?~*c`jKX}eeXdGVk8>dUv;{E?1XmpaRxcieZF;nvwD z_ZoX`Q+FGmY3wpvc%iX{L&Lp}-W9fp-Xgz#Xu9w6>zx(%20#A`U99kT(QdNW*&8o3 zca^=#X7Iep3!V2mH#-`?>1o_~c}w+gAL;HLz;f7mz&g+G0M>2x7F)uK_qpD=+t%4t z_Vx?i{Qzt39ceg^@rBk{9z6JTFX534;z&A4>?B*<sk1;P{Uiuw-D$_d34O829W+{T zw-@p~hu(`|15>c-k95Op4LzNEG+y?@9=-Wgh*)5}+KQtcE)uWjCtK)GwWF?|w6<El z<bMP+Xc$}kf+zi6633x@#Cw9be1h<mFQOpYY#6Dz{&%<2D(xC=ddYr|OAHp<L6~rn znq9vK80GvVcvmH4#yF;>$J|f)f@4<cbN;*^sAjPnN85ZqElAp2RDp_^MwONx#@((T zF)>9$GgK96e7YS(4993~`<q;*msB_MyIf+7=P#ZNro&+4RubQCwu3z`TUeX_EVLe= z$WKsl4g9YW@4F_qz)=NOe4!ueZUMa#vtMXv7kP=5Sw*#Nw5M2AwaaW8H+U|cUe6GE z4CJ^Ne81x0_Zg44@DuL%P6$dkaoh33&{^M4w&KVc9|70fkC?L?BwIm*sSJc^C9&97 zFjBqwJMDLRs$Xvr*7T!i3FRS*d<Rvc4YikgVhn-xQ0th?92&nizQt(A9Gc&1N9Lgp zEG@rmYTD<Zv!HzxO8+Z9IW|sxcZ&;NuPC(Wc%uO)0MmkFMI0v+<elBEptXfl;lLZ* zk=z%pEzT4#k5AroobM+&IJp(~L#8J8d%ZBgWM2Z$rIv`LywMB&1cK0Aa;^nU-gLhF z{0BE=vLEsWD4A@1<OGS@Er*9)M@$b$BdPLxJrVarK$jB6Ek9Ii9l0MR{$BIg(fD2~ z>@!}c!}-Aed7nou$X|PWZH{6&f;*b}kyF23cUpc#C+JJgazxZAKnT|I1#@u6L@l*^ z#gTmwDcSN9r{0d^CLkz^jbIYH<X~ifV@x>0gXY(rYfu1A1j1+CAdx(5H;$hqi2lzf z8BL{YX@i_~IoZ3%TR|IFvf{*1xSyYZjmaVNn;rpS6DWk=S&)eLGTzV6HD;G%K<fDc zh_<-V#1EngxGfGSiVp~bjKtsvs3hppP9IVi2HQ}l;|p!(OH-Q<Jf(HMt6ulK-hRsm zhk9Pa5SJlTVgXgdN-dI;^n!On?RWt;5RfM5BX6URjq#rJAQqUdP^JYXENN-9ZCV<g zLd+9rs=kX?!H7HH#MK>NthVD2ibJk;#p*`K^X|#_qYrl2otD?zxpgyX-`nhn@V)l? zAAY#{WVILcZUm7`K)@S&y=eD#t20<tCsE4#c+>NOC`df7+1pPoI>H@nEy)kiW{Y}J zuj+%@_2a4w+A?Cfsv&huTDOHF{|VLJZxXGe50%64jqyl(_KT<Hfpt(gC=Lq@isz@s zW$mD}sf~LdYkT3agn8`1#!BO*IkblMk#SH~J!@DV>gZL5m6rt?=@glT{uINk?V`K~ z#a0@Yk90YFes5?Frw(=T%b`I}`OD$dk6=QFg_kxU>bmy)-dEc5+E*Ggq3jBSOn;K1 z`U|iK$z0B68P`D)$0|%oV9%GCCY!KacBv~4q%7wfk~U?b$1LS!vnHJN1SW0@7aGR9 zVGwQ0HE|K7Ym`$XmZ`Pthuf(|IxDq0aS){?!9&$W16r=dQ&aLDST2m?ZRrvJj?G$H zga+dgYgEM>04d(2%Ax8lRH;QeIJKa&!GXYvOV<XIcxu2zotE2u^wn-Qw#{0l5n(3G zDV7K(+(+%NP~>Z<wBmwM)vHEDpTWOo&gzC)(~H*Nt&{w7hM=^_!Jr>KiJcyzND=~K zrk94Q%^^I>BjboHl`&X;6m!zN6Z1pF$Yj|cU*z`&Q^)wbVTomc6m?W-F_3hAaSfe@ zuEtKEZUwJ4QKW%NGhaE!tJEhcP(M0{i9%Lbl8pRJgKr04`h^Yb&B4!eX8A1G;kmI@ z)+19*D~=f3VOXKi-w1hT2F4mN5q+2&(zQW5hem7{L_Mf{<-8Gvpx?MpzD1<0Q^w}m z9utN<aRKB$Tp+}=3z(q(wf+dMj&c>uwR{Otr+{*smXJ;yYR_g5^hEnwgBsAjF-QoX z!+WB81LK=uE_kAXwt)|5G;fN#)YMapY+iN?#9rT(Ki-6cwAT~&1-j}QEN$@M6gwT) zuFa2?(U$ko@Vgt#rv{mE8W{s49Q<e>DBR2TwSkec2csdy+^IbVp*F`%ZE)lNwY544 zKz@X!C)!GOUdL#Nl5tmYaOF?HUTc_2Lu9nMgjJ17YI`2h%k$ET=XGP&52;=CyytyC z9K9)d9*bKTo@#|qUR@5yl8LK?5Xmk%>+s=Qqj6$*L3m~R(Di36h437@t0;<}ZPPLg zy*giAtQG{l$ypz5#rhBMRC;0TK64c`DyP^|8rVuNtbe+G=hn>=C(rqcWQfW`0z}M` zanRb6F)c}sk725iq$BLm0t1z14C-g>&^$wLt~Cnc&#^+>r|NrDeL|HY$%GK9r8Xk0 z`Y386TNl*NQK!vwHTD3Vks2FO05;1y(lS{((hp!QJ7gQJZ(yU)E{czbI;<L6WVM(^ z)@mYeCg4$#R0tQy+rm@hKtF(g&$R8Lz;kG{Ps*L)))*(t05^3XCIeO{ol!1<C$d-z zR)~%VR{H>tRNqeZozvv~5O02pqVB`eiu&L>{0HS|WS&wE><qbs)pO^9%_tV!i&gOH z!AFXPY}jczk7iS=g$XLoBSY0n(gJ*`u1sfpzL4C5gVzo=$(!O*JOVCmt<4drj=U_s zxk*uH0TK-x2LK2#C-+C>N-zBnDE~bjOyx#QTc5Y8@P5P^##$)qH`eOP<PlJcs}6BR zi4MoaY@_!rX*qojriNCExKs%og93w}WDllZ7t-(p-5RWoco-w=ZnS^6_{CbHDA zTnhndff>w1`k=_FSy+k`j0#Czn@zI{n?f?7%q$=^BhCZB;}-EI{fLD~s?=e~S4a>d z4#9s%1`cG<!QhL*+){#tRQI5ho0*5mD8T--GCv0i2a3a0<VN&far!+5wGwUS3*f-Y zYbx@96P|22P`?g>`rR1u4z3ky4Ek42>=6hE{Wc2lNz-LcYHAUnw5Z_ohM8IfQ~Wis zPmS%}(}Z2e_^(ki!WQ7l)<z(kV~A_HCrc)b%0pW42`ai=1kA>PHMAgBwpdCOeTL?t z2|0xi2`X8Md1%P{3GRY~ZfLd5c~I^j^dZsQSQ{+Xmyw|9Qk;RX&v%xkb8Qn2;!l?4 zPa2IvTH54L!HGyq5JuIg1X76<!bw4XxS$(@diny7w3rDFoJ53#X^HW+-w%`2-0{Ox zr%z`+WQ>qb@v?*rd5OOT2uYl%=@s3EZ*Spg!CM<F<b-);QO+^ME#%NB3iZ&)DP#;` z-a(;x;uKKHNQ^^6+)d!J4fVu&2`&XE8AP|}u6kd@`zJ|>wB8GCh&X}#iUTvUSm6LE z2^l6fD`sjeqo?A*(%`>7RcFdvp?XG)Q4BuLpk&9DS$KJDO3sX}z7RZ0;5qpS3@KT) z;_PxqBBhW}l7NFlxq!putgbwj*H<a2w)#}QyNYN$&Y>(JymmHxfihTHaj3h3E(&!? z9@LQI<dalxXM;mrcn;;qG>MjDY4#W_Jv$}`1DjA7V)qlqg|0&Be{#H`|7+xLfz)8v zk+(%g1A531UtxygBeY4ei^o)*QbDBG{}n}9Gx%6H#_Vu{8(=nMa)x4mJgA@I@>6$_ zvHY@VG|J*j+CE20{0QCD5FGhEqQAI8eG?vU#`czCd-1ol=*MbmynPD!boNyw{~1$9 zK?yNBvH3g#lR3je+rWRq@UJcwq~}{ED*BD}g3^-?2F7|49F549bb!*7CTU6~^-BH! z5Hr&`!AWriei#hMa%K6-zric<IjXTxmqu^W*=)XtOwMRXiYElfY<1bGV~Y*E_%{?u zo`$A^uEFB?-p<;X_(4~PYgA4<JA|%yfXZDM?M#MN_K`L9kXXhuN~Bn)Sx>3*sUi%H zVWoI#iN?s%{0b#=74@QF8Ma-i*cVSQajtFO!BiC-fwssUAU=mLq;vw<nu0&GW058X zOBV*qN_HrXs^m%e0S@w`kk~qft#$Q2--tFL0x4-BZw}J(Hc}GsmPpYc@i2!=R8c0> z4N?nAerkwUMiOLBg2pUZEM)$XwSmmIAct7oL`BIHgp+5;)gNeg5?BkIIJlaHzZ7)K zfD-j*$P*kT@irEKKbG+jL?2P6O1Zr6(<>tjW04V%FaYw@#%b;JHowQBj8h6leby8K z`Z<w^*9k+V+3%u}IX3W2m20zYh-QL2fSXh36e$e<#yBvN66_t>M?JAAv8;TAfBX}- zgHXM$6yqqerBHONC@AYdX%eo|o|yvtGJ=aIDZ-~DYrR>|W8#yuGnay<;hThVaajfc zfnEW=sYsx9=)8)WX%YG#lPS{?A&riY87cA`f}}K~Z-b_iAE=ZO{NeYgO_%K2T_3p? z<V8-?yF^(rT<X7LR^~$%Y$%;s6cJ&p@u7HtM}~nZ_oWEYO=ohqx2e2d@)y(D$skdL zNF<)oi`wKx<~S=Ic^n9R56ZHRrP22r6=u709-RO22ODoU`(mR$m$(-vdBG;fS0)iP zWw0m6&?~dyUO96@vm5Wg0asi}v~p*UO~Z#I`c{=zCS&g0q^<T*U$fM=8~5C?S9HY5 zN1hW<v-m}-Pd%w7&Jjs0`pkqBs|OF#S1~SvT|~VkU!J%@Q%YlOkP8|$J<pxrKqd@Z z`Mo?EXp6Y(&WV2H(N`fajwp6cxJ;xwKl)SzsoLXWoNSXS@>QW<7E{j>(JoM>y#E@t z$oqGv;pKV#2>OY>aVY&Ll*(0XxlQwkOWd-WLD(N-uw1VqC6UGX_sK%ZbyQHS&?@6U z(r-w>RgIcn!+2G%slJ6!#?Xr<te{~VmSq`5bLMfaSTvB}HSKA;P&H@F+AX^}GyUJ* C(9K=| literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70eb4f8d1ac608d0f94b998a8be2614737beae2b GIT binary patch literal 564 zcmZWm%}N6?5KddMrC9LbNj&6Q(5}CzAR;1o>!pHFklA#Tttn};W_Gv!9Q8@O`3^qG zUVRHsPPerc9GJ;BKi_0BxoowXjO0^n-W7CyO`Ts^A#g#88)UATWU}%`s@Q9-Uy;=w zYu6&mETlr{f)v-uC`L7`UzL@9ZB|=s^;DWAsdEOeRN_@6Qtj-m@K)R5^Lvw%Tnbb? zG6Ipu&hyDE$>p*hxwbqEanUObn<e$;UgMlfz`B%JUgt{k*t;=N{$Cn~+gw=51#--y zd#<tUlxx%jqxj&7TErqVX{U^L+bcx_z>2W~D4GCcCo?m}YXA?KF!M|uK)MLvgZWij zMQOfYf`q0KsS0x8gV-6G4ui1|1|xtIJhI2RJd7a8_jl9yWH|C>FFraw4Q_%&Cp+3= zDva5AOzh+!8a)Tg_y2|PXHhU;UMG3-)32E-R>?G0OTXK$7WMh|%fNEj8LCrl(Kwqu K^1P%|g#7@7mZ7!) literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5079d63dac0d53428447d827d453e22390d47324 GIT binary patch literal 5145 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5207b507a2a1be604caeb32ac3f826bc656f709 GIT binary patch literal 8303 zcmb_hNq5}Xb;biw1HnNQ#inK%%@cR460+1%yVHXeMPuxaZAOtgX}KaF2n1eLfkFYL z2NZ`o#VkxY_Qt1=PZrt5<kBbmth~%F`z)}?CaeAny~=m*t4So~KF&#zc$nUB-yOeu zaesc^G4T7nf9Yrc_9uq%KXfztRd8_^M`j4a2#tmjiqMQjL-5&bn0&Sx7N6~g&F501 z#OHFO%;!p@!slwEinA5Zbex7GXf8XR?aVdia9s+^VI{1FGocgCwknPJ9~j|WIQ!ZN zXXV0y)i{Iu`EUXE3$n7cxOEoK&W2~g#n(n-DLfl4;e0MU7cS$x9KI8-;QS88oDVNx z%mulE{^xOjF}#HPOY%JKFQ7FV7v;sRON~otFE=iuz0$aX_G;rQ+G~w#@&fvNCp4cL zwafl`$uRD@j~_jDKf3v`8zs3^O+S!sp1PULd)+)u<IHg$E4dw|y)52ab9dS@aecR! zN#&*rS3%n8_(|x-Q9=XL*u5Uh{Qb-g{5W=_99>qMD#hGMxLR`(DMK033LXEY#7iY# z^<<X2X>)2#dY|j}fmFF4Va*_q(qzqTrpl4Key1DDHMb=bsr)=jT9_%0^fXbD<yae! z(}bswl<deP&(_?$E!`0@?oQf^Lx)>U>?&`%-raL$tK~&WGhL-UP9ATDSi%DfWQ;cn zPdB~)I(Ri?W+<CrNCvXPsM(YX>$@G9x6_bzI$|{uz7yr`sjb)DCqBqjPTuwtri(g_ zX;{U4N(MQ};*H&8ZQ9Ofj^nyF>+VyTYwCK6m)3()wa1(V7bXvQeP2^Rdv8Xu#3Z-s z?&qCus%V}lb319+izN}BVo#ahlx}wq+e!3Zx=KQM-0LZn0K(d7M?o8t;5ShuY$kEL zDHI`(AfG*Y<+kE<(~sS4Uq$|A42FT>f%3Dq+xAsht7DQ6>+S>6C7K(&<6ZX>R)@^h zd=6>RA?qQ8FWY|ZN<V13&0$A3Offh1aY}#phv|;omTJuf+d)1FZ8h+-o*%C|+&^Mf zI<fY3=FC(NEdw`6b9Ylh_2LMs4i=HlZuVMuLJZ|S-h2GH3pL%0;way%vDnt#7n{8( z4z+^4_{`-y5W@;bJLIjWaR^S6$${rRrJrv4nN0i+2@cb=WbTn&K~pjhi+gX*i`P8W z3zp5e=L^ye?x|;iOuN349@N$k{oMaUGYxHSGMAo0ubYwCO!kww{NVp#L!*hmeM8Q@ z7Muu~48)6n5|K}G=|K4=5`5SF>mHm4<e&RlE@9+a-?aAEov$g9Y}7=t^o1nj@YUW! zHb+<%Jq5oqIbs6)oZ`w`gu%4G^(~9MaKB9i#q5-1M>l$A$Ma&@@`F9kD^}nRdfg{l zBbcm5N~J2G-Hd)FF7D#UmeEK9G11WR5Ru0UEyN33QDhCMBmL-1#{(Q0y%~ss;UTP| zs~{dZSyu*8Gm<K+nT4InxT$8*?{|ip$LX6_H@Yg?_H%gy)_<ePdY#?qs2iJGp7%-i zQS$M2_`SgEZr}PKZ+_C+Qt{2^N1uLr<BJ>JsJlMYxb@v`vh!iE)xR-uG}D)wKcvF& zZAI0CTaR+j`;ds{orwN-PUlX2)OVw1(?BvW@DhC0+JNgh&wB+gq2H)8n3H!l)hy66 zV$QA6f>rSb+ig6*OYh!8bDZtcmZhz7XodD`<3Jn;0FM&5TQ24v!lG2P*(1j^mWYKZ z5Ye?nuHhm#a*><4HNe;d^FZvIxjn%7=Mb)zQmL>hY!+6>?-my3R5S@wT(i_1U6aTf z3u9S&)c@EHi^ZnQgZ9wPAb4h<U{FSTGsKeFzdB8B{dnI1V2pnxk17sgQ1+*2a$`$u znfuTyy7J7v6N<kFcKZ@wYasNqXSl{*%>E8sj{ZH7-54-td{6ENoQktLUDc<F(b1Q^ zLJ<2|HXZ}lz&<kU5x#&AXHNjn5fGHw%_%VH-$u<UX2wetc91Hm&VhO;y%oe+VW%o; z9p_l7>w{x|K|3Y&FsfBi6{c{^{?askb?&xNtExqGQfH}IqUJoBVwP#vu%d8=l*Q3z zu`s*_GV@zfsVg*ujBcu7)g(GU#*vlLfP|7MnD((uNH!$L2h?dKlTchVLi44m-pftM z#yT*w_XftHog0UxBjX727?6Hh{ogQ`9;6AvD?40Z3$hl9G(O^=B5VWD;6Bz^;?|lg zce`;EL;yHE)^|7eayjg}#(w+nk|;<+S#y1a^O0!Xpe=)!8M$<l8;=D{3=rw|x;$P> zOwoqECQXAGS=nAz%z?HH5@x_xI8nx)B?0bSL9e1L6I!i!2Y#HO5r*UhC-D%(!_A58 z7*mUim!}>!_Y>k7G1e$wuoi@RA6F+BOZJvsK=VtZ$$7}@D%dD~1vWl}(Gwdt#)C!{ zLSkc&(E_J`c5R<+;m{<DIJABRPkdw^31tt&Z_HQrQ!RCPF*AiWLZjM6DMFM`g}s$V z3G~#ge^A&Y80@Fydw8YyL^|?~bDK;aIJbM}A81`thq7Uc{!Nc!Th!^uFoGNRvK|03 zfm0~F%<8w}6gfb42N$F9HB(*3=%PYT(6=U39rwK0=$h6nuKvNP8|X6h-s&c<#~zSK zql1~cii<ayIv6r_-yE3F#lAJ5uy%~SG@PRY*$kMw4EG}r4U&g42kd@cnIrcpiYn5Y zj36|&wuTXfXo80`@DMT~t(xNF%xy|ncDw41kB-bno7niiM|$PaB;I)36!%7>hRjnR zU^IjYpQCxbr@n_LjcSKH3UsotX}%Fp>78PpE}yoJN2IWhnis6HP~^DB>h^~5Q-ERx zgUKI>Y$dl2ksp(>=cT+HntA2G8jLiy|6Qb6ooVnN>12YV^!N3P>oxesu1w(FNGntg z4eV_fx{(!Tlor*e>>)n?o1y|u^YdI4)jWMElc+D%r|1n<&+&|27O1FuA}%d?G`~09 zrHx^F!(z^KOm!Fc0gmyHbmuOP>=~Nl5n0D#6b8;wg8y2eG_XubKCa40(`UmuTvfsq zPVNN?1m`)a7mb<l0;lz&;e=Ia-NoXpcc0MyPq4B3et=DdV>Ko-Cp~;XWRPzdh;BJD zv?hk4WgM9T&oGU-(Lb}ku9K+sv`di+JaMpLfLgy7=TI7o;>8(6gl5ztR#3Wp!e`Aw zId(nWNzt;b6NpK3qJQ-SrS+-a0WpkzL@~uOrn-*{gamR$0`3W6JVc=Wg-L;<CC=k{ zXk9eU1E6>&l2Yi>k@3|6cEurtL%i{~#uMWif_<`P8+rMqqjF*FTf*os49tPGRr%Q1 zHvt9kw{QKU_00IGk(ken0o69_jju_0VV=WG{v?~K>LGflcd480tJXFLJ`R<|jOq=w zhM^E+AmCrdL$tkOZkS$aj4!mcO>Dh5$No!$&rv3}gMk?ZZv$a|35-R!7b{{>TrvCK zJ%z>OT;H7Gn<{HEknC7hNK7+0nCY~k0Z?8D-<E?B2jZ)heS2UZiX-FD49(CwGWScw zGR@lD0v;?4%+Nlt^3s8E0JUP*R@xxM+d<0Yd42o2dY<&n=SgA9T^ZEMY%_(eq#qU) zB#8vJ)CSfrDikH)e2TL6{pia)`%8L>8QIZ!8q1KACA5TWc7jaEQK=uId5uFOBg+=H z>4-~a|ME#Djpej4=Exhya|zQ-)Np|K2*ndEl>L59YGQ2^B~G;vd_G54SPLt~kM#9e z-p45<l>HTsA;fh=zkZT7lHW-7$8+b?sby0i8;z#61+!sVP2^O66p=Ov{OA88k(@)0 zEt|GWwNqBI|G)*sfr&kb7GNM!jFts^Hax)fL+c1I9ja*Uz6kBG^xDYn!_vUgm}cM3 z%LDsBgk?a;?Yx{<1{S3^q2POat9m#yfNJUyVfiBb-M;l|Z8!?OvVY2*pNq%FtF<qU z0n(e7mim1@dpMU5#|~^gihz(X^4YEVfkpM$Uz6YDcM$%}hI)j(z%?V_F#78|>+5hB z>r_n{2SL&&V!%@z8R-*auBD+fCRi}WSvApjILAPC+DsuX%KC=DK#{&5*P|PF_FEhi zO!ZeM_2}D*08>z5473>Let}RhAGH!BBp#B06nXdp`#bdmqJ`in+nSEP1S<*)_?#gX z2V?bT^laf?hH5W`7Ool;<*ZHFRAG10ZCJYM<Vwm~NynL`akXdyPe^T0%^q=?;3b2^ zJ;cJ%!{Y%-kz@N891L>}b5Sgas%gV#E?aYA(JYH4Vd81ot_mAIv@90P{;fZrc>!4o z{YbyZj`Uw~!)^mG8c8#v*CDiwBN>DZgA`xo&|*r?5zjcPAxR(DWC3ueC5~(*uZ%e= zWC?kdwC(`Tm*<*6siXv*F7ur;C_{<*xj3AqEA$r7WLk4(0QY=k;wkiY;<g7=1gKDn z#R4l?iBbDuR<biAHKsc>>O|b@+x4AxT$|U9Zi2fi{$@t0fg*jM(h_pUj0#y9)MvPb z%;iw_oXyoLLyW<zPsFQ8@aj35#$4X%;sxvsG&L4<$5GL;aP&Pde=HV|SpFRc!yp53 zV9uH|R}eg_xLzO#CtMU5P6}Q}PM&z|$1F@l@@7Bw1Q&0U@m6WtyM=GaH7pNA%Y>)1 zy%NTkS-ur$Mdg4(N>zK6qQow=KeN8hRYoA%Qmdc)rwC+PT9rDw)LVT(;)kGbf{PUa z_0z;MEYlQcc)jDyKgP`}Cizbs8AUe05b*CB^YZN+<Z0o`evAQJ*Mr_|0C)0f_IO!> ziKghO9SiwQMI2{yRwPVCG)(zHrjWz_J-q1RV2o5XtEK9^Gwaw+$+-qnmleGaaEyO6 zG5xYtG!vwba%GA0KB}9|H0)nO<_%ppJ3rBrA9HbZh`jv=K#LE6T~O=MC3$yKV{$Gi zFzOn945OmY7sD#D?+$ARR2`ahs%zaNPl#FseTqmz>2JgTQr&}46@Ss96?X8ELl>P0 zIZamQk1}xl>!a^Us5#Qd5&CqrjkKD)F+R{>YR;CZ6oR!zHEFJXY^o@1NqmUNcO<^q z(YFJXSlupG^;=YT>Bs<|n4+x19~0<(B6m)EzosiO_~Nh=;X4ezl_WXJp7?^pUpdGX zgu1$N3P2?xQC2{<mu;e<qU4q?Mq2Q3c1~@Hyes@GQgV9xvZDT+Js`fg0yV(<^;hx= zyeJ^*7Q83m8~h}B!~uI}$^m|1-bS{-@YUMj_y?^e;8}AN)wH$oP>wmQLBJDH$%8Gc zD5L6wAP2MUbrCCD)Qw!<2=!|Oi{g(*UaH~fe3Q%#Zg|G?xDw}iTCv9{_P;Shwur{C z9djA>wqTkFS4)-tyKm9N`WVrI`Zf_zK4xPmFL_}aU@fArm>;ek$T%LYPd0_&9h^Az z=k5F#?igoOE4JV#HCH9n<@?lJr-qUtb%&atQbRRlP9}$+f)xSO#yeA*-rf7~rq*1J z8^wJ0WecD;OM5Di85fg@UMLI7<@5J}s~+tJlJiu~tO}cgg3i3&rzNSJqr=TzTovVX za|>93ZJ%jwRK5H69{lLh#zXa1=R#rpG!Ii$Z|l<ioy+Kv(E_$fb=Tn^U(cCykkRC? aY%Z3TSE}=HM>EyxVsr6Y8Q^31Xa6rT;&!b7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7358022fa2b7d534a675c49bf660c8742290f331 GIT binary patch literal 17707 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 F{{gbZdzk<L literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99874eeb83e15c8f4882197823667940461f237f GIT binary patch literal 871 zcmY*XPjAyO6t|PMjBcG!#bI#rt&6lZFsRrhgwTL12S7}!G*w>grrsRe*iJj9>_Yh< za6)_sK1r^e_zH00CF!K@RepVce?R-Z9QS%%1oDeMJpB<O^t*CyBmm<j9Jd3CA%-Q& z@EBvn0v3Kn<AAl^qp1A{vM9pkrs4~3C#luBNvhsT+N<*l{+$HnQGu2iG+yG1(C&E5 z!1{tybRED6FOPlD)GYC9bb4^z@?n9B)&uCM^fIu+BKX#7V&CC5MF?J<tGrLc6I296 zI1S)#!PUPLDlf>H_A^3lnrB>jM}#7VS}G-%d&G0+g-VH-5>AsDaXPmNC-pOkaHM`! zmw@;gRYX94qOIl5XvL~V55U|H$vf_Is~n*KE-cYgB87wM-3HM$lW}_uR^8+xvY2tp zSEO*W6<@>EAny^H0As_YAp_++qsoiK)mXqZSeyNBG#J+LtI^;V^?*>t$e=-W1Cr&= zlQZ5R(u@<yRqAI^y9~i9yC12{`5SAsE!&o=l-p{nWrrHW6^q*A?OX7!yt9HX@2bfv zRhc(YEPf)p2@rpEY^<15&*M3@@l;F3t&1}opPf%8hi;^v&DqmrV&(^r{PZwAxAO6H zbaWJdh>bA&LOBo1+rKnw@gzCFiXBYec&(*dHyJmR+zUB0pUeBre5%DPgyYRBI@LGX z2ZcKK@J86eE!>CSHtq+u2hq1tSoRt0utIUe8@zf7bwT}@HMIpz<;L?&vt05Q7(7=^ HY^(hrg)9Jd literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ba386efb8a069ed079d2c8877f447d51d1a52d3 GIT binary patch literal 5280 zcma)ATW{RP73PrK8+Ea4D{kTh>C}z8-qe=dq^X^vO=HWl>(p5Zw%a({1RE}gD^cQ- z^bA*)7Ti8W2KrtguZ8qj^e^<Gf1rIWz}G(cFBApZ?+nS6?B=1n;BYvX!*l)48Qxx4 za18wZ;$HmnZx;;XpY%}uY;-=xrT&0M7=ndHueh@w)6Ztl#N7<7k=?Ty%~>HE)q1s2 zy;mPKdW})D*TlFjYGG^S^c?i-q9K~1wPp9_?is=n_2(EnG<);nte6vx=d8CN&WQ!l zL~l`?7mK2W-WhR5EIl`ROa9WK0V?c~(OG^0zKm{%<qMBe8F=Y$e5rys>e%_h=CAJc z@7#a5zV>+I;ph3>=I8yjjZZi4KUlw$xA5?2<JS+@)^+#p!;Rj0_XPtfP-@;jNPRCB ze%^TKKOG0s&*z3gB>JORj6**^zvZW8zwgD7O5G^Um;C)yx?VaP@rbeNXQA^kF7-<^ zzCo&k+E~wmz)%c?vq>osu11Q%y$%J;iFwR4pnwIjh+b1HYZb6wOIQ&8HQ55W$&Fh) zk-j8WRgn5Tjrm|4gd&Kxcr1B99EKr1xm*MaY8s4F=qNY3UIPT^M|Wa!4VSu$CaVi$ zw<(u1Sa-K2ms4X}*JCYtJ*#KtA)A_6O|Q8w*tC`zJM73ztwZCOF(Wg+vV{Q_&2B!| z@9z~x>GwM|X@Yp(?DqwX)$ix^aU$H*&+B3AxuME!<%h#gL!P5$cI1xy{49y)tJD`2 zp}bz0qSxGxM}FdN`FYDt3&B8Y7|W5H{>hN9gUG+4)kFq+c*p9VD_4hcD8S9?NUjcc z`u&^ggXqSd__5bd_TIam4sUMl$nZzQ4?g^G_3>&FB-cvqUE5EhXYYGElU3!X<0Osa zP@V1yKk*}>R+0mfEr<fhMk1&sG={arY_rMeZ<~v3vQ+xjO10D@*P|cZXLjItfL`J0 zu)sxOl8)(lXkLJB=?NOPCf6T=B^mMII1G8>db`la>S;rBQsY(rY_+sQcT&5ou3c6g zQ!e8b@;sUj(<;|0E1EYjnzx8(pZ0S+syZ6Obl4J`oULS-t?<aS^rJgn+L_)(rxc=@ zTp^|*4tlAXu|p=zT`RtlkyzGlO^b8+zT)kY(>7P*;V|$5KT5*`K2ENs@ip?7Uv%@v zINFWkX9#r()H39E(Bu}}TMGr*v<o##O0Np$R6ZH+{s0>l0i9tkv&p$iu9F4wEzEgj z7Wz@BG;wL^GIT2G<n4n?DM><-nO|5_Yic7fEctF`9a+b)ZDu|)Y$LUI9r-cCa{*#c zjFiHM%!?J+YwJ)WqwiCw>ASI0*KV+%8Ak}jW0*dxQ-HbufY03XQ(p4Rqw#3qOCAra z$oB;=!sRM&cjL%!UnN**3xDX2!?f)<y!<`#UFmJ}cH*Yns?8Bb<;E4x?+<wtrx+VY z;wqPg#}(v?*<xl!t6Y(8`@BR(uu-u%i`ADo;Q_s*S~VjzTg{)jimSx;f??o;3-Cwu z_uO#obI*;4!GX_(pZanXM0nw|Al;6~>5Nn`N@AH36w<~*D`5XIQ7JHr2Z{s-egJQ{ z>v^%%KnhUBmKh;}BqW9r{IacPdy9?y3gmF3gU(exjzV849;8IJ&{oOyjFK8BNeFRH z46-tt>jDV1Z&QMnuc66nUKlGRr2ATubtz*h=V+GPzrxL$wqV{UO`Nk~&XSx3Ioo?R z4(2GCm9qa3Botw$G3PLoontlu7F%R>^PG8+Ip*Yi6&$B_y%hE{>{<jBxT=w{V+!~d zx$0!KM5<K6U{F$lnttRRkbaQF6!gjCsB%H%b$JDZ%3zk4(0^3`Cs6%zC*>`rLC8D_ z<CEzbqr~KlQI3a-QKU3vWu(0e0+EVQmYEc30NIcJFV@{ioC2xSlH7$1B#QhlnvPX~ zt(NC)8YQh4jfPzk${R}wb$o&uMR-HFOXhe<v~m#$E?`Bsi-fDus>7hWZpWc)MCgr7 z>-4LlrJv9D`%lMiSk5$%jbpFhmlr`pzDW&nS@7GT9)b8N9yPbbs4hUxpri8~WjBL4 z3(b17=Dg|HGli4;62NN64ACKl3wXxV-2Wmo<uEgkkP7f@rRI^9S@0UuHUOajP_*@F zW7?dyvL>L@l$)8E+!fZAu0YVTr}LmOpVov8_|)0)kbRBO&y0-xt~R;x$ylX440e6q z1_Z2}s^+eA0EeiDG*ndC6ImxApvc*Zq>QW;GdaKJMr}YKN<n^^>MD*DTF+|=@tfvW z5+}I@>QV<Q`Ir12nvSCbSNm>`z?3P99J<MOFiYKZJFn|Bx1Za9BtN%z@rv9IBH+o( zj-hEk#6Crd+prw7&K&j@Y76*=X|rYX#eeYgbT-2RVr7=A{*H%(iz$?!Svo(RQtoF) zw2aKekeOCaXQs*5P`as=ZXa1>B8L2RRLg7_s}+5P**a!L+Bj-vDE%<@0AnqT{VsJf z>^U}2CR&FUX5Pz;bZ%#Uw;}(C^$Xy`&T7bTjjTDej&XQM7im5--T-U}c8D7HGq_1+ z%fEus8Oor@l}lL*^@2&W9eeWcyJU`b0p)EzIN(ZWF~ayVkzEBCiz*B8wmKLM;;>A6 zWmK2Y3`m+$60xsz%JcV8GoK1&op*rfvjsp|BpVId74ae^p5z!H9j!qQDBsSJ$y{EY z9%c!(N-@<0=xkt2J_{5IxH6~CGWSaN1sOND{e9o-oGl!Wd`^=6b6fhZ$QvV9s%<yS z?J#zQqzX>HN7H8s!-q1S_)$L|?D$?PYc$^Q;!zUdoMWj2h3)##qw+c0ULAoN*h^_y zaw0d6rgU?7vR1GBK22zRBR7{HQ1cUNZcuX*O>WZ}>s1G*T;}6aw9ROk>>^t<>!u0l zbJ#puy3Sb+yTC43HgeLeE~A|kb!)iPb2PfDG~jKEbX3%pnQ@3i3Z<kee0gdMYYNan zwPj8l`<tniVg8Qs<(+9WYwp+tI6Jke1AikQ{{r<{J#*eLrj4gJGbgh!wvRbLl1g!} z>E{OW2B<x~NuEpK<DNlAS}zWVy6UKGTh=Y8(`HTqYm9iC)Ka?V{h{8X>+jhrq{;!6 zVRX<t@u89&0)X6Z^8kfU1P2p^V-^N3Y0o?<-F8toQu$Ok?6<!nLhMk6rE~RF?dJdE zh~Mg_y4GAN%F8m&ic*aPa1}}(a7fG!1BnQ8@q(?0Dk>7JVg-y<T|NSe>-VF`bNN;n z58O~kBcup@muMhjqidIj=wIUcL`g7B?;uU^0fu%#@iECAs6v=H!pWlj2p<X7``ufg zuD3N@lmqu3Y}~%}pv~ii2q0!9NNxMxF4dm|D;0B^FJh1?(5jNbyR|h}yjW*p)h=qg z?u#D$^My-|K+|dD&1wna6nK-@0Biof)bU*}-kw{o+{#;6s9i{P=HxwWmQ?oWc<VKF zLJ!1#?wrVz&lmkdl-zl+aqAAggmfQ0MlngBFM6#3K6rpAQjZxYa)ao-l6NS?e~(L1 zwPMUWrfn`E-{6lP3PhBM6q>K&*`pQoqe{%iwT4UGMw8<3cZ34#m?@+o90YOr!?_kf zjvzGl-_8sK--RiouLv3Yd68(ani)^uK{yfM*CyX+O>ep>PAX*B!VMJp4C?WC58pp9 zTKIbb;O?Fqgzg~3Xv7sh81N)?Q>xWf>77rWJVA}#7G%4DkIEkh3)K7g=0INQ<HP_x zaTies^Ohfn^yvx!TUa!=ckr6r^1=W$m_|fhmUrrsB+r}GD{}{5V^9Oo$s})-%;%`U z@QH>#hZHh&@GUHe2#DP@0O$IM{)$cVGyUS*Nx!7>XVNnn%4l35%TP_g<d=A+QqYt? zMUN_Kx+7Z<Upf=WkI?I#r7s5fE)=Sj@;IPB)kuq$kr{P%(D|e1BnR)mUvQ^ARQ{Ic z>0?xpg9wTX9njlP@jWXX^XAWr#PSi<SNhOVd>?@ine+C%y}0I_cP=^aG|&7On2mBq literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e0282b4644ccd20b57f81a5b70213677bbd299e GIT binary patch literal 42103 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 OP@?m1_uz*Tcl|$T4}|>y literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6389aabe2a46770aa3815ac48d22a508c1b80c03 GIT binary patch literal 1991 zcmaJ?QI8un5VpOWWRtt3M_VCiD`Dt~617cAp=v7uswfl*p+lng04pJDZ|x+T+w3m3 zH+PA0PuExY38;PKKk&leuz2ICe}N}vHo3i4s&M4-*q*h&nfb=~vfJ$tXn#gme*UXT z$UitaYd$ECpqmv4NhD24xE^Upt2qn3YV<c_qZ(P-oVCIhCDN0A8qC^Z8}x>3J|kgA zb;2#xR^D`b+C8OV?;9dpGI&O0pn9iX*oAppc3|F7U6@~x^eO3Yy#xeguTPyfi;9;N zCZKo6%8D{8A{$SXjL`%e?gr2wLpOIpNP0pRmn~Tl$;MQAzp^O>K>kzW6Uz=e`WA(c zDEWzG>_-3!7dDr7Ivm;$%9c9g`?^#-8S%#pJIOO1M;SkWg;|kntK^_EU0zx54!%l^ zEp3vT!9kg%QmA9=+O-O}gOSc>DOl}4>3gmt#QGp1bOX@3_SeU;Dr}NxeHw1X)s<+H z{y}sb4E`;Kg-+&?Rl|9thod}|N}J(K4-ck7JTUjN`*ZneEQ<NvJ9hM7Jk{yPqk9h@ z4)=#eQru25W1}>^eOzQmpTyJU(14GH&GXc}ssd`282~XT7H(TiqPY@lEZZ2@9th(5 zl(8M^(;jV7y#*_E5^$SAe+1od5Q-pYLMAD2gh>y$;7eaNU<77B$Xn?6=Fa8)TIF^U zSza1t_>Dn)gO8FF)Fk6Y8pVp|BUmmL$D57VgR8J%B$2=0LpL9RSozO^2$H>ED<Y_6 zQ*T99bj3#A%KM$I{NIog1aNqJu2(EXn#>Z&t%!=`N#A!~kr%oP=Rm${Y%YM@Wr-D{ z-*CQB>B#w6G*hl+@>0jjI6u;3<JjR*mASRRg3~)7u0uBnl6XD3yjUMQI6E~)Dq}+< z^r)ir9w?Ta65YYtSdl3$E=qPnSM)i10X28X^se+XCL1Trde42^m^Ni|#a?(Po^9D+ z1)fjar|gtMB-&MdwU&QZ99~m?9odZw{3x*#jv?miEIo$XoWHhjCyHC}RoVKSG|I+h zG*;)I4fy^fF?^=tNt7jK#({?Uk>RyvR6=>__333%q>K8nLaW<xp3N23TYdFGX%Pu* zj+6$Xs5Q<FvUORaOM8wiz4+$Mr9X&^V#x;avVk7$_B$18U2q1$H2{&)u01NVxT*=) zDk5!@D0NIL=b7@r`B=Le*{v^u===ID7+@JZ4m;~GVAbnuXo4kso_KdnZ2S-aKy082 zn+yE954HyDi!__eryY8k?$G6juQ20(KHlp$k&sA0A@Et5<+4ms-xlJRGD<f)Eg@tc z!)t>a)bF7<$5?3<LlFjtZs2c$1k`6iQ{&oeC5{Ar1l{0Sua`KMl52gJ9Oy_dmY;uH z8q3q<Q1OUsH7?Ug^V+Xl98-yJq~(zTi*)@N)VZ-Ll6w$i4marcQG9^nI*K>p-i3_^ z&<!Ripc?1>9eouB{VoXCll21~=aAEOJ$E~`I#5~z72Ty*R?g@jUOj&@2Urw38<^yH zFw5u4RJ;hAvphRg3yp<aQ7r6KFKDsQ>e%^sZxu{^0Syr1n|yJ>XX_k(fpIo(g9zy6 P$F|wF7hLc`?!5CKRHYBx literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e604d803b46e089a978be397b02041b15737f20 GIT binary patch literal 1556 zcmZ8h-EJH;6t+FHv(ssk{tzlu5LhCWG9t;A(uxL^@>3ci6s@YJQc<89O>FP(?9Pk_ z+mkfW<SM)YFOXdF4m^o(x#AVL;@F#rq+Z#_du)Gm{C(&6`^CisLHjGe`{t(wg#LDa zE*gQ!x6t*EFmS|ii7LE{v73{U>=JK--N4&$H{<~ie@DAL-s2J2i1&F6w$HEe1Z>R7 z4oa{8186A4_C~&^W!V~$6;&gZ88WxvS^zzU{tUW)0fRxOnBy~ij1H3yP02BSjq2qP znP8TvRgBz^;~n%f?3{)j&Uzg_LC3^I9WnhAqPIJ83ZDlA(zzglqs^DXw5ry0To!wb z?hB<0SyOFPQIFTCRCFk7L5mTsrJ=0`?|kdV(Dri8iXy#cBW4a8p>6o=hwW{<Jg(bp zEKKGQvvWkd^qm3BJ-Fv{rKGYk%h)7WS!4T3Xm{Qw1;A^Q*G$*|BCrt`OmdM1_Ew`L z6Iy3=UJ2dgOsEJ5vDeSxGuZwoQa8Z&Z#igGv7Z|;*w58qBufsL8dPeqH_fug`ceJm zK7YuvX8*x`GkQFps`B&Eqs`61t3gvV>pp_ATz}it2Vb!1(Le)1jghj{m#3btjph(; zd-<9!4xq>-lU{}a^%G2Rf|r6Qh;c*`oDg*j{LG2#T6o^Q$S%X?B6sMF90y&XR}47~ zIO)(GWWqB70tY+D^t#|Q;^7%S!5y9vxpnU8c@LTOK-_3}w6glmizih+mFnp)_t!Vy ze3t&Y;ax@jzw7Ah=WiRqjNtDi!9igr^Z{iO^0F4S(bPk2RPOW|9ZT~Sy{ETq&%41m zf7-W13Fk9xV&j8c)j$a3hMU=?mu+o|O1z%CZBW$4_Qp!KO&Y2txV~Ld;<vU?f@gEs zMSv};w#q!b#g$iiKHPK%-eVKNX4w@TR$xIpIMiRjA&x+T5Z}h?WAHFn(5^WN9Q~ep zw_=d1mJSMf7OUH?k__&EdZ;2GJtf1fbgrJqNdxsE98w>-!F}u9z}}za`yzAn<)+vx z#XQ7^uv5FTMi5pEVX04G&YZ(F4BZ8IH7L|UVf&z<Y<bY3k+TqB8Xo=eN*z)oDHld4 zAW2X&5m%*55(@32)N=|MT?#5k=XI{>DkSmRMfIojU{bIN0FLsuG!9!-jXAv7?ZJwg zvRu!<RZ2N)8#>C1Qg8UxVM;7g6z&1)x&leDPkVUp7Ox2PE@$yYHEqM$IZctLiKtJ( z1CLFTWuq3}ERki(5v81j$`zZs;|5n<ULVh^KXvIN?uAf3ZQ>`D<ZUUQ2H^6!vOr=G NBo5-c@y+;y{{TaDmgN8d literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65d4c4ba439363b3748a7dd3ee3be085a5df854d GIT binary patch literal 3766 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3371c57b15d3a9d1156c916ef91db3fc32bfd506 GIT binary patch literal 870 zcmYjQ&2AGh5cc0D+qC6^5G|*@2B}#Jt!SkRA-JNd0#0cw%UL^((_Qb%>x3psPJtuu z&>ndQp2Sy9eFaX8vmiRw%+7db$KSU*ez(2dK_EZHv&+X6p<f~RCj^|gpmh(7M13T& zBsuQm^^^38q>_C_eX5v@u8DoF=n7#Z$tTop&Cfd@#KdHy#En#PHgluWBz0zW<r471 zW>yx3Ffz%tQHdBjWjnQUlggE4UMIRv24(4LXGK*hnM}1vbWxSo^*Z+e2%ToZ25Est zpzlFz3&sHqhsQ+XU9?1wE&x;j`<*UvvoGm4vfI?q;GZDJTqGmcTG1t0kOf-d+x8t= z(gnSZWlOg2$db8@1%qBO)I_ech!%K7fG`EZ8}qYH0`hUvko!wj1L;}a6ZUF)zJHkr z;5AINOGZMj%LhuCM4M@O4HS)V6D#t3)?4T9F;MX_=Y`OQ^V2R3!BFRl^WYg#1h37x zEHiLeSt&DT7xu!;$%XMu-Kea)>9;r^OmyzFsiBGj9?t?G&!o<rZ(k`VoU=Z5fWqjx zvh8p%vr0(cwyMfSrhFTIR|RL=7?RzV-)tDJQTUC3rLIC<6i{&AYSR5pQ`&+zfoEAM z)emH!LW|!;T3J06PNh>}(_xuQW$U!C>0r$HQGIA$Pvt?ztLe)ZZg_Mxw)y_>@c20W zoL0Kp12PUi)!t2IzP!rD^Ys7dJaqH*4ECy-r*>kt;oN!$42l@;V6t8@*&$oFS#}q4 v7A^wnMmCI<eH2W%BTXud*&6->6B_#Xq$uSiS8o_Zb$EeAF^*~cB*uRLlos$$ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..333dd3d21423f5f4a7409e2bab907a32eaf0fc53 GIT binary patch literal 2449 zcmbVNTaOzx6t?G*OlGr}ZWp>*D2z%~DN>t2OGS$is%Y7Y2LghXibg7<N$jMPolDks zw%I6s+P=b1K-owB1HZ%)PdxD#`ouZTB%4-kL3re2d&ZaJ?|kQ*uh!Rn0_Bf*@A02i zLjJ<RqBzjG2UY$AhLMmk%B+-TR%lb~+o_Yep=<h1TFI(mHS<ExjNP;r)*cd8Vb$k^ zReAN)4t*GVtOny6w_$8C_eaw3Cnx^>kyJ&NOgIa^O~y%nQx&%YIT{WNp+5Kh;6@NL zCKqplULk^RksouRlDr?VqN})6()ay?Cy5NQf{juhh&Yj425}yIli@~R3jynjJox@Z zJ%Q$C)BhVTMjBMtmZ!qNPK$oS(wjf<UfflMfFllyBGs4rTt&TP%!Q14qR66Q+&zr@ zyxqlJ7R7?jJ*e_37*0Y8z*z{~a}wIjW)8Ftb6EvimsJ4(PwzfRq#CItm9L!H#oe%A zC~T<TL6tjT6dBMd?a`_AoAoOJ$O-I3+YL+LH0^S{Y{Sux<Y`aane1yP7JaF$!>7L! zQHMz{j#@*J9LI{cj$_g46)A(OwKCD_45H|cyq$k`%s%Z#!{eJDtKOadK%}4aZr{Dz zI%o}(;f*AhDo)cI<6-{vR(CLINv=ji1xU%&Zklv3nh_s2hbOuQ*ha>;ZM=!O9-Uly z)BT&v=}RQ=dRQOg`u~80ljOakVG9rDiy9gvya8Zt)?ujE@Su!K3GsXfUMxJj`c}`% z1^?SOm+{W1|F6y&(9G1`71!Plnwj2iRJ0dGd7SYm(tZ@pGXwhdC^{O&>HLe>Kt#6C zU{qGHL7E5zNL0XFfGV-$QP1{l^R5fSWx=@IgDS6qS#rO|EM`Baz<%JpVZRXtV84gy zFOUTLU0jO=nT}`Nhbje_DH#CQ89l6tEoAwW%3W-gHM4Q&nKPwl^b$Fv6z0y{Gsp&L zE2gzXM^y)&$W;yY@lWY9duk8Xrm!D8&MzQjd0o|K>r>eG%qsK9Z68dk`zS>H-~|mp z4BV$8Q9N8<NKI7a=}BWl*BNB4NIH<bMIL%1$s=UDNkXv+-fL%2B)PsEEfpq;I-?|I zb0smck$P|SGaq-;5#y!QX#YH~!W}Wn%>i(JwD85mL9ZEQD);k5sa+8C<-yuptZq0a z9kkm^QZ7Spv6H4^CHN-p0o>s-REg9hcAYxr*`dGz=vAmsx2?(c@{s1@j4s6mP%ykM zR1?q+bTFX8#}M|RACd6~iVmy?<nhikir;3of{>m<P$@aueT4JfL4^?@z|Z4gK6=CK z{YOh7tO|5nybmUPcOgP^j7r^>y28hb=S-k`0xuYDE+SZ>4|<Biq3Q4yV8V;9iDMI{ zO3Whyz#uqvx&w8CPA;DV^qO@`tS|{M0Ss1c=qR{7qkVE}8*Bh4gTu8co!Ni{j1i^r zl_>>8_MTZ&3*I`16>%NgnL9P#kFJ-vSnY7*WqN@^RN=oCD<$R#Tv{UV@<j0wxMMKY z6~VLOn3uX0Zk7{EO3Tncr{b%qZAI`SSf%$J*j1v;5C96H^5L26t-|&4f_8)MH!9*H zdV}&WP_9LQW)IDKXpC;18^dJeA+n)VF#m!#m!8I&u11(lAd4HA&gMtlL~Eo;d<ctl uZTV&XgWW1A)m&tnz_`tsgr}IKe4QWK`(m!bUm~&0)g243zGZp#*4jU=tXts# literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28bd93241f935e6ef833eae34e5431547bc2f4ef GIT binary patch literal 4650 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 An*aa+ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5162c7ee085a7441f84fe41528138552780c3415 GIT binary patch literal 34447 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 TK>q097YDzT$l&@?;_m+j;k#Y4 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96df84e13b2172ae27cbd0d273460b57bdc924cf GIT binary patch literal 3628 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 Jj_0iI{|Bu9u;Ks! literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..237f1d6270200bb067ac6970891d83067b6ba6fb GIT binary patch literal 32714 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 Pn}#15I-E?PB>H~=;O|AM literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0b4e923579698c0b303af7f52f00b6bb6af5b650 GIT binary patch literal 7218 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 K{YYcE(*FQhGX_im literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed1ad7c8c40fa6c2c6b4efa6c4321637ef283bad GIT binary patch literal 827 zcma)4&2AGh5Vm)d-R+X9zzM;{*GM!Ap;cN5MTj2A0jfyNg_Y3CSv#py?+>;UvQdsa zNPFZRc#^$x;uSbC-ULx`Vx$@WjlcQ6vELpZh6wCCefsH%gU}DV_+zj}Z@~2g0z)xk zm^l*17)Dn*nH#$pu@-B8MRAL}i?-@9Z@<E~-W_88jZ+NmN$hi9jd+lIEMNzaf54n8 z)D1WN@S?~{YQ$7XVJdR9EXzU}GAk4rSLV9NNxwHBG-rfUB?VXEPhf*CySR3>Sf`ex zH9NZC7vS1z+M-*u#djFW;LRu`VDH3==YT~<lgao4*P71xbE3FeD%h5iTyx5}(j=oM zy%zbLP%>}s-0-T`KtNf4&P@W@U8nZ59Z2m$!Z)NmsQc@4R4TEehDR%^qFEs=WR$6B zx=4~UeVPwe>?BRfRsV&Voy`|YzMP$&pGT9Z6y>qVwE^(sb(w#8l`b}s2709_3aRf; z%c?&}o6hyhsy^CNO7;S*e%*AYr2?4$Uzco8LqOVtbRE@#yQ*!2RkjPhomtSw;JYHY zZoe1#a-Cw>vSvr?&0|=QEwayW*&sj_y#5EU4qi)|O&J|NgKQ0sR0l#gto<ZmMVcga zP)cgxUu5y4zdh;kwc#pPR&2wncE=z4wWlj>corW?%PWCyB~+(Ez@ITHexNd=I8QX4 l@q0uXjaDA8$qKfVd}x1^wnAG@;B?%;_i)heV9$Mse*>Ab%H;q6 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ce8b11d0005f97b0556571c335881f6b24e3734 GIT binary patch literal 1225 zcmZ`&&2AGh5VpO}W?Lw#svZ#KuqQ+$XrO>75<(Tf0;Gb}io#0BGHWMn>ixlX(kAK+ z&O8I$;2n69y>j9eI5D$H3W74L8ISGR`T1sicWG&n0DY6^UOx;7`Hq`8MWAc}yXPSK zBq5q6Y`m<9q9(|B!YSD!#Rez3wZCYeP=X)aG7~0Yvj$1<h^RpE4@B|zEa9(6!Cr#J z4(YUhfLGF?^~$c!tI|q4zMom0`qGZKQ@ooK17!=?T?C;?LKR7vqDi2b3O<m8E3R6w zwp6Ivu!brE{|grXn|xV}XY@kbaqP0ZGCKD2kg=M_jMK94`q0O@EM#BX_2VD+GGk&7 zKl?IP+Gww1+4I^SNUJWzZ-zcTKnrPH8E5^Xv^sva6U#zjw9H6*>`7Z&S{Ika)K69x zzoVoS(nZ3wp%vsQusaJvks~6Arvug_NAx4bogz>o-R=Z6FJ!Lk2rKGkM%V3pU*V?1 zYVNe@)!{xQ+IL@x#fJWT*R5<el3sU5(sp~LQQEq0Zo6*=LTtJl#m$kro{DO;amDvG z`vYsP_HNv|)!pq@S#>!poR`L2KCFs^Yw2Lpb=nUrUzW!GsaE4_SJN`Dq+hSbbtFVq zWL}6>EQy04G^CTYe;dC(w>(AzQ9-^3>_QMnWH76pT7;=XEgm<;O~nFi>jfb+^wSD~ z5IO{v(8>7|L(UA-CNr?Z6|rh!Zh$gg@#GWWK7g_N%$l)Z<-`Xt_7|pOKO1c96l;3J zws$+c4&B?K&rBWK+*_@igzNURod-Aw9o}SKxAkG_$CXYZP)5=Wr<%7i)qj@-Q0ha3 zat+dQ&D*7nuFy082Xtz`-DzVVa9D(>7lp`6H8iN77UJDdn%PZT2vw#+SoCdAp;$(N zc>Ey{<K}@af#UEoYH=3vC}>V07&wAK0skCptCt|6_A)inIq;4UH<tCO$N2hvgNQwi c$0vlUqubMb@8B%BGaxwQ0b|Qhc|;@j3*bU6zW@LL literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e379fd3fabf88fc3856e17a6c00595cecec3a3d8 GIT binary patch literal 1436 zcmZux-EZ7P5Z@2`&gb~jrbP4ugsdVpJ&E1{p=v8tRa1Iuk!V1Wepy16<K4UZ;<KII zO~^&Q7t%+b5s%3W5`sU0zhqx|%D=!1%=i>hLD!nu+40PH<~Or`(CzvJ)*s20?|yR# z`4bOk%LCy)kp2mnAcE#3TI@8U&6!1P7Bmu%_;XTRa)@+xe07%+d<2d7OH!~G=*4n( z+KO7BC4%SesTX;a$WG)-cDy7U;hwN4ctk`?v|kg^K4MW<E=wXj**)UXIgq*NNbmUk z37M>bW<}6%NzXrp+{k8+TCTGL*p^<IX&zUJ(o$LXt7=1y5B;)AOCiHVjZ-u~TMUHz zK>B@Pl3-C06I8I*B;tY#2X;sdKGU-29?XoyC~;a&tHh+}j0<<9&w(_8S<{-tP$jrg zOw2*A9<z>?`AD_E;#Z;&+rM@PmCE)LBM1A58jQ+ZNTml;HQ1iS@ojyxxV0}nOXF() z(~r&Q_IRT5PewQI+!<^Qs;s(^71|_ue&e7jzF$u#hXXCmUS-NM*Kdl|Y<+!^a=)5c zFOIV!GjaS5rrXp&4=??vw*Hw>O2G;jrVHai5I+4oFhh=^y)~K82|HnPYWPAvqH`wL zoC7%rKh(TtJ4F2gknqc7?$)kxChm@_engGn7s+LW3y?-hxU1wMsX?B%K-aoO=DhJ} z?J)JTX-_=ShA8d2RkwwAL|4h&*}YZ-qSM%Ov^SmFty@Rz8I0fVwdX{1a7YgCz071T z!nNyV^$|=#Z!N5nOogLTg)&KBg=HmGVzRObvm$I}rQDv#)P!qzShI9nArz+#L)1<o zJ~`zm{S7N4aNg|s)=iX3W=)rEJ1t>YgtR=Dh2<jCw)=SF*)ZPt=F!t9!_6%l3}0*w zHy;ikqDo<0+sz6i$5O>+R!OZ8^q!~M_{!ae5!9B;a%6dBlnvy8k%f>VhMFuZE6YKM zI(b=)8~<j^7OaC2u=@sL$M3>PhrkFwPXp#qhxyC{3Mp{v(||hM0r{=7(S+FSxfriV zrZSGLAIH;D?Bys2alE^i<cl{7uY~#l84l4K3^P(LunRyM3-zeS8;$kOCenI)h16+M z$=(IEiXJP#>{43hIrIlQrmcfl-Y$JHtx9EvN|h>F`S&jL5hPVK=tl4TPv3{%Mt@rF z1J>A0>mcs73*|_Yq<Nw>R)@6+xLvtyI<iQzJq8nFl)8$J{^PADUw+;EchrZN=v&IQ g-rWUC_i&K(6<|;^z{~*fW$Lp4o52FUd^O<z0F^0kX8-^I literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f95ffaa5e07a5a5a34501d9306c621ca7fcbb9c GIT binary patch literal 15552 zcmcIrS#TW3d7f(zEDnMsNP;3I4JAtC(j+K}lr7mbO`3--MS>WT66Lkz^<ZZJEU=e) zW<g@Luu}$Y(N(b|=PIX?*g$S4mAf1#WhJqz9H+{0DwPN4Ve*)&RM{_i_e=79f6tx( z6<V(B*7WrB^z{7Q|NZwr9~~dh8Th^9-S_HuKVTUD$&1b}i^@41Va_rP-|)?fQP5|z zV9K>su;gqPY&kmxN6x82O3vv*TF#k5M$XwnR?Z`Z5uB|`t~y#6H94kT8LN&L#;X&B z3Ar{aI|`G5xwLa*m+x$vYD1peU7fNF)2Qx|a<7#83e%=h8$;hcfw8oIzfqW8%?9@s z4%{$m(~c1wT+XQ<n0N}~nuP<OFlyGzMsR=O0gRZcJXm!LuDmf_nXDcv96~+gXZ;aB zx8M{W@=y4q{@87^@Nke>I_%H*<Nm~LbKNXFBG)_o$=e359+j(|{w}#XB3HZpDY-iO zF~i^E@4apKdxQMCT{wp8ef~7Ar`N5*`=sxF|32w^+&|zSyloUtNbCLn1JXJpR}cEG zT%Gg}`46GbWB$YbVVocLAMtZIKY?){^)nbZgK<v<rvt-3vTnU?s_$W4o?I{s@2@!v zM&bSFcht|KUp6=ecs>v~8&3uH($jw4KZe%#ZG3RkxQJP8T7?gx?{R+wts{YpzGr;% znvp;GBT~q0-i+<Ad@FCo*|}!95|wLVY*)QT>@0aJ9_~(DEQe7uDp$fwO4SuwMsL>D za=Erp41*}%aegk0lvj$bc{P8oek-25SXMzPs;kv*OHz5MT(5Xhxn7G$RI|pXn~jo9 zDDcbR7{PG?NBArX-(0gJqiwY9b?dE(HK*-tn4890>IO*e=Z&kz%SPMst>vtmX`5?S zWVKUm5a7DKmX7Rpx^1?tbsJ=0VX97RCg<XJWi?u?*W6QXx!R}%)u0v$IBtF34Q>Uc z`En)D9b-$)&BhKJ^G@v48$m60RN(n>rc|#s&`*s6#C#^s@}Zhn4dTo~r9S6X!Z=;2 zmw0xnbw7yHSe?MD;#^YYMie_Gw0_-C(|G<TwUZ51Uh$&f<cg<G&etn`pu&??b#iX0 zSbQpcvi5-$|8%L?Sb5^HX#S~%B~^KR{>i7GK6(9Qque+FR7GB;a^hB_cJowesdZ9T zG^*Dt;XqX*W~Q+kj}$xee3;8Tfx>VcbIjajW=)>eeP}6}Y{w4*!=PX(;Rr9Hh>RtQ z4CC|Geq+tVdK=3l>TtWS{fyDdwau5nrofZYHhWK;0mgg-*f3{7Y<9Sc74p==3NEm; zjY^yfy_LY1h0(=+yfGeOYmprvBNSsO3~K`5PMDUNv($sQCVcWE;9Y=caM61`048Wg z7qq^61E8q`crJDtUbL7u)dRTL9wc`75blN)umnlKIfVMa`th!;-)U3`&XR?7Gkxnz zmT5%xlEZb3?4r}k`E~-Fjdeo{*2@;^eNL$N`Fd?RSUrLFmKNP8s5XRNS@Fxty;+VH zU9O{763RaA2DPxMz@~0F0(papLmB2eI5;cU#rpDWJ{6BQmKTaD2<uH%3c@(oSUvSP zsoaa=Y}H#1FnSngJ1>kg$s2*U(Z2U>yHexzl|ZSo9~AizDM%wQHEE^smlewouNb9( zte8fia6RZ~1M9YFngjGDttMN0v}MOu9Za|oM5UX4oGL8>e!!ZJKtn;aEtsiBGhFmv zBzU4nt*n{T=p+bT>O$SHah$^u9z+os)S%FwX2A{|-|}sd?J3^@+EVeJ7i*1jX}J=3 zbCuxIty0jS@M~QWG@P#iDM=IY1_VGJ5nW!b9xVpS?LOf~i(cfG>dlJp;+{JfxO!Y) zOREz3ls^JDAVXKDutK1(O|GBW#!AgY9y&&3L7iUgs8gtLyXvfg9^2MNs%^Ec2=a3s z|4sDnQsEZ`ZpzW~m7Csb2&ki`s=1!)H>-`ncaJ7e<=tqt5nvuZr#Rz2L-AU2OJ40r zKk&!9<K0wVgH&3sx!W$8I}Z|!^kn&dMLq{}p2TSuLO88o9H$6K7>{&UF5cA>i8G;= zgYs1Du&W3jmA7Mu0LM0<jO|h-9AbDy*7b2{>PTDWlsRFInXUV_g?5HR&*sx{wpgTQ zC>G;fu?S_*tgt>-EWXzCD#@KpvFO)JY=$h4%B5-m73Iqt`=Fq*P!xv(e376yD6+O= zNy`9<k{Zsj%TW~lB&rD%#+~D*U}~iNw4cE_?Po!*Bk@Fc*{(t4s@A78ow^t5wJ5k1 zxzBqwZvk{E)OfR8skju)Ky#0fkGo-@%3h`13jE_j03d6a0s*iqqe1@%Dxunrmf@Ml z1;Wf}wY8Rz`9oMaVNjXxTMVrhibb$Xpo+y?d`vjNY)ubNVW!)u#BurKnTNd0MWt<p zux778G?PKv)+WSE(Q4Z$ZLyQA+3R^nR#~tTr;DPeV!Ig4;l@WWhI&5>7~V!~MRUWT zf(#&Tqhj%ObkHOOUF+BrX4-D;+X}Jt?dlL452bJjz<iGnUT(v%Th6FSS~rmySxW$S z$yv8vvDRn{r8dO=L0e|CV*}Z(hdQ_*W2)eU^2#C6x7x#>I*%93=CiQ_dn8m`C`Gj! zrz&;N59PMvTE`g`$n)x>xXRl@%P_nIX}r2w4ZeWBT3y;>rep0gTYHA4uls?g)zj#! zKFESfR-IvSj>Sb5A7>$4(JO>M&hiEhc}>=FtgM|KRctNckRRcvlzbRR_!0_g<qd1o z_#*W1y7AW7nsKLNCYajNlpf9<(LZk(^U&T9^;x#k#9lL_6y+u4r?HXV6c<JG_J+`W zhkqd5ZZ4LgyJ3CSRRn>lWkTqBU=SgynVdXvU3s;TtP=K66GA$I-fLdPjq2dR0183# zCE9gE@LChbB+OCj`$V<Kc=cu!LJ9XjrFn3+OJ-aYqWcsV<uHo2@#;aCCgvRjgl4tP z4M@OEGenI>%4^Vhn4;Cn1vMD7P+Q>)U5Ol|n2JIgBhb0l%wsSi>b{7<0b`1|`pL+d zg`gJPYN)ec<6F}x9K$lRR_j5oMj|r9nKRm;K0DLx5Bd-*Et9Mut?I_ApgB%A8$OmU zo+y@}c~xf=AsN6V_M{JvEEPumpwhifI_iKZ5@xI)hPMfzn9JE5Y|lw+%$`bREp-*` z18Ycj6;`F;cxzg->P6$#F%St&Kl8)JYdM<6SUniRP(2k`W-=S~JRSjrV~MJuh6vTq zp|OwBg~+d<?dv#1S{kr~6<fLlPGQ<LqKHe%Hn>g$_AlBJgR0MTQsfD0C|F9=M~S|I z5>2i;D>TS;@wBYffE`(sC;k-UB?fX<TU0mDGO%J?Re~P=8Vb#dG>|tT%7h(n!Ay3* zmh(8L)<Jtw8dtM8XK+4)bC%5a)=|_(C>Y<GLM`W8WJtfm$cAQQuKZ6|6HM7~25G^9 zzUj1zi<KW$#{jW%QNUTQmurf16OxE`EYj%hbykOXi@u7=v!Go`t3Zo_Vo?Z_Ll<GK zYGa$VA;ibyGGZ~|{BL5Aa0&&zk1YOaDRXd(vZkVyFtE^MZy`-0k0gObrtBhfLw{^y z5y{ft$3Z_LHqM?s>lSN4;D<#_2RwfCNN+|*@`<Qw26yW`Ko9rOzc+ZXQE4ueYsoX0 z;Z5K5CB28B?aMXl*?V}E--&75L*IIMFK}Ft*uwB|t;dh{0BjE|NV^L|TR)pW`pQiE za2^2%3(9p8NQ#{~IP-C;N|!Hhi7bdSaLlL(w$R1^s=kNEwRqT>GnJ340r6m?p^p}{ z4Y6*mfz`-DU>r>gk926^YEXqQ2eV;5P!RdhOi((#sU7L+vUydnx^V7iI?4_G5TvNz zr1lX?Dc4pIAfYS7F*FB=YO2=5$n_cxRYz0=!l!Ti8Ta~P8Se~Ai?#A=P1uv#nXLr? zCG^xPhw@hHWgmCKCcq1u(6nCYK78u&C!u!%b>DDqv$3E&k~9ocnwJ9DP4Teiy|Sp- z`7+ET&z*19N&>4Nlqyivcmd#s`h}(LLD6`LCWXJ3hC>d_$ZGc_y2xh8O-lD6oT*Qu z?LTm6Ol1&%VN2JaqedLXA(;9xDq1{BDI5#_wSX~*y0^Y-8mo8O#zJC??1PwG${@~Q ze%?C6y19|{;n{66>M*jAqm>ekERAlA`L^%e7Rx3YM<ilm-BOh{Lb0%Ac0}oo$xYlt zByOj?<shEg)wX^34qvj?oM<=VbFe!l+LPEy2-u#6hdBigGd2;ggU7zNom$$XzR%J} z<Vb!0bBqoFwzbq}QZE}in9CL|nuYc<t*5Rw#kuUTs>YwI<7n_Sv^%E}0xY_ampbk^ zEB;|u_E8<uyt#%$bP;A|Y$ggAu@J;AB?d=VgFHEeq&Rz~;#KE-@9ckb031f^KsSEb zXPhLx==N2;a!rIf>WtD9i(=2__x7obj5ilDh7@N2ICZ^9Y(*$F@i4*=rxD}}RHPUl z<;YsX#UqF?R_46YG9n$|n4spzxpF80K`<wxYmti6Vwwf<9w>7H0j7iw>)30G76K<+ ziX`Y4=dQ{9OK?9VFc;?2g)!mqqF!=!lc2qd0+v&=hES!<Ew&IbHdlsLO_6T@3r9#p z$grj)qB0G?8P-#3!kn;k2scifllYg|qw}MdI)@{i0p13^S9q>MtMFVwf8x0!$d7Y| zfqtB`66QCsEx`c4QOMmo?C*f_b+9lRj0NMtC}{g~ki*#wCf1E$^o;S^WzgMWpFw}K zup^jMp9yyOyMsvt-zQO<3U;El6XWa|8t2Vm$G|vmVw}DHKD>1odQT7aeka&9(EA<q zmhFPVZuCAd)ceQ5?t$JvM(>0E{TO@7f53kb=RLmbAHsRB|B(MM&injH=<Y`pqm8YL zHyBSj0=<<;W%0z1Fp7ONf5c6~{O){RxhrKAAsA6^Q4|WY6aES>5ActTad}ACOFSU> zK=gnjSPk@n?!akIOr`FFWIDR8yZIpP(1os7k$4kMga={0S;}dfU$$Oj+{}zkm_zCr z^p7)(UI=Z6_?>!|*ADpvvQ(UIu|dU=$ep1P&6wrcET~4LX&RnH>-f;-MAt;<XWP!B zFve|KUv`o4!y?}s_P?uB7Zbb&aMFAiCuvx%>AStDE6llk<l+lB!befua^aw3kLK0A z5aKk$ENonG+d?)jUdsaMiI8&CFQ9*%0fGpX2odZz=&Qu}#s-4~a8(;!hnO)=!DMW# zj&;_?0PD5(Y=M}4y2wLc!MK3SND`%{j=)By+6&MDa#7+AIH!C>8H?B^qy>q9Nk-i! z#3_*wic^mr${@6m3>A(3I8zkSJBZLOR@FK5nIy;(lZE_n#Jp|o-vW3i6jY+{;E!j% zRDdVt33wn@HOZAO+L1$`>8?i^hL01#FXyxB4!Wz)v)~Bo3oPDXL6~J)>a(aNp&y3Q zOGODEj<5#*yBWkI+z|^XpNB9Z(Tjb(Nu@EVH2&Msj}97j>4$_ynJshLi%Q#g3)Bwo z!J_vmPOJ3*73UEeE=OFE({3I1kXD!A^I3rjEJZE?TF`F@%Gic}d!S1#7U0`Gyy)oB zr4@q4#o{3nf^y-Gv2K0Qe8YGHF=y^~+|Dwb0Q#_JOYF!Wr2}#GAdc_}6yylylDH@r z+Sa_?w!dn%oi|M#+PWh#x_QLsbSvcrwvz;D@hEmNuya{#c!>C?^z`gdA*Sm?A5we8 z*78mCCX2+`x+=rR@G5%p;`2L<L_f-j)ATZcnETAuso|*?tII_nQWGzV7K?nOfuLqL zO2G!a<Z~E6Q;L3}`eindyb}o2FR?-1yJy=WAMOE?vnEolNA3v_h%toQC@2|Qs4YWm ztX5f>?UGUlSAs7WP~0&aV|T$B#FECD2s-rb@Rs0=9<bo-z7EcS8w<Fx--K&PY|R6U z`g#CYV+pRxwMH}Qgi#5Kwlcnq+Q2gP!~&P`bZ=$S2*$Ub+-_xH4lTg+x<@40T5t+Z z-UU<ph^cKxe!K_K1aWob9wE~5g`y?D8<B3v_c%jkM(6)HmqR2acCp}2aWkuavj%@~ znR*IXrcZ`|S55GoQdKsmuvZV<rz^U1y0ob3^#~DM4qg~Rsl*(N)79nq@_e1c)i8LL z3x&wSJS@r*y{h-l-u<LPMiNr_C@MlKPi#jj5XIIV&|yEpaQA7jMU#-NW%O4tU_74C z5kj2rg^->h+GsS9*Qa2Qwobnb;uzM%`?%}%GqL;LJ|gNH^Ky@d!0+kSqxS|1Vn<o# zCTM17m<r7Q-jN3&<VQa5%4QcATK0mksq_tX5GbRRwuz=TH>$gmSp5;YcbHnd2J$lr zHiCY97ruVEhmIT&0xM-(K0*LMt^Q0H7$F8^m=}i@eXDiR=?S>sC)0@Z3U{cSXD-?W z9AbKkmNQ!)z5pK$?kOS@qL*CS+px76otAAEGTd>-CS<!;Bq94~QtoI9Drx1i5E0mw zgNSc;1``qIa~=W`41g_!GthNF{Za?KfJ3Y-vGJ@;YH72zH-Vpi0zpOK11v_9_%G1E zqhLp1&nb!KXehhr9)eeqT^IX+Jh%l&t-a+fT@X8}N*0%f-~fpGhC$S8*M%|Jm-<UQ zx7`{FomTo_y8kXP>0!I(C1n~}L)Psv0cr{6if``2b|Ms@1BI7*6Be<wT4=R<t=xgn z+pUibgHEd@bSvd$M%k#okK>}YthZ4U74CKyJ8Y#+Fx1wvPegT~gsYoRYsW~Y`xYA1 z+br&ikvDO-!P#>zhP~Hp9k|Q<#i9axPj9;|Cl+&!ue#0R9E*!AzQp2JScp^dI%}V0 zv75!Ovk*gD%<Dhq<)5)2dC7zXKZ;=X5mT1~#My=IZiHvh1Nlo9cKgy<C!4`PmCYdz zZtk*jIR|I_Q@qNK>elYrL4OA!m|&&WtW-)EsQcT2+BqB{*S0?rfmFK`cL2GM&OLOU zXvo+D;|>esn<n<ucOX?S6J)VhIO*?1Y+=OT<?n{4j_8AW**_x5geC$hM<tEWEQ}@b zfbk@GaKe|w!NLyzL8c5ACX<B0ok;LI>_37LclnQkl8#9rr*-BkHrf?}IejD|F;Q0= zD~N~A!8*_ZGWUer2!p0yKcS5S?b`e%rm235#aCH;jl~9wO%}h+;&)j5E{or1@dqsa z1Vw9V=2)dX_e4}bHFNBh8J&)Ccz}s%>I)NJMr9z5iCu_IdXJ8@!YNyFxcwvkq@>ie zEk+n{or$s=*y8CrY|d;vxWz&L`WlYVMIq6KX>4%7o7k|DpsBn}M;f$*b^1bb*;-vy zOI{d=Lak8fLFhk=v9^^SYq;@tM|!|VI&rbHz)8a6yN4Tcy*I0G@Ew1R0x`Z$o=Sn2 znIbZS=F7L>+;sPJL!o>{j!T^XLMC}A&h_;YPU*1=`~M=rr5H8Ly<mqlwu)N&?+SL; zVd(g2BJd94X*zTjqiU`>@IVo}LDCRXFF%KDC<-?nfQ3}zo3MhXaME?{l_`->J-Nhg zeH<<>QLebsNf-T90xdF%7Qun7;C6e)rs@*i0L)AzK)NWCCXR{*0Ud;>A)OK1U;Tb2 z0^GW#-^a9(C#T-Q7}%PL6mt+!c`-I$6!V>dBjnPlZ*dwFXo+srM8gfbyUSp9{|(NM zI>kU9CZzD*tutio<o|bO>hB0Ar>6d%#Xqo^Kmii_HtRAwO6s3tcI>|Kf6tB~p{~J- z?!DLz0U*A(RoRWws6QtZra**~SV%*(&K|$V7mGz?w)SmV(jg;`<V8O~MAR%QRNiY= z>w}%h(UP@ca|eF|)J}m#D;UXg_NLi5$84dc^s>d;Mh5jPO(^h$QS2lpTC<n)Bie5{ zhS4=?^tfIUbE^#`g{W`xHlv^FZ%}lsXcu)lX4t9-L{JRzi{R)FIpaz6q&H*Hqp_&& z#_ZPAmidEVx3IU3Cq<d|BD`D%$#Joy&1M`2ZKkx@5f+84kIi}q`%sSTAUk)-Dj|xH zRWgaV05Hl`OfpF*GhkepGV4U(#*C)vgh@n%CCi%PSkIaQLOqA#n;jH8+e%*~JIk8( zT!n51NtfJ6ASoP_Q6aOR0pczy4W@%3<Hs5V(o&yBA2o-fqZ&%Ao9er4?@3#N_pKgy zV4A;0OT4=$#%Z>5BNqvaWt=6cfG$4vj$#{WSsgy(z=d(~+p)2Po!}rW>`0#NG{m_Q z;(Ov+=<LM~K(bWd!3f_VEM#wkG-2bA492Z=(OI+sal;i7;eQ$x2ux7La#}qG7J%@C zC`FCQEzD<T1}XDQJ0Ut|l@h^s^(WHt$W4V6Kx8=V6E!_Hp<e7PM$eS*sgEJv{|dT) zhqD!tik+u}X6yc~^X&IFM7iKGKEb+7^$Ao&S7177N^0Qt@EFNoYdl0J6H}j)q>(QZ z{aH<W5Z1TxZY|&5gH8WW{ga12Ie53p)2#o||DgAPXVb;?IW7PUr*nqFq;>wVOdpCg zSpe|7_I02(f&1ZQ!E(SG?elby2XLYitOON=q-QAhkLFvMq>3H%(HmEvxqhj5`ML8S zyVhF+?K6ljN><|wfGkeUSG<K#O>wF2N(_AJUwZ4Yiy@vpTh@b+PykWI_fG%JtKHkW zJWbq!RDuJBl>AVAAD8MM**03d^zwyESFS(v!t6D%(0W#Z-bJ8h(o_2mYa~|f;Skb3 zq27}u4EleDQ*cocHwPJCyHaUqY=jApaBNaYavaZ&!TCuK$TgC)C^QZx<}idW<Gk=y zjdi=T;il862P4+c;)&Sw`T!D1LX-E0goR==Z75#1PQOsRarK4S=RV=SP`rBa##Nlo zU%7H=_97}5u3kES9p~#;U!1+b^QGsnym0mW)lX1rc7Ien=Wxir*j86-(_~sDwt4mT zZ`MzNu+m~twl19?*tc{kQ$^_0`$5pOJdfNEq-*qcz!_larb8xnv*%z!k_6)7mzeL} z@0C92zFw;OYp>%Ag7A=9b6;P+$?BTU*5nh{@rDMrdypVK2o5$dw*^VSaghSEid{SA z%K+-``z6DgNukX4XMiwCIl1J8tIz0<eq<LH`6&qe=?DQ|G#3QOn3$8~(j=8s1BcX^ z4s_5H$u|U{Hy>115!HcekwDels@wMlJ#5umB@|uI!e)cXt4Qgg>S81-d0r><FjJG+ zGDuuq0W9Tt&d<eO5%X;H%Jhbk529SWbrHI22A^jkUlSS0<r*SRRY6(;^bxFK6M6AU zHnNG$J~+GMG3g@0flsK2d&%DcstE+rc*?gJTjQ5&o~mP440%FG7(%WOKhEfVTF~Vm zssWPa1(GFQ9_qYTZ01)>02HR+yyOeN2~&^eiz7k^d4l-145>hvf)`1kBQfFdWkJ=~ zebSnKhL{V!9+D=J(f%Vcn5ZQBJJZ9|2(MDQ&BCC38h{ODNi%!!R>V!HIPC{MvVpM| zz}P@T{TqA#kcCK>ULm}l!wqEYB&pL3r{r>$7-qBi4{Klb0H1x7{jxd|RafzdWJvL& zGxa^*{xomrk`zS*1tfu7{X1F<J9`OZGk}pvY?LE~16$f>@JS*v$X1X5OC(4pdSQAX ze-7WXb-q*5X{%X$`xJ5A#f~f-uB!#~;TM0MT(p@+o#S3%`Mi9Oflo)Ihh%5PDY;)5 z?dza*Pn$4M>4<w5kIW)GCtpMA$O+w?c(R+%H-j9oI@0GUes$swFbft#77z{0cp_Px zs{Wutr-dG3=RAuU7BoKeM+awFyUOAUiyJJ8EPNK9WWih;9TRw+wZCHVuPmrK7<TuY zObV*2B0jQfRLYV10q+vw+ff2Co^<lwSx|!!ehLM%ONah2A1AFWN*4#RwxN``ML%Ya vIb%+49JSoU$i&Wx+~n?w2PXDsQ@GlZ-IE>79+<c}2J_RgCtqT0Zo>IrL&BsJ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4de2066c053890b7d6df6a256bd3cfd1e1d19674 GIT binary patch literal 1518 zcmY*ZPjA~c6elTJmSx#V94Bjv9dZ~D_>j0uS0n|3U|Tz^yL15>AZ^w_Q$*U4ElV=V z`~`KHyPY#&AHcb7Uts8Ahkb~hcp9)%FZ%#F411K3Vxz%FzQ_0H_x@O)HyR#-^;>xV z=pPrMzYKG?2wXmeEj|Q75yfxNA!3-4A>sEJnjnn6LDYJII(7sa<yrz-gZ%`y@WBJc z6eXybow&dX56IM_<OUZ+5sHSc*i>j>QwzLqD<Zc0s357Y$g~2wj?t4<g{U2)iB(vj z>&luU6Y%>zSwV#jTJF@7b<nI_yjAv7bo6uKC`VO>L`da`AI4HyQ%f0NRaJ$UHU3sr zr#`KK#8qx7`Bk~ohLK>jhsN@9wM5=5YN}>5mD9&J<h50JMZNG3P`Yd*IXCq9-x%tE z(YbtuQt}ch&*a2!$MUKTmf%r&s;>MS8>0iLqVlHmH=zHrjB)@zs58OeVYxu7)O~|Y zeoxT^PjJyF^R7`0c{eFmC}>?QD+2j73r8+0u*2vYkM|G2%0`2hYHlF{TC%NdidVqP zYf{V=^Ar^eP}SB&GV^|P4EAkf5ATabTea2vkX&Q_yIL^l%?)bY0t^fA))+e1Sp4z+ z?N8O3E}3d#l(yl%tQLSH7=ebj1+f6rPk^aqqQTripLT%4oYbGcGgG3yy;u9szJ9*< z+5R(KIgitan|d)1<w+2a@{CKygD8wnn6^bM+0{o+veSg7YjU+0r*u`GuvN~&WOdEF zuC0zTdYZ5Z8_%%J)Y`CLz%D1Z57jwp7g!<%Ri$VJu=L1}WNZT>{La{Quy#k`kQode zqRGYsZG-R8FNmAJ$L+YA^Y|>3ta}#nZZAtH<Dxs_-Qz(JY>P+f)*1aI3i7kf2eP-_ zAMoVk-lNBlyZhZd&e!8q$S_IPFY@&KVKlhv3MNl;nPrLi-xVUR1A^#eBfq@$c9K}g zC>!Ow9g~Sk%RyK7gWx#J<i<{tMPVX#;c};@>p{T!eTc@m<c>+}18s>*p-Comm8EAf z&r)smnbdBcgtC|Mk*<h5iKVWZ)CJ3R6`n&Wxwef&TM0{bmBu^`M@+jx(2Elm1iEfo z5zI=j>q!>AXDsNUu76cF@(a#0t}9WJ31}vbBgq?pOM4-urg`9(SB=04^PHtrJ2Uj1 zCEf%vpEJZ{erV-!bXXOV8dQgs(WNmp9~$l6&5U*o492<nTxmy07?KfRHcW*w5pi7~ zrrCKKl&NY5x|l;@Fg+wGJ*>?l2O$(EW#^@m#<?bGUe3Ub)Jxa19+<%q-vU9{g`ba? zu|s^~;}-Ub2Ry+Z$YBF#69V^pxLN8FOh_A~4sqf1;q-8mG|4=+LDL8Owt2z6<%68B nLkwO4^1L%+Oe0J~g5W>c%%t)Xpu00`%x($MOoIERiyizgXEu^^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd05e4fcc4a7922c83bd8e5d15bb4e230477d241 GIT binary patch literal 6808 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 O=dM*;w_H8vR{jT{+^c*5 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f032f4999e4683a0714abec92da4a9caf36a81d0 GIT binary patch literal 1185 zcmZ8h%Wl&^6rCA6PU5B&v<0CqkQWsw6|H$yq!L018kPpBK+{N7WIU79sWUb+<Ghrt z;6s`v|G<}c3mblc6?g3PA;y|}=W*w8&pG2atE)DG^3&fs{cRxhOLr~{fyQg7vH^x7 ziX+r6JZ@v?lZXtAwt*2fsQDeWO<JNB_!2GC3V4g+BUG>cfz`;X<IIrZIKa9GMf(cW zw@~G0Fbd6(!hQ0Mh<nPoFe#p)1vx^K?HRf#QL?~ubUi+Y=nJbDJw|-fM5=sliw_t! z#^?lb(t-#$-tgLn_wI07N>z8aQLkinC_^rl&jTiOhFMjyvFfNv!m^c=he1pk^_8Dh zc`OEg6i!)YQKpA8i}BpoJ{56IAz}fUnTfB?eju>|`~6jJBEq4sm^<`^+l?d2gmeeO z{nGDr8gie%7}DoKCmB9{th$X}Uqny3`v(W^M>h$R-TZD*v^!4t=vmO8x{|3hQE?o} zo6Y4#JE;mIxtC0`s=neNi6zsh%5^XZ*We@A2D=8Ig~ck2UQu8|rwTQvpaqQ^6x`C_ zX}A|C*`j!kXPDwHnUnF}j2xoV2XkX$Yhq@`0$2w4Er8!E;2-UrpszbEsK=lZO~UlV zcAzx5Oa*h)nXkYwrxy+xcQklTD4hai`X~?e-g`}FbOzHrcGx&!fnwCj@eg^=8O7pU z=7CFQy?R-IfKkq=(5ZpmCNjIzW2zfQ4BCnfF4v2)4p?8(c$l+WkZB72Alg<}b|5&j z1E13n^uT0hz(7uMVQPAdwdLNO;_{m?R$y<{ut{pTLhPJ@H7qt@F3^h8Mf)rHZ$l?X z6V31vO$=z>FVNJls0FVNa3oV#rGh(4_OIaxxr!a%>83nTVa)x=5iv-EGp|mBKIbae zX0G5OSCUy$34l{*x%{7+t;9rQ0K$I=(^7APh?Wy1a~IlxcnO?X1Jk~Jt<ybtPfYNF n39Yz1^?b>VGxS>#Ifj*&gP5ifd!_#gQo~;X+-hc}R@wLmO*bRr literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9193eec29a124a91577d9407b28b1cae12d4a219 GIT binary patch literal 344 zcmYjNOHRWu5Vez_ra?hjB5u${arqQl2_b~UmJLWiBxI$r8zpgV%XZS1Q*Z=WatBW0 zEi10T3I`RzjArJI^q%HvF5@@?F5a`f$7eS`y5%=Q2QFOc6W0hJkbxAe6AE4+@m^u& zrT!h@y8)m<9jOrnT@pX_9{~669sdRlf={Of*EZ7BG|~vcwCy##=3>bQTQ-(;ffd!F zQ90E%DX77u)JB!F#*~8FUQ3nkz&6Gkh_UTot#T?m!W&S1ci^XeaU@mQW`?3RQ)n(2 zabmPkXjWl7(PMtvlH(l9_Hbn8lcG}WU_PEs(Jhjt9F|<0jIrTL^5s!pJ)u9#|KY~P ZzFgbzY#~U)=s9#2boZ{%^I!sZ;5Ts6Wx4<W literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7275fb56d0f3f68934ee788a7df1c1978cfe0729 GIT binary patch literal 6997 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%0AImq4HR?Q}m>y zm>OFo^MARJsFNx%b+}~I#<PK42`LU|)vU{p@?d*tyj8n0bl$FAiQ?@m!?S<Noco2J z1L~x(+Z|J#FrVBjxv~d%l=w$rdI<JskOSC5whCNfcj|l-oG^$9i0BcvpHLx$NA(>F z=YLIflyU%04ln%KqZZR9`=Px|gyC&8671*8ix2>4762EF+EZ7sLkI_q8G4{m2pmb8 zGxiVqmPt1J1!^Q-@6fJJ;3$V<eu1M%SlAdw@t<QfZ=%3i=g0QANL3ueQv7`k`A4Em z=QWwmhFAaWd9M+8Cy;dvRza@p6sZP;lt!oCrwCJ}MN&u??FE7fcvUCyBfG{ac;aNQ z@=Neh`_7vZ{(H0)u(R#qoBxjuN%!8$!&|p+J-jt^?|)KQa$T(^D{2SnIAH_ESQK@n z{1Fx#md6{eiCs}$;>2=kK#Do}eP#R+l5A2Wi~I<V(x9kQg*>@3-lAb2(yZAg?{z{# zp5!TI`94DNdxekS^E51>qD93fO+d^If~mCg_#Dt<62cO@8iJE~mUE<2;ClzjfUvjL zs(QK3Di@+um`=j$D1yok#k*4toXy*XDg|!Qe2e#KbiSYhA?iM=i1vw;B09Y)a#P%= z;#VlP@T4R^KsA=DS9Bjyh|WA62nRUF22`B4T?5gz?dfH-%4}YZ&{^5g;hi9Cul|X< zouDAHIW8XMoBjtCg3izy?GR=aA&hDrLZjgPb=5+;2ncdC9v8unA(>+UJppHu*V+9X zb&Ez(B8dFk$Od>|oTHzTNeZK8CYfzSD68m2N@?0#)DbG@zGG_@IJGd{pk5P{R$?tf z1y{%fJar>mX*VT@D)6H-NL0alf%flcCMd(BVg3IiDpZ4iaiGoa@RCXrk>mFZJV9w8 zB!Ci*Xbh28L-=Dkt09hV@T89{<OIYZD(LSuUN9x(Gn6TL9Tk|RMKVitICv^B@daZ7 z;74|BD&&PSbIO|_T=*OMNGY6LC`cCm15X~2v5Dfo1d66!ViJ}CjhYJJI2&+ha1aQQ z2gqI}Yp5V!iwY84C$_^EXzdh*bO_cHAiYB^<apXica!hZ_eIqMoQvpNrE{t_S1Lo> z4^AnVr660uzF?lB8p2p%(F5ZJG`GipK;-DW<FotJLBY|#;z`e=(2NQ)NR)>loIh`P zYzZ=7W{ad1_^UuOfXH4e<o+erOaz}ao`Bg$c+%gZD8%k%QU7NIPJluP3Mi<ufFf+d z6qLcqal~#bBhgz^`BdbH$mJ-Zhk*Y^|21J~B>|b0W9VEYfteY<S=4RhKyP9lJ2DUS zZ|BuY$f%O2PS@GGS!9hYWQ|lFkn+kC#7l;iFXJS`nQ>-@@^NejQ2RwO%kT9uhH?s> zILWKDRJvU*QM&2D{aYWcgeX3_b!R2KyL$H_;IuM+bg{w0%Zu}nXc(Pd6gVg-s~Wge zp*&J9!&5<ifU*CHCtX6J>9&g3aFe*d*KoV9(GC7Zaf9EF?pLc7>5lW>(hCt7M1wYR z;IbTsTZ4L=b{K}d2Kp-Lz$ufZVr{O14a#gNOfSm_#YEBo>e=W;%J3?Q<Fv_R8=vm} z$N2Eqcv2F4S9j@Wxwh+}^vds-U*|NU`nq(&FzPk1rwZu+rSQ`ll`1d50}SF<s8E+f zs8i}Z=ATlRa&~)EBf}iLF?Cq#e*nB&%i|m*wiU@##nizoFONeQu5heM$^<_=HlXly zl-E$&m^(pJ?Db<g3y#90;$IkPiUT-=MpPjCXyx+{KYOsk-=w|$6%~h6yg>yW`};U1 k-D~;vTxS@OUPNKSVY$;kWOyjKSo|3#{@~~w({Pvm51v~fkpKVy literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e56718c279384bef9152d3eee13f43ab9c9605d GIT binary patch literal 1027 zcmZWo-A>yu6t<HzgaZ3P+cfQB%H?`NGhl2mAv9QvKtg4rohn6|LWo^RapKH&TZ+of z;BGGgmwSgj!5$&EyW$mgwc}LX&~_xB^VvH7eEj)%Yi_QLz`lpiKK(Ed`l%-qGXcDV zAzy$ah+u~Nal}3*1~IRYZ%~6+q;!QYv2POGL>2oMvQZ<#I)Ld2%;-G~`4pT&*Z2n5 zPEGM>%+f?71Us!pKGlv>!Ur;fyu$QO%@Dwl7C53aapN1R7`YXSW0~8h1097fw{XAu zUMAvxsHoQuh1cPXP$9iUct_nJSd}a3n?89J1zCUTrRuC6cLiJQtgNkhEia3+g*cTe zWNhIqO9#tQ_uP|I^)kgdlXu}@TxlSCS;mE`X2aZBXJK+g!i_0iEev%2e3HgfHmt5Q z9)(P902n92C7g_fs>4N++j1xsO)5CII=wXddm&*1RX%%{s-#cQ%Lvb62a6d%e<asB zX*CMT_W&r6`x0ZMaM$RXUF!k^Ds}C`Pj!qD4x9o{11b~a0#-(7WLz2-=E#&g3SZCM zpf8x1`kBtZmR+zWRjxXr?nz7tP2Er_5g+vwbvaDjPRsxam&Afbii=^jT<qEwJaJEy z%HDb&=p3E$J{29t2i1rt-sc{bD(0#57S~=cEiEoDd*f|~S*T79-J~a#dqiDD&s4SG zJHH>PVMb*Y)G5HNZka}9HZKQ3oam<sg4`Y_<+j$4vD`VOBBgA3$)AU7Y(uS^lk#QT zcP3oEz4xKrY#sQeT6_PXmOIdB#UZ}6wZFfYPYEa&PWPR5oYsZlqGIKiF4cedA8-D6 zdv~uMY_?hlyIUVy^<ZbWR;xF1Q&9EqTTg?iG|(FAhm{Y&p=k$~@jNaYmQltQ7EfTU lVhIO=xTl>?EmrTa6`!JLA7?$`q{rxn{!T^fIM^{A`!_qu48i~a literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py new file mode 100644 index 0000000..086b64d --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_deprecation_warning.py @@ -0,0 +1,7 @@ +class SetuptoolsDeprecationWarning(Warning): + """ + Base class for warning deprecations in ``setuptools`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..953a3d1180cd053775ad67da5463ea20edb79ce4 GIT binary patch literal 206 zcmZ?b<>g`kf<1{+u^{>}h=2h`Aj1KOi&=m~3PUi1CZpd<h9ZzKg7{UgUr>};mRORi zUzS*;pO&AKl3G-(pIfA#locOuQEZxLUY25#9A8joWKfc3k)BnQW0+=YX{jHgUyxa# zo0(T!l9-dDTTzf#Zk(J|rC*#{Qd&@wpPy5V%#1Hf%}dEI(vOeN%*!l^kJl@xyv1RY Ro1apelWGTYP%#iQ001H#IQRen literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31c33d91ccd46517cce618ead4d381970a0bb563 GIT binary patch literal 203049 zcmeFad3+sbc`tr;9UaN?8gDqsSY9M0lDx(-j$&fVc4BapU^^rz2`5K-NAi)5&XH$E zwj>|1L=JH%q3LpgQrgP2P-tmsfiBRE7D_itY0EmLEl}=lbGzJM_ukwt_xpX`S&t;! zf%M+{$4~m4nR(xN=Ut!od7t;$-lHp46cYIR#nR@-FTN$6_%jClzcL=~!O#A3OCq5X zg9()!OsdpiN~H(WDx<QM%wPuhTqQe^8*EA@BrZRgmwWSIv)l`V1-Z8jw#dD8uvP9W z23N?vZLm%5D+gD~ebwM9+?y(^Csq%xP9|m;%2(D*tQ}mNOgx;Z8kvN-ZoFW<Kbhda zyuC@keQlzedL%Kk1#!)l^%ENgH^}<}o;MC|l&`zJum3Liy1B9<l5&Mk>E*<-Tkw9< z;AZ*ysQ&u7q;*1nFSTo_yevquIY@DjS3-7hv(8OlRjXQ|+SE$5O08CF)LOMp-K5s5 z4Qiv>q&BOUsV(Yeb&I-H8EUI)SKHKfwL|Sx9ja4xsoT`;s$2D_UbRc@R(sT5wNLF= zcc=sEPIXYdTpdz(sXleLI;>uy?omh7QPr=GspIN|x>wz&PO4X`SE*C#el?&TP!FnC ztJCU?I;$R1uTc-HN7QT8pn6n2rXE+XQ$_WJDybngtdug<h#FPrR9TIwaaB<hs;X*g zQk_?pvXwJh9^7KyY&MVGGM`jgHT6_#Q)2K|^H!DFlu%RSsX@auo=aJiNU?RW-P|^~ z-P|#_6Za0Y)9f;DGjBJ$@qLfkYwj|4n|nrE2KQEnka{0d?;pHFT~HS<Ck8u46N7s( z9@)x)!2{Dr)%3!hR};q)j~^I3IJ3^&yYO=Jka@s7IG?(jl(FJS+%;Z6$-k{f;<?nt zcj_^CE_ME$4=2n%HKS%PC(Jw4rTOHs#C&o-Ie53Kt2vZ*_}+wiy?VptgnEPdiuv^5 zJ!WR?2!2O5BnJD{8wZb>$JCqfeBA6ekKum8+@YSt_xGy#h5OWH$u~20lDS?@4!#n( zJ*BoGw{7ODklQJQ->h~Zyu&<&@cjrstvV3yknjM)S5z0mUFHDZKY;KvsvF^M`TjwK z-=e+);qQ>zy&B=Ss!oJEC4Ac4xNyci&7M%ts#l;rXVu%(gSbDWzEj<g`)ky5>br1% zSbewp9^4;M->d!$?ypsER}bSp_*@b&_D=PEmy?5!BKLQx+mQQhlKW!_f4|y`@LuyV z)b4SF->udnyw-di;nyMj1L|gkZ<cTo;U82lL-=J9e!_fWuw*`AK2{vUn;%je@n)mE z8Af<PwISSQK7pJR!dKM_gjblu2%8AMM_CA4l70l?A69oDe20Wb5&jX?gK&?8&msI? zbvwehOSp{i`_xK=S4wyc;U87|5#BH1afIKmK7jBCBwRuG$JBa+*P9iTKY{R%tIY^+ zmT(o}52{TFZ<25g;h#{u5#BA~NrZn=?Lv5$gwG@VA$2FhcS_ho_@~qXgbzsAM);@I zPK0+#&pHTyShXVDYC0%?3gM5ac7)p{d;#H)sx1g_k?=)?e@3lAc#VXo5&l`V9pUYg z-weV(r`937&YVGhvk3pZx&`4|Bzy_skExF%{Ba4_5&i{rE5f&$b)=s|_!redgbzyi z^$7ox`elTFSs>#L<{Rb{gKtFauc)nv-72}f3E@wuUW9uk{3OD^s%}E~CJE0Y{A=oy z2!GO?M=6&P{*>B>@IHC}6vDr*Rw2B~d<yU1jPR$`281_A_-TZHL#;-5wS=!A{F`bI z!h0nA48p&q41^7-<y+Kmt8;+y?*NSNR==xG0LI^n=RNAP>L{L{Rllb`hxcz&zpoy` z{X5kksI#~~r~XiV9{2A;+P&(F>a|Gw-Reu~Uc`M5;`XU8s|mz?ulkCrBJRH^S54yn zcJp=fiG_EllfVS;G^_Ib0G_|ktjY5Lp5J9o%JV3mzu!DB&m(w#w>fIwtNuv6Lw)tx z^uiCQKURNoIf3{eG|#C&olhd>YhKI`A?E86^9?U%!Tdq<hmI!91^mX;pQ%g8BXu+} zc-4H`ylOt9zB!-VkT9=q0FD}bkNJf9uk%UsP3pfPj~`ZlewFW@Hs{Rum{*SqZba-~ zFjhSeeD@>jzbg}Md$0OSbq4qMslQS~xc{j7YxM-~?^l1LY}`L!en9;X)(2($7@q$> z@A=2o->SdE`wyzWSFgtXC)7Wv)42bn`bRa6`-d=63G+k6pF+RxSO28WqhEj8ya&+r zVR`f6;zzvuN70ghM$Mm5|1zH(NvZ#-YDoJt=FbfNtodg2$qQJO{ukSb5%^d1+|Nnu zzajSDz1aUi?9WHj;w$exTfXoP)Pa5eF{CNs8S8}kv4#BAg#I2eSaSwHuKrp5i^}RZ zBN@b|)oW0bU%=BH_+?ZDp<guLi{~tQ<Co+qho@gQe*&Z2Z=S%LCghot67yG4&SR;; zUm5&_`K#uy;axLVJlqTODSY)w^BkUA@M~ST&-~=Vr>>%o8~A=jP_H)B>(>#pQkBrB zpJp2oS~Z`<b#;(x4O0DvyjknDb{%4VQ(|sH%x_%<^x}*4i2ZGe-QcC$h?w7L%+>sz zpw~9x{b$V24F0Zswb}dXWr+POzM4a;U#WfvId6G3WxmNA#na8`+b7iT%qLf(cR4?J zC!BJ1Uidw)CbuAm&zWz<H!=?9=Z+@SJifm5S@aCX`5wIg{d?ILhH^0Po%z(@ADDlL z@YeCvb1l~AO@-%n^rC*+hNmwCW3U~ir3Sx<{J)4)JJc6&-O1T!{uuK85@y9)%`ZuP z*ee}~`!epG=9e+IzOu|$u6*SNUv=TDKQcd$?`}hjzruWEHhuxE{v(9C7#jSl`PGF# zM(B2~<mMlY{fUISz0jY=LSK_mkF5EmlD<Cpb$s!4)cOPF*T=p=Iz;mLx}@usblEeB z&I8FrqV(0~M4~V`Gg-3ia&^?0sHv%nY4jNVm6C0nwo$4oW5RUK)s$^GHA9&r<*F&M z=CnCH<(P*5>8Mqjm_Rm#yI;z`LgDN=l+jqhGHYg(DvoJYOHTO$sx&!i)k?$XSj%C{ zL?oKS+Ut5UWS1u<(Kx@N-GvKwui+qj$116^Q?6A@6{BKK@0uwM4+j}`8#PN(P1&YV z8!;?%bgELaknf~r+BUvIF2=)U=UiCLZeyl4RZz8RhhtPtQ?XJNvt*&l2wybpnW|Ho zHb#)M^eAiRSBu3>l$_ynjEoe5L1A6}?$#q!K%*~|6$i?wl!vU6HN!d%d!y%^D><x+ z!Md|!P+7;C8g?WruS7$YEpynZ%oydW@!$-`y4qVP+-F**!EQEC1XJ>R7H%5t_nDPS zt=o9GW>wVIcB2zDE>&mH0@IXkM-5n2G;hKv^j~W4vrCmJ2SZY;9_}{!N(xjQpvyeG zwSBIu+ZdWER~%z%618NTPhCRBYOWg(r^*=MQU%W($y1k(RMnheR?G>r>exo1^VFq| z+dKLmWUZ{@I=Z)5ME=F%;W?u=iH{vrZWI7w2cL)I)@`6SP$XK3#+Ig>S`T{Yf@wK2 zWQDK-(ShhXbf{1;@Hb-BCc-f{09`f9VXr9Ew=#LIWb1U>{AuHNIQpj)^p<2LU1!`a zA9w0+yNuh7_U?9EnPW6^YrD?(9ESlPHH?R3IEi*SMyDj{Hrjg*w|DCjdu0sINW1mx zt}btqdE;E0awezHy?O{y#6@(G-{#oR8$E}OM>`~{quc1{=0$*l4_iAP*ZFFY!o1;p z!N3U|5K38q-z9*w^HUgYBrB=XP{qWwW4VMnrnAk;NDpR1rG)ujvt|kc;zqSJVcHrx zn97@?018x~-XT!a@w$!x5^MnWS)@C4Nnqx*X-`!g8;~+Ih8cjeohhq|v6qqc5(R)2 z>9_`vi@X8Y4FfX`0i1@13FOKsaS~Ncn?O}5+YYLWDK{+m#+niIQmPibDqJKUVXN?+ zgFzYsiuG%~2n(LWtf&C8?b?K(CUya4D|&B&!-u&~xOQeH%fqD#=Jy42nq7MFoLMz4 zTEKYhUvt{g^V+fx6@X+Awn~D8%D`@t9OGh7mWEBElO>dfYQVQXR=8NMQ~>RE&Cs>+ zp;6#qE1*t8r(tvhNfKcg24hWUxVMYNou8_)W4wtd6_^+@$$J2{nvjWJC=~8B9jWaZ zrzDfJr_j^*S9nd?E^EZ*qrZj`ob#|qeCz>WKt%#%LnUB0|6}RDiJI*gHMH6aC%Ohb zbbGmqcoa!!=`|iAibeOR+OUsRh~LfW5?39Y0DrD_5%4U%9Ae^%#&H_wNAZjgg+3DW zYTu7aB0oEb_A1P-3v(SlSF%dOz@ElMV2_?rs|NfUT}?EuWraO_s~gT-*d4m6dL`wg zoCIc<b#`$cr!EbeR_y`n{+ea_UHm}R^dlnG<Mh-h8;Ja{V0g^ZzWce_ohVzj<HfzM zqwfKW&l>A@?Cj_}j-@?<(uEiSd<>Bq@z(Wd&4B!BAZ7slNQCa6HforGY#hj%+Hko9 zOe46%kO_w+5(CU-M4_#M6oSP_pd~;8w&{3SV*rzMjyZxN0{n6c0^3fGOjRQNY}n_p zCiH+%vN89^*?eVI$`crKbqct^?=RHufsrsbsX2O!nQ<1>s*yYicmipsE(I8&s8h}9 zM#)^2elN^s_xA4X-7|aBo`c32bJEzm8xOm8AKL$N<Ds+tv$s81LJ{{5-#Y~w!04NF zCWc4vLBW>YYokwwO@Q#I*;_T8!_R{uoEYdzx@pTC!7Z=QiB5UK#B=uasoL;3BTsU{ z1_Hu!+x=Mc@pwN-GvE=#v^-!bkQM3}u%DX-47e+OXnvJBLqH89Jn(i4{eWb9pyr&c zx=sCh#NCYKkRedG+2a$F&Wu|)QR7l&s-rV*(}|jOv4q?T_twtV`fHV`iK?5umvg{v z@=Izu1=u-`IyCb^5Q~dAAvoMZ2$OEpKutn!4z)N^opGB3=yvlDR4X$NREJGGO==3# zO+8?_YXoYJVyYgW9yaBTyH?^nGUa#`=n|i`>Bu0_N-ylwmflw<N=~T~X4NXGJV12U zN$8Bwlwq0`66*u5+xlujw0hxpH=PFY4wC<Zd9Nnh!|$@Eu^*atb7#iOlV@vgv;Kk| z)uJDDSLM%4f#L=pa<gY^<7U-ulUu(>KUr?};dAIrHv^=v+$LV7v-zNND1>OkZ5EoR zIyGUtIZgh!1${p_RCe4JkeB_Hnr)sfjp9Xh=7CAG%I6isXPlXe3Ao@&;iiXc6?YBi zLJ7bQ4CqZWca@$W_np1})bT1X*^JvdT$`%m^%2V|&A2OvCnsY$tyDvmSdTH{49Mzp zepxGG6WPsiNq=C(ZBw<2)nN?0bO(CJ6!2_1XHHA=TFyBW6+e$vW2FnFSh<-BfYEK@ zRl180y1R0Gtk&GtiPE^qhM@hn+rrQzUZ73(4Ft&}4xrv$E#U_(^Fp~cWgiFO>#mDM z1>mm96G^eMI#sD0Gl!-|j|h$8W~AO(K~Zi~ZSn{)sJq6eu95w)sZ0Vhb|XN%ob$Gu zpPZ@=%iyh<ls!ePnXP)+_n@)WGABS&NPpYzYOFRDP#clKYVo4D%W?~VI`s4@cGOCH zG(Jo@+bUH@O}E(=3Rl2ZKk8mw1>$Ddl&Rr0Z^cx#JX}-gWo`xB)~U(J=&j)LaKtCX z+!a9efHNSO3h<q~vSyV>%h)xZ1<?eY<2FrIWu;}pk@7U~g%G=L3z8ESrGuN9XFqpn zKyCzTja~8%rxB2)yQ&ebKc5Eb9maND{us#P*N>n51TIdZo^X=$DXXoXIFp#kJE?kN zK6xgQNjPc9%LcU+#7Q!CA>(8ha#tbIyPBFyI!!7ypPWn8Qww=;tuo{=CKCuX*TFS7 zlXxVdz$xg;m2N`e$E@0950)NpEI8q02aE3Q1ohgbDNghvh#joHAb}s!JqtpnY=Tmq z=`~K`6E5`FawD1SRJfDEpPviTaAyG8b);0T*m`{~`B@#Wa;T15R?X_>8dx<*@=1~2 zFiKTeP&9K%+2_&sdS~M$_euY{0SHFcSX>=lrqFWc2-ZhOzauSNH+p+}jl;b`=I-k0 zi3*7=EQ(&o%;t7(draMaS1@24xEy|G@Uyq$qLK~<te#L1n6cX_I3t4y&j~(nK+>-4 zz-;QVDT^OJpW@{|@Yj`c)4(Kd8uJVbYSQ^Y!kWg*7p8Y%?p*+k?YdC1c8%03SZM8C z6V|Swv10L{eMj}q3u^yxaq`06-Ok9t(J`yCXXK8TzkJu(U6W;ws*Uxf(lb3-y|{09 zY<3sOoT*8tR;$?2$KnMHW6jzXz-RB|jGOPPlqQB$>F|%E9yWf7*$u@h3}<g2p}t}t z#)D2V&{c2?pwd|y@dc)fOg%S^<n9^|Tq0xa=Jco_!Hn&$88scSOE@ADjRCQ`P@da{ z>PDyZN=)*q4bo-ej7;jTw3`Nml5%kd3y}e1*Gd0bGt4I|^?nx~?KQY0vV~+Ol}hJR zZK-w1e6lTRy&18y2kfZ{uyd*)`eZW#{EE&7>B!xkfsO-{2{i)sI)j~2#hAdPnJ7&M z@W9dJZx}x*sGfMdFqf<+UjwoB`IO@5CkLcn81Gc?ZZ|ojYbo_*RbOcC8#Sw>cn|*^ zb76Lwg!K$=&l6&Tva$&9C&=P39#nD;Y-^PUb2PJ%pdgh9V7eXfn5?JfQxL4Kdn`4V zp3Bq|3#od#o&lmroNs>^NQO{3yX&|;T$(hEo#5nj8{p?)H;3&uH*_RSOWszF`yEh- zrQX@>&cl7}9YKv))iizt6?-!-X#E=0DN(100Y9%7QYbC`LUQK|$-Df%u%1S8H)%I? zhBW(^nVs&2*;|Sj<Dx0`j6k8^W3y|qB{N1H12dcJ5LkUR8!(c!Co3Q}(z9idiQZ)H z%DNdg!)@g*uV~Lq3}I5Z1*aA~XXTBXMpQ$^+?Gg1KE?`)&P67ZT$5avT$QxmjyOU= z@W-*c2S2+N7c&8^iv+YTfQbPJg(8S6&K$=cKyCBIB6l#wB3=|VHxSRQ#p3y?QboUs zR40HO>mA7XlPrRrl}}38E$rU2ci;Xy4%~V0<%6w9j`klrexfuqjLG)=V@TzO@Z^sk zYi)1A1*5l)u<InolH*NQssV~o?;IvKSJuKs5`@A?=t_A*IUK1X;aZ0BcbK;x%2?;5 z5q}TgJ%~%#IZ#PiOZ5N<Su$o;<y4ahopLI#nj!pXQU%q5d!7myxHm)b0!kQ2U7#Wc zVp>!h9ek5@E3%!vQ<wmzPmt?fv8;2P%AhHQCt`ti#MTG9GLO2q1yK(SbFT4^ch<Kb zKb!Nejzzhcr~|`~=dCT6Yl$KRO1P$~t(av9NnEOqc~?wxF4of{jL!%@NDWv&fLs8M zX<$`1Jz<Z!nMtC}6|7Uh{&X`XYt$yxf=e)B{V=|<uJZC8T-*$Krwv_BKq^<uPO<p= zNMf(TC6UYl-QkzY;hIa%zD%%dY&!!!tNv=3BgH@715~pffjXx27=LKm7yx4|J)c2G zCue^mSU$0gk%M2sVn0l_o+oP{{UE#g^2kic%?AZaW|pwJq(Z@_#RxJK&RwahSvJ`1 zU#OKKxj0w4z}4HYGV&e;8*xh51J#iVD0lGau*-&wU}`8}SZKn;=*l#7qxB<b8~{5# z3`~#$leu9TSy>c}5WvP)kzC+8k(+H_swd;gV;vg6&;UCW5Hp^#)|22vrzXaLug@?x zHJ-D&9Y9MgHjT7L9l%o<>tySoGoFM{5(AN){bw7SIK7C4+(u()M%V~s9)edD`Rl<7 z$2|y`9-39ENhwAe*dz>r+vKrzgSHEQu^|&|(i(C=47TVmCJ!ldiE4lY=9B=K7)law z%hba<B_n9vg`1nxrCTQv80gB$J3VJ)_ArgSbK8QAfDoWSV(;VkS+Jxh76Cy^u?TX7 zy;>}O6Upp0ToO4_5#BE~d&^S55PlXcnOqfunY9rCA`Z+fZ(wmxk7U+!c}@+?w(qcw zPLR(eN{t-~@|8|@)}bAcN}#2<cLAb_4s;{g71jrF=}Jm_8lkzVSOl6W7XKbe><li6 zWGXqkdC96v!dSJ56a)uy$3nQ}#st(23L`DGOqoDQSbtIIKOv2tI?Ev;o$iJ7;jMka z#9=L)@RNf3@W9@}E(iUkk{c6qK(E$*l>&JKLa3f5$*mEtlIM~1RlO%lUuB<WW}iAv zo;Z<29Hs;a1>-QjT!q-gqkc5&65`PD*d~X`WGe_s*y5=otjLmKPnuv*Rv;uKtr2cD zthb;gvI-1f012%!Y;I<(Rt9^EtL!9R2uy-WV2zvB8NKr6Sy7H6Hllp;0KNfjt>8B& z*$5{37vwKgNFtL<f({1Uu1U@sOALGLv)JHs9ApgE;Xx%yZaPW5JEfFc!|O_x2AqOQ z33};DTW>>hHx03*n<2hm21o#yNK!1OFg<)2SsE-Q8S>>k8X)L>7!O^o);n>tzK<8u z{4O)B4FmMv&rpl316uZNac^UNh?k$@<)?Z1d0u{jm#`z{NeCGd6Tgd}EU5WpCS7Q0 z&F5F<v70CqhVdf!W3BGNPg2In8X<wLt$0@&z(f)>8m@WHISZ^NEzOxE4G`lIYvHqS zdo&GmmwbMM2>;u|^b|yV%P3wK-LOCqMv&=^;C8Q<MCt;mrN4YR)=U^+BpH#NWNmfz zVzV{?6yDiRa%9xB+Ph*>(smHU?GRRZe|k;PGa(!eNckokmP_G=bpn2aPnm;`ZP#<~ zka20Qy_Y-Hl7p1Jh=n-TFNt>v$TxP_8t{=Iuf&eit8j?$cL(@>k4E=<!tDGa_eh>Z zBJl}e{URW3Nnj=jW&x*y|MP1y$rlB{+wk>ll~RQsfmt#LqbqX+j>}-eRBddd$z0Mv z%~40l?-U4%N5HvNcLCGZCPB7EsPZznz>2b+%FK&t9qR`*Z?AQ!7umWUY~7!Zf#U)6 zB@!ONk#UYaWLc2pV)>9M>r=fD$%-r%;$LsbPhAqy;tZPB2l+^EF$hBV)!ES#in6;f z_Fy@qv0Rm~-m|wz_Mn4EJtK#JDvtCE*mA=q%HbfSo~jO&hR3<GjmwaDS}7*EYap3z zqy>{hdi%w6Cp+ZUpgYqI-ARJr9{g+rmpHZ~Q$p+tvbbX-hxMV!>O`{H!3Z6vyAU*L zgLJp|La9=wOlr<3$8`(9>4(@E{77hMfQM;X=yx!!wfrL>8dx#@`tg%}y6ndi9ybQe zw$%cUp8V!4*~mTxxGMUFV!g;DlEr`v%6@hU3rHkq+m{u;gxe}4mp|TP_0q(jPww5k zY*vSi9X8fFGDenOL1itwGg7Us%jSh@p;g5q>Eor41{<iC#--Lmj^SRGlfwhn!el-j zLm+J4J^0z(xP&mFQh<ZB=1T)E01*NgO)8IjPBjBQ3hsuYOgB#!MghSCBO^fQ!)fHj zKi-4>BN0wgZ$x(E;n=3ZwF7}5v{Pzw4|a8Xmm0&nBAsO{Q*bzfER}z}2Q?rEh~#KJ zxrqdjP{O~8I3Jdh<%WX6MB<hJtdogi@$N_kwk=<QAbpG+V^8$sCtDG{hg7JAP~_k* zAZzYwGo+|3snU`g0wI205vj*DIzkiYOHVP<gzN}bp$`3BusZZ)^Q)57mC(B^>r+VH z*fY%-XFb|SBK6t2T)zaV2Y^=^pjZI-*I9<pcE1rXO@LZv@+a`(5DUxWArB4-|1HK2 z;}`sKw{{PH_PdcbglItXqduz&OjztbRNBmrXr@&XFzvCd5C?5vu&t62wiRrL0QUvj z58>WI8zS6W%~se`!IlWmZL}xCeI;#*a9>5cBHUNgwg~q%=349B=BmMU=IX(l%r%4S ztJ@LUfY3&SHqrVBsn*c~3HO_5g@pThS|Z`Tnbt_SzYLZ_ut`GQw$LsKF*nmT3HMuQ zpM?9Zv{Ay{pq&!#TWPC=dpqrwaNkCoCET~uZVC4tv|Yk|CoGU)zl5ASXv2h<PTDcy z-lbs6g!^r<P=Y-ZQru3PCd72pt_k-ZST4b~32%C7--MW5v~j|HH|?Bo-$Pp`-1pMn z3HN=9^z{?gc8pW$Bt}dYVQiV89|_iw^5_pp8>u7)aTD|(wYH@(ftWJc{1YYw4cy6T zZ7-(b9#7T-bR!tY0ntg-6N6fsAQU?LFF}6L>1EwD7tm-uWWGoeN*bq`&`b2_?#H{a zYDrxl-SapI3QvVfQx5WBz{81r*W2fPL<$!~gjVlqTstu}PV2mx4E2$|IIeY<Lb@}c zH$6>7A)kHPh0T>+rg68?=@F(Rts@zCw$DHdww<bt9lJUL`otrC!rSeBL5sczlg>H! z?PQ=zGwl%)dz)cG?+~PeC(WD)#>;@(X4oLFJq-;A>e<;IuUO=T6sY@?4cw-I17JpC z&1a*P^mfAQDo-dGbgUjhbgN&X`1WMa%OS|yvv=3NJ=moLAAxxf=9}$w0(3{JcM}zN zg^goXyqyU6MbP8iVYeGQ44t^sM2B?RUHA*KldReanjYA8MYcrxrLHCbb-6bk(n%f5 zz3<gs#j5d7XX<?efbgJyQRW?xuTe{~;~Hsn)q2&`#AIg|1XdtsbkiDlRx<hg7Ha)g zb}#iwck!}kZ}7Np4>VkLRSmChXgj~@kWU)l`K{L}_I5P9XY1t^@(o@sYCTh&wWiES zibbtwniCMbhKXX$=j%sx6|dK-9zfj8A!DE3F|w^a(5k}>JY?+I8&sjk;H*XzI!Yo3 z&IWQ2QhWj3(T)J<4lpl8Spl3tCkZATln&;yplY*_dr;jVHE<St(@RL~=CoQYSu@a^ zhkWa%*y2ux4W$sEN<YBlP0*nrh(c!tXbh@E(2_(b3-MT~;^r{hkY588Vf_}q9OsfQ z!a3n}6)5!3YE`E-S_D-m6&PlN_{Tdx5Q1t5pOcocE{I46bPNSLa!r-_3@#%@IU?Kv z3togk2SyVRoFU}o&>aslR*V0UvZ;EDyvgIuh?67JUSjk0<fuG3&GXE+01jqiycu@M zudAoznz6rEp-aco^;BO1d8C{c<ncbI6~bNNYT_$h>IwzY&uMdVBWa}goRps)O^l?+ zbI&F1*Gc(pc=I)uiJGR7f2YK*oM%}%XH`A9uo}7~5JN!LgYv5DomI|C3M5EYhVc}B z)e%=rRu9bJE56rXz^;2c^i<Y3Yn^o{xqy5h)A}j|6XxkzPYWk@;Dk`AS`>DZ_1oxw zcWnbi$jCQ>2^M4^cz07nTCCbr6I}7^MS$gj&bo##G$cVw3t+Xr;hhhBZJ^hy+VtQo z*q0C>Q{Qok)Qq<-pb^3gw?5A16excLdcx`;l!?%mZf3YfRSW1Y3PZqcX2$xlaFUdQ zJYyPg2V+ryYJG+mav-hG^1|uV2>B#>9YX$5JW%Kt{pUWd03mfD*_tAuyGp_Z5e#le zEYr3o*QM6ueG2K;CueVpZpD_~2L&u)%5aGb$PgX@09hLaXk}N#p&!dYn!F!(Ob}?v z@CTp)#>nXnq5p>Z3*5oTUM@ReImlOlB-r|J>&0S4{f4`aQNZ5gtrS|T#HPe|rOt~~ zQbQIg{XjZ>p`pWGDD-jQp-VV<_&w}5W}QpSb~m&;*nUNn4}uS|_mHvRxPxmC;iGAN z5zp2i@bVR2NRfK`!KL;+7WXONA7ZSwWFb{Zu1U>qT&^C&Y(M|FFA0X=tq1@wr5vK; z-RMvv<D`?GPh5p$WE32F#?_O3n1>vIxlHvK(kC70kjan@a9)oAJ23^`?u_Sw;l+3J z4LL!v1WF}N6Uw~e<S7uUXNt|fkQ=SSu3ms%`oc}4Gp#QmR!@|#^GUjko#bXOj#Kf9 zlIyOl-o7Wttv_WVSwGT{=Qa!?_tT(C^?v$C*o%aT1R#0~e(1|&F4ZouzNkNg&w?E- zR{-t=Wfk}|9%3N<aS_R81n&Z%>&d&l_h|clfWG8-!a78D#GP0PAQvG-rf7qRP?lJK zp{WiF)3>3IAhSx-@-&&4ejR$bd7&Ua5Kcf<Co`9w?yIMvxU+vQH{I*B)L~_cP&?i= z;g_Fl2KLX_oAI9;&um2gz~W7PiSuuHIB~v?UlmvwBQXZ8zq|EBN^5q2h@84sgaB)? z|Dl3lR`nooVBD-$xoi@KBv2`IXG9@N4`7x(ZM)4THVZ_GrVK8|SWwlcB!da)@It*? ztAQ#(U2aPa$Qf#NP!zM><e2qMNeRMq3d+_{*b#%hCB~L&xxy>?X^t&bR1z|(`807C zWUr|;z-H?(&g+xg7tfjC^I(iQ$@!Bp=70-&N{o{~DeN20S%12+mW`EyPL3zKu#3e{ zvsTOwY`{$o^EFHrATOkj7Y+c!r1YhzDeKQ!AScAqJU&uR=-XoPw^%NcB^J>&@;X)^ z3k_Qfx~3KXervB$7R0tg&>1Wi;dsL<tZ_-u?_;IK`nI8YZU$p%U8{Z6UO|##@iWVo zso%%SBp#F&a_;LgNqwp0Q|XW)=HMO1^`CLORt+$`z6M~i_`5+Z8V5H_6RSzuuL<#) zR}<>;uGhGf5@@a15iD}40XNSkjhi!eSH^7ur=A;sy>z_5%Cg4GfJ3wN7C-$gYf36M zfn~gqnq40UM!$qbm1TwP^|(Bp0Fw#`>vH}|!q+4OkfaBKPdKtnzR&*z>u%dz@(O0q zCST1@!<9@KZ{3xd9;?1^-kw1wUtpb?YbG&!`{Mcva<C(duCMWj-2N3`MKkrEnKzaM zHdlZCdA|%y(1ryyOcXQ`iKU4zvR5+rOnN0$fUJA{GLl+K4OH~yuF*4J_G^uvfl&{n z!NJCbwZ?DaTj`jBbc}rcCBFpp%Z6o2Skx{3Xs2iq5V9ANSFw^2kIcU2w3u3I@f|64 z-|osFXhNJBu*$IS_Y6q)_D(~s0xziat;uWd_`SFLdZ)X30YO44a2EIj910|4s530! zZ-Ta@W>?4B!nZfvibs}hg$AW>w;fQH4#0Am=Hzrqe-~+xwlngFU%$WMCXFoHB=k(r z;$~6biwe(Tl=h+r%57!?1-zDSpY@j*$$yG8P8(MFjgv29ZCiFRnSJgIgv+MDS7%qq zcng7v1_cnFYK;$yQGIhh0ND^65QsHw!1Mqwg!Tej_FAdc#wnN9jsjq1O93_tBV!m! z;9}z+fVi!V^Z=}GhRdNK?xmYA$ekehLeK^2hV>iRKL)d;Mu}Y>z|a0}T<S@?pkxO> zeE^mnqVoOtZJ-OO;+=--V9MGHx)bYOJu?Ez^ZYso>Vft2dd$@)5qda5%9QW1Gf3Iz zpil_%LuJSD?0pAX$a+#g&t<V|&tk8T<NfYL9aIwDFs7;Agl(EgbxR+^0vvSZX|ev{ z#3mM?2{x@T%n4XPYh|dBvZy);L)<d}xEmbw66`0tLj5Qjq(PSvVryuB8hDRU(Ds%6 zm$=iOgHrwkw5Q9%dZ_v@P1e8-oD+)^4lfF+)`D6=j}`<g)DSSLL^)bD1WJ)Qx?3BH zK>L8wbicHqgfJU43gtjD0P7wUOrHUw28P-ZJ|>B)=^%oyqg5$|?D1-?3KI=cO$o|3 zI>k1bDhCi}mpr{QXn%<PN>D9ncu<+3deYZYEl4YdYap}j$r|(tz>=0ZuIm|v-5?Jn zr98v~V&e#U6?7|v9iFX>9zib~zqdG@f*b-Jq;5mhCV<m1#q=QcdSepuu@?&=$cH3% zTW=SNVo=nnJFtPn&6HlxGT+@HJDYDb|2r_|><l%68uWj5gWI{!*tZw_^)4{*g@3wR zbA$KshBpyb@b$8WdkR@{wEY=)&9r^ft+;`5QIoL9pi5b1r8Hz#jJOYpSb|BAiFhyR zI@?bjIePq*NK%&Uf%unTM?pUc-^V2nM~)l~yT;?LM??^;)iyDVmr>;?!<~qzszIBQ zI*^c;>Glga1w=q66u3Rqx)g8%n2;b=!);zZp6>?Eed6N@PB9N+<AWaoAnA!40wBNB zVnwr+9?)x8i@lXjTYAW)+<2`tNZx2ivt<4)5@Im&(GHBxHG#CpkQy8^kT9HY*Z)>{ zY;Kb`;e~HD+oMN#l-4xVEP`p0)=<OZbP<|%A>QiPVRr~$VE`N(F7MVK^AhmHWJlYT z*X)7!;+2~lhcWl4E!3~@cHFE;N3Ey$w$-bL;H}23cN*3D53ZfJAZemK1D+*z|KI_v z0#Be7|KtedVC9uh&aR3Pg7|Q06_Sm}h#UZ{d8@F-VJCwX4w7VTrBf<{0to=XC#GT) zuIOYE({dT0Ynm#F67d6~6_;R^AP^p8V^6`a5%chD9{oi!%mBz!qu<w%KLUp)7Vzl+ z3?@VwDzd6ICPYD^Z_FhY&QUn{{5t~|1$1(R`RU<hu;I8?1}TDvrSY@BTrDXmW(mG1 z69~ym`>o1WnVa_)Hh>X&-lG7&tT^(DiB0_+c-NCqf8EP=ds1r;_cuuQmj2=#yeH84 z3Gh_d!NKy;5sMDReb>m#UwJsFLEn3Zah~E*8ekMm2LXhJ>0o^Wu)7Zcs`ve?$<}WG zdo(uydy<lY8vP)_9;~1RFe$;5gwpl&34~J%P?86;@t`Is!G460D_}on5u2N9g4Ic` z4)U*_9M6!w2{Bj}?8k1f9ydSiPn=t$6X#?V+M*;f;4F(aOQgd<4F<aNS~~*k$?~LB z&`H5V45+z6^uiJq#Ryynsg{Q4mzY)vO5=!c6B2Uq%BX86P1K8Kr1=sHVv_W!)^?O6 z{t6niIuK$>XI4ZO)lOch&q9)Od5X#FoZa2*_UcmW)RKflZ^L32Dfs&24GQa6p0c9$ zA=!^^PG_oFUb2S#6{0m`*;_f_m0G8RriGS;{SPJ){_NlK>F;=nGY70zd~}lYgP@;i zquDRSTJa6FE;_~?Ci6!)9W<WvCyDskBex?}`gdd-jQ9}+Z!tjs)PeRO8(0>G)f~v^ z5~THj5a}hO8z_Pc|Nf5vsV+)igOV9s4qz!5qf0<eO4>-rA=5+ip1UqU3AZYq!W5bx zD}mG*+{Pffh>WgFo9U#TOgd4Tr1DV!-VqfRR{dJ@xB+m(@~;oKi-5M<*uQ^&s2(x^ z&Xk5+ohyPAe+YZK(IC@m1Gqd+D8w(3Xl;N$ox#%Z=kbssR0Ril9jOyYmJ%>96+}&+ z4oM%~u8X2ufk`Mr`AiER;y64n4P@%AM+3s}9NooHOAHQ{gEZX<0%#sz-3K<IuCSrj zB6O{`M;|G&^MDzN!UjBCKnW6rHKr&|LV;Yrzb?SR-v{~ydpB+Q-}$KX=%GVBdmh(3 zAZ~Otc7417{8*m1SLo>IrQw!eRIJ$=N|)L?G*q+!GAs7D8Z&HF86O)lD&w{aDGqt1 z-|&U9$15Xa;}vDYwYyyjNf2uK3oTAq@?ciC)`!_9;kudU8<FQKfbBTJR)h*G3KS~D zQK!x)#;*%dr)Gpx9T-BG6c|S$j;6p<6V|hL20heISDIq@5x}Wt9Yq-vL2B5_OEWxa z<S;*8n%icrK?~;C0y5ANnbzcNoZTqj#%5k1`yIgtGmxR`{Qxvt67amTMQgIK0guR@ z0VeV}XzEbCAqDk@V{D|TH$b(495%{&L_b)X&o{n$Lp8%(L`t61rr<B3rh^ukH>`zU zLyO+V&cJUOB?pR~ip7Y$B~)_ASYO3wdVv<j27;3ZL3%lED2~Q;ms#8zJkZ3HR<b$h zHBhr*^I|zI2vuEtFdhUY)>T$w%Jm>|0JoFgZ3GYE?#nR$2ycCL|E$=G%U-epqA5GY znoul$H|wQEW!x_|aA3VeK|Pp|0L1#(&*4HVc&kc>FEH3nK9hVp=?l)Dk#{7a=Tah0 zqYs{ZJ;hO<OHc0?seU(zXvp{>vj>N^F98BOOMa@81&%)qEdiv}F~z3yhv}vxgK}tb ze<!-5m_n&}`tuosUupRE0gQF!LJ=JxUOH_pE2}$A)Dl{+AYnamMf;-hRPv>N=ys-r zORgq%7P`+wLN|*%-o>uMJu%x6rDdoLBwZN=7VQ)!KnLuzX8fco`|%)pI&8h@tznaK z3oUmcNlH_12U5heHeZ;B0?~J+&#yX9J)V@-<9Q3d$1MK@Z<$bd=4LMtMg`!}hGx`h zQ8T`VZ{E#j5SX9`*md28AV<*&lA@v6@D+R*3g$JFBgCnH#<$d15se==H#N!qsjs_* zvreD{CNL>@)@_q#@^K{`azXTHKyeCRSnGKa0T%`0($()^8;Dk^*##{w{HOt;?a$W; z2V}9vmV6n2GJAkvEK_PH9?<!kxY!J)K7A2vrk5BBsfpBR(i>CcNk`Z^GUq&F4mPrJ zveD*SO8-&TThF#NseF1-9d)VzY><^qH>o3;GxV-R#0up`-ZAAyQoglRzH<ji0@y`i z_J0~_!<Au~C4tr;A7X{r6_9*3>N9v2F02Iqc!y|1cNlq26p$~7lc&p4Db8&1rJoi1 z=iI;x$wy~XFxB*PU^$!#oJ4jfE|8fU&<FB6ej}wZ^T}!sS^>DnWW}+i`_1@P+K4If zG@n1kO9R%WQ2ir*^B_8IoV1uKF$C`m)L%$Gj%+`|9GBMz5reP~`?;g@8Z~MqcTwgH zAdXEBI*>YoP?Ajvr-59CJ|KXU)eiIhc8IdDbP}bZL(&vYL6r(m3z@445WT7MP<UN{ z8dW{b4u@Z*R-i_20nochp|e9;$6Zk@*=I!Y@)S`7`wt!ZKHT7b%AAA?sVT==iE(P| zL<4a@!)9{(mw@UR*@~QOR5kKEC7kxvh@)i$gU-R{zzYmB7tyOAzz6{Vw3aT-BSApa z_>4vFv}EJ&Gr1Re8zx;GavWvL4=Fn2LlD{op00gr`T9G|8>iy~?%QH+wp~%<V@Ad1 zRh}a{{RaMEltHd2Jdsb0!l66b=w&8!u}F(BK-fd~h{Y}W{37=PGZS(JxIYq!Sm32B zwyO@hkOgTvn?447m4DyH#^d$%i4y>$Bgm^ax)^j&kzN`=KD)Gs4>~5?{IR51v05gg zHH;yP#wJTV)?<$X0f{s~_WrSNbPp7{dV!;<L%n_$v6PD%B_BaD7|EicdCc_&8xz1R z;gvJ>41RVyF0x#2j-V>65nLOpKv-JIR<BszqOcvGh<>t%pXi-!k!P>3A<<`1l23%j z@sn<Tl%()iVqo)Y;3aBBf5Oi-(blj_(YeOjNvy<m&^~~Rld!m<hDv-D#Mc<elTZ`t z84&OhLM}NU5b#~u(kGEcFjCPOti=P%&tqBqaXNuDbKMF0e~|AUG-VNdYd~9$@eUgr zm@4fO8=3gle-Y#g&`w(Z<ZOW2WhZ4P%v)l1I+&E&dWWVwu%o-w0lSutL&l?>z8%c| zE<|_Gj>U`S_q!!h8!bs<nC5gFd%GSF4ffdf_~iCx8OJO-QI8?qd7b9MpUJQjZ?leS zXgHH$y85l~+u&E<YrJ3Y4%B)sWF4}?aRl37eCCPgZE;esF|4+3gxM5$C*t>vXG)0d z-ap*}9=3qK<dYa&c!wg4*|osO0W08PUPg=9*lrl&z^}$3Bd~NhB)&Jb?ALhZnFj`- zd0@d&PI;Ez3u2{eKw6YL@TDFGUzl>qGuu04w8MA~;u>0@Awbw<P^=Xh-rEl6+}>Y+ z8MtZ_E69dLV+PL=Yp<q?g*p}|LLr8zdn<Ysez`nqxj|!+$VRf{cFea`pw8rc6pd<J z>XCL-c;}YPshx!0jHXXyOZGLq_-h~2!BXMQ=<?-tM~FZ5=V3Usc8F1y88n=>RqRV3 z+RIY7wH>jMk{SF9mQ0OlYS&ZPv@SKf?FMQP^e}su-LVfp5#fRuUhi!PsV*tBeT)S5 zml&aVzlqPhtzKjGNcjG(-!UM3cV4qvfwN8M+h!hoZE>I8)6w&g^=0IQB~0i<VT~0> zs=5|QU8oGi4kZ0t&>d^x0wI-4wKgwWdf2By^N~K>ejP->-`K!*1q%=P2KA)u@S&3h z>$2onc7aP$R`2x3AaE<<N3O^0kpO=El}8^%L&GA{h$RSmqkZ5XiV;eDA(P*ZI)qy$ zi(9&ICu?nDcYF?UUUw|TQ;~1}o*mJOgozCIrFu`=poqzOoe0bb>9?T;zkdAe2T_iK z$so1{IR|Dz^c%tjnZ$<XmqFJIoRkfTxqLliA5_`7G=6#fU}--GUWm$#H(Rf)C+C`l zH=ed$gYVOL(`=7mgE2&}$Epe89JnrN1=|VLJetL}A~*eUaj2&)EItTOEX=il2h$?< zEZ?XX>P_JA{TjY&S;#}+S%6kus`gPSF%KJz%+<^&dGa~f_emO+!~4%Ket-TlYTD}M z_fI+}gj->m2b(`y-<`h<o?z2ltJCZh>Mb;anp+|D&7;1ps=2;G6?h+QW_jl?WBa39 zQwUq5vI{Ns96ddEwah*pKuG5?p4B2AtGf&zT$bEw!1H*oK}Y0t7U)s2P{E-hq}F#M zW0usV=cGoK2{7E@&M6R8dYWWG>29(R%m7Y){%rpI-Ef2>w1##u<Ob1$gdl=8IM8K# zQd-AE&%_7^$l5?C6$_yy_QDxp9O3?E$obh3oe;p5Y;EY&*xw7!rohvubIt)bbMox* z`(H@*y^uUSo9f#I7h}W@5iuoahb6K~lBbc)XI63-hp^fh@FRHN)uz!(4sOXDc)M>C zLXjxmrjvJyLFta%ZRQRLJ2O+cscOY)M+@CTnATkhbsXmu_EeRV`hzAq2gR^yp1?My zhjFZp7`FwkbC1^43|*RQbS~W_NUR$P|DAL9EGn0P8{15BBRDj?<39zY297Q40`Vl_ z)Ecp~$qVl(C3b`baCTeqh1R>F<_)*Yt%zO4&2pUIE`1WP268MDKfwWq@Bsd(C?tpi z!cIU1bXupk2+x!*jL9>FZ5iCHZsx|Hss>~N2!jfCJE?G3eBRrCMW&j+76Qpt#>F9p z9#g6DJ2iP1!9_1{>x8iekwGJeNT&=Snm9dZ#TyY|8)QR4CK|AqMdAUP^0ZHcy{%^; z4SWQst`5)^gqF2ny-oYpWnPFDW3Vz?Xrh)q(m<Xd4#qRUNYi3Z#<#E`^9&}DpUjkO zsT0izreAcvYg$(8dV1>3puc2lN1V;c**83@M4VaKl!?K8VUVFJkBs2d4`?dTUo}pQ zfZ`w2tjnY49PiK@Xm*J915|V6Xf<EY;oINs*mkwZQbCE!u@;?H`(tol@|fxgE_`U< zKY;IGn?>!>)c>5?#jJd1$F>gouLzVy$xXpoUvXC$Bo*oKtO(X_359pc;Uk@kGVbbZ zkH$eAGw3#--1P5tL+9Z)37_Jzq2_*K-u(}}Eg{mEM$M@23nr3E;;;gqBNj?$gQ~|j zEU~(2*uZB&7IF2ey?c#4d-n9~-P^Mdf5x`Gd-oh|s4dqCGPNl$)!D@zRIq}YlxHfc zVhunEt`j??jzidpF%ljZ!a7RYh?_iqZ=lh}A!Bdou7Hu~IYdV47i(H{NaWi+M}zkR z+6^Z#VIXU8_}na%k5EI4Y{@kW&=P^KATit%5W9+DSrR!}|Dki!yv9i!CeVOzn!KhT zCBE5+#EJFVR9lR+fpS}ceQu!%aGb^JeI{~=VPYNrk&Yrg)sLS&gyKO*LAnTRnOP7n zv);VWL#NP@wEKSqaiBJ>PdFLn(OV1IfZEDU&(?Eb&sxB`O{BRX<78f%4#gAf319<I zPpwPTn?_(+AZ*)QJug(#2kUw3-I6{JnhDBfDu<HgH1G2tXFMcl`FYL6y-&i;VHlRH z?{o^PNz;Iu`qTBD%TK=^wy^lpt6B400T{BtGLhmo<^)Q~uNSF8)R1MPmW60dMsm8w z=f82SZ&1quL=8b&tTfFFt)TcwjTB1v0r3YwbgWz&t>S30^004i!l^(yiF%>nGYiv` z=Ab~E+P_dEc^=Z`M~3NxT<oH1-WfzltVsjdKlo-0IH67a1d5T1W}o^;)tTOjYeD@) zQQJGRPL<&nAFfHTM-WLAwJA&AK4$iHGJ!xm1m&w)dd`6&E_8&G5jg#cyx?{{oc^5H zK@%7VP?TR-3`1Ry52e2jwAz^=|CU5D*Je1yD&_f937n<qTqB-UBHmW`F7U1rVlb;S z89CwsI6*TfIiD$W3OC7=8bLY?`DkpDj7|F-(m@6m-zGPp9dXA0dZHXnw9Iag(Zh76 zvlKa8*kSLmdmv;xWC&?YQS2h}M+kaiGE{a|$TN;tGZhlZAlFz|H+7-WDTCDVEs<KT zmI^$&Lp^>-o_5&UU&snA@Od+`(S9*BA44DF(IBLS&knRs#Aj|AW-yv&7n;09XmV>8 zhQQ4#%)E1M2E>m?cBckT>8!rVVq}}~DL(Zfd1Ln;M%*YX-i;Iqcva0n+mN33*8`i= z`Nl^4NMf%78NCiqYk=qXr+OQ07FpGxgMDZa`!7m=aWDfqnH1#+D9Rs%7R1|<zEVx; zAEQ_aCpkIJOpgFKT)7h^VJ(WDi5Hk<c4O7|RoG!iC7;ZBrw1>AnN)DRu5Y*x0uk9q zj01qbz;X0;hAf)<&0ymAW%LF`$(h8xM(0D9&N<HHp<TOp?jp{kk>hJ|Xx*-TySxK& zcj<3>dGOXY@7c>HVym*WMkS8c1>G96saclZ0|n@(Tucm(;500}J)sY#YhVP!29lrZ z!s>K`9}sUHogKi3@-=*>b#=tCoy7O``JdkIk%<0Lbe*vy$~sw0)TI}(OMoJoRSZ40 zk5o%Wse7oqbEG<C40o&Uy}RLEc+c+L4Jg;cle$YgFP4>a?(Y2&Q>$eVCbIA74hEQY zfiP`Rl+iKNm<q`{DP}{paC@|4m;uELDoE}=y6N$ToZ*s-??Raz_J3|pS6K_8v<|)X zUQX8B5|gzbao_7>nZ!*Ej60oEFbR=1lw$WHz)c=EcVtoF4weNNP`7BJYSN&iD7Xg! z<8A~dm}J-an$CKU+Q4TM7Tc1(IeGjGXg(Yg15bR#53;&?cghVnF~}m96JhFLpG`V3 z5Wx?y@=*1lza|`Cf}Q84#AB#x5jr{Gy+FUn^KXSlEx>A2C`R!~WgUa?9SmBe$yIaW z3kz2?F6LXLDZ)+^=7=bZ2`BN-P_*{!;z{A*;-2n9=zh~}EmuMJc+Q&|5G#8Du3Efa z_y~J}^e&jtnRURgWH`2_7WG8<MQj+^8~yls%2AD{F6hC^=vGJr{t$_+&*QSRMv2=d zLj=PH+B6l5pJ4U4zCu4jAG31WR~6t;2I-cr6jxAvmKZnn(1Z{&-E*!FD9TtLLkjUM zr7h!Sr?DjLh%0-FDE->Rw-TPS{jSWwz}d6f?};2plYvhzKAZ(L!Mp4=&UWo@bg(ME z#ea(lL=)=$eEM}>{u?iU&&xmX@{hdy6E5`A1H;!@oGlB@pnqZX|Kx>^9ISui<==VP z$+^l_SxG*LF~AE9QWwV(4n5a-tC^Q?@CB9pH7P)iRZ;rXuKm|BxP_OSd7<i$_GwH7 z4^1+Vjj!3><b_!Wd7)Eai)*<>9AO>f<z8Oy<K-8a%XIuA%(U%@V_N$h9`ZY}-Z!u7 z$TzpH$lruR0sy0$NtVwc1cq5AjsIkdSN!KQ@}JG`FRah6%eUp%<ePBK=2zwOOkZfh z)3$s|;cmq5DD>nv;=TfImj%*LAjVl-*a>K#Kmg3}6rI;)@Ct5;wt#fR<i*qeD*CUw zj;@|mY9m;!is#DU_zbeEsAB_vT=?#4dLt)yrj$VuJ`YJd@WELm`g|82a3Na@z5Sqr zdY+?%Ef2t)F8+lG-~&W^AU$}}H>@78GMoi5pbrl8vZ5GJpE$Ee??nb+F?vXd1`rW) zXdh`8<~?Nc_#aRd!nz_8icD!7Qz?ohBr~EXcd)b}9(#*A@UUs0%JFl93s|1(-3uEz z9Fu(N(n&2f@y}U}E}?VRJSLnpj-2yL?hDzsV2iPESjGBf>29*As^cGO(|@V&?2)5~ z=R7M4duntP-r~Sa*KP~M_xl76z+rl$#QgBF?@<3j8Rk@RqYQr}LhioLd;^^$yn74= zA9TMnL!X4xXEUOh;9FnoUWP2x!<6j`2>3q-n88^T&r1ffxXMrl<&Rp=;xRHuWP03% zxZfl;A_7hn;6>gCUEYKBiQ2;8k%E&+uZLIRPg(TpGNq;^z)&E|1Dlru7A3#`9})#V z{$GYfZkI!FgrGbthzB4^Ahce^*CC1)@H>SUUkDb%LI8Y(#sK&<-VA{cs^&@HLt;Y` zM|7@{rE?9il>nCdpdrzem9Red6HIujEoWx~&nuix0$H4?;1fotKPIP~PWr83QA}P# zCS%wcl!Lqy?Z+OL(=rqGh?}E>jsDYaj?Bvb(~UiJ5<T&C_K;ARX_`~#A;bx+NAW7O z9zBQvM77Wz=Bk2o9^vK=&!AcGoTf@EeZo?um3Qjv!cH`aZK|v(1GBmNc}Bc3oA<0h zjoGG79B3tHS-Dx+VQ8@#$4!p);t7c`)zgkNIm|fx4uXJ&R=69B-g0q<$UbuH@m~gm zpR~@Pg91@BM?Zi7F5+Ihpl9l}3-+yKmNFc)Aw4jgmo@-Z&t~XC0)0(EwyyRZt4*~u z*u=k@!;zQ82gA)HP!;ahX+~!tduddXb2kTVm>TBV6lulZL|XAMTOrsK<?zm5KYl{m zMq3fo8pnyP4peart5gOv;1D1ts5lzI>T0Nw8m4hnM`I^%@hceQ6{+IiMymK)RuMIl zKRlC$OWcc}tO6pfO3mKeajez@18R^Gqa9!w3{8zvYZA*Rjs9SGh|L&!LBGNA%)(IR z(Ohaud~SQIYp-WKoz#22hWUR6h5kcOvy^2c93X)v1oHUdeZuC3<qCXgLdv%8>6CBT zfoYu{O+EuH1Y8033MVP^oH1w~WUUkM*UwWdNOIkznpNR)@)=m^IVtEMq;SnVlTa;G zb;g+&t<NUa3i{rxXS9zV)rP$o(8);Zne5Yvr;|^oo=!iVc{)3ilVdIO&~aEjmz&w> zWUr*u8o92WPmSf~({nj+%eTNbsR_18pVqcXPW}oe<XldB*`<a+5kDZL^#ie)%td!C zo6B}<%^TVJ$WUW7=MwHFE7nEafndQAt9oD{=yVp*s{wE9#>DK+MNG?yVhNs~W+EI! z@04IcPA8<t0cz**!SkGN!3K!E&L4-!_7Mw6(pHtK0<nUbD5p)ffIP*7guhFbeHN$& zeF)wc#v#XX7$sM}iMC-ZfIf%y3i15E;gsd){~Z_Y`x0wK1-=j*U7a+J8lC~UHGz|m zL0s0VZZnV1F?o)TyMi(u03uFGK@d3?nJEo3+!Z4h1Xna=#bIfUXZc!`!E9jX<WQ9a z3^O+4gqS6}C{{uMj{aPh4%v<@cor*7(NywT2*uH8G*~N2=mYMg@fjY3CRL>T%J1$H zt6T8PafYDqlyZh7otu+Z*cL~kVTxM{aR4pfaDzrBv$tNe4bIT>Y;UX*!YW3j{Bew% z@!No(y@1Q~yJn0lpz^MW-H-N_{Wi$SRq6_w+J^?qndh{;d%K2i#&5#r?8!uR|7<Uv zjbFvQBqR`oX=(Q?AO^D%a6+iKLa$b1PbMBl%<EH+cqLuQj3=$<SZbErpWK}QzrMu9 z)RT$V;<)BV@MC&`CxP9w+BA=_?zfH&14R5WZq^%daq~cvI6!rzhS>Kq_9<RW^dgiI z*qLrY4qiIKIbuD^9_LuOO*lxJj01PgWT}YLwJT8W=GlHTaLTU7g!9d9x@gfv*6QJq zv?GQVbt$lbxUFo1w-cOejRkuPbv070@ZO9g9k(nwTwX@AZGFU>*b4}zJuKUMw;7&I zd60dvh=!tiY_Hs!-PPL0{fISsbgGQgGOD)q1Y1D>6NuNXq-2wJd|rOR0-*&IO}gb{ z{x@#(sgnc8i^oo$IDwf5Z*9_gtAh7Xf&t2rBat;u(%op4`EAgDmSi=~IO(UBNSjx( zuWpmRqQ(jYtZ8_^&bDUpl+A#^fv@Y0*n;ED8ZhW-ooLZ}_Ao#3|A?vhXVYddcJNCI zM;N6Cvt~{kc+MvWoAB(PR-9LFmcw6?IG<RbS6uMUD{fIwD<1ul9Bfrr<iz464t!aw z*5L?~HY^|OabKx6sExR<Qk&Ff+*hlYsV%s#Q8%kwa9^vQQMW1sd8|`gRXbvCQg2b) z)ON(IS3A^B#B5L<suTB(_a;=Ay6tj8-DYl@PY-T3U#4ycxAJR<mt$U3kHl}Ou0l*N z4}S4u$~X$fyk(vT!0b}HMpHNd<~!slnB?GAbNygD+A9abpzYhx7uykjtGYuSxC}ZF zhrm3m?o<a+qn&1lN{^(}%he%-I@MjO5B2IYJFvLktqvpZHZO%fEarBl4~yyc4vXpW z4vXnk_p1Bw<t}wny%P7`>Q(9#?t9ezY5@1Wa$pP(g3$-Y?Dr0gxx+g!=74u#%$-Uf z7;{j)4afI9hVoyIgKA!f91h{onI~|+OO@0R?tN-lDctW?rW(Qhuo_k8aDRpRPE}T8 z`0^e#t}2K*q9#-o_oJ$&CUNgq=M^+*2ak=?tE#OWq&=>lQ&Z{!o=%AV@I^I!IX`%> zno+Yzd7rwZ>bRd&bL#cDzf!$Hy%G0Usqa#6QcvQmQ|i0bW%U%E?tdD@-rxXG)c06B z0iCm5M}|NeV=fy*a5s;`?4cW`g*}$<ZbF|L*$ZN|(7fVAu=)bvLsKP^{!n@5SqEHC zQ>EX>Yw`%>?*S~57K9qq{WB@s5w=Wt3b-6mYloWYON(G|49hZKiq4@uiS-vp(UU78 z8&Qvy6x4!M2{l_pZO8XJ5M|atJ7#E@MLkv>Jy$kh8V`Xp6y?R)8(xW!!5rZY?|DO# z2Cr|iGPkjLRVbf;CKXkA$1<Vl<W-N-E}lYN9>E!Y;pv9bZx0gD1`H+erH|<jcsMve zy&q@$+MVsjV@`uC<|S-sOjaUL<F3WA@JAjxb+-8MeNc2P_TP8p^cmSrvpNkFfxBth zik~H-B|({3;TarWzp*z6e@`LXU=+@n*gJE1;t&j(R8-Qssc-~Zf&5aR!K=53*l|O& zfJ0NLjZiZ@XFOIY%M5b89+Y|+c_mAkU=f|t*$26Bpgp|@<Nv0QtR*!g#QwoQQ7D)M zVz2|aU-BHBa2B&=QP}qt=VDEdgLt`0BF5_?`yo;eo&INWfu~<x^x3zmHNt9ofAPBe zMZ}Q<8^3IiXk#Oo*(^0@K%xj_oe@?<Kj9Hn(gy(jjWcHL68*ppyPhj+XSZIr*Mcnp zXBU6{_}Ne5f-@c{!NWe3GCR4Z<qFL##PIkX$myJ>G5D~+X$%Y%$Wbk}$hFn`euaeE z<hoK)t-=Y~iQ;N`UIRU^L~*U;yG~+ml9cO(I?fK9)uJLu0C5WQ1`$ZPEkafv5vme2 zZ>e1Io|`Z+PeTvgZP5Z|o4S8)!G@vH5q+#rn>}8h43VPXC~FEUkXw*NMzExN6D<j% z7*t2MO_XM|nBw@vq=U0n#!YkbEQA7X3(zvy|Hr{CvZ>(#{({?r%9y1If~j(GQ1%QJ zsr8{NV9;3BggxrE%GofU^p1Ym@S$#t?WQc#Z6&!59Sdo&yMm!(!jU*@&0wSZK8zCB zK4>2Gz#3pfj-;L@EOa7S0%W`>T9ZiSbL_4|ym~&}1MCXV05~iOG&>h@{t-mD%@Q!_ z!-JDp0D#~;CIG+~7Ipe!p>jQr41&Q)Bn;3POIrt>49{l)%Rn#x+mTr?&+pe>cYFgA z(L3{OO#B+b_b%OoQg@i*5UjqaAQ(2G%CK~nx9JF-nlUkH3L791NK0sEY+7IfY1I^z zTL$Uji92dm8LS{^o#+fb$1yjI-j_nvJe%%8F4cOFJ2m@)+R@N_!Uy#1V^cphj>5dG zUKOG+occUD)7jPNI4zc+m)C83cJJL!^<y7BcDBE&fdugKzyDj$e~CiwZzv=fWTH@E zzjlVCN6^B$kEHL1K8qLI;IZhAR~gXEFb?eB{VHSc9S2ZO*jr00j@+?lFTBLzqi*BC z9e3<IfcxG92lwy0WB(loLi~F?eyShAp#KsXz+Pw1Q5q;@nU01Jz{oL&Y}Mj^d=W!* zoi5}7q@vU@i<xL$=H*SikTw?#X1x(XA1S1VCl~RI`1N-ZAGG2jv5E&ZtrA?|nNavM zOqv^87J~WCt*#({@Z~X^!Dj*T799c}+-2<~2H-4*VHuel>Cy=56bw8tD&@4aG6^jM z*uh}E3M-bLs-jF-3K7BdfWjOJFC4jLLo*w)P5NUpZ=BEy^zIt~NzQ2ZXqAAAa0rg_ zJU_G#AL`r<-^snby<InUS~_7MQWz$?D4$>RjQDGm?}5{el|9=W)Efuq_?-sXz-KUK z))j)v|Kihge0mR_JWyH6vyuyAAF2BL2rk^QCGu2)p@Ry~SS0`!FJ-{_#TViFupa^F zm(ZmW<TR9XU8Nrmu-`OS5sbJDC1CY5OcGPAU{dqgJ3vmh^k8&dXoMUb;6(F~VIqEr z!H3D$Cl;l<bWu3;6p_g$D&rLO(A3w%?ND2U&v?-G8n=7oLWtW39yoiPssWhsIw|rs zZX?pYZPD`3xIlSFao!ccy<~%&LUn4`y;aIo6U0VNFJa)4abFGXZf~7|<uqORvNhEp zCl4aDoZasPC?hyPJ>dzn(7lFCM}&TnWs%b^>JRd@u*YWc*uX#nf_;zI3EH+UqO4gO z8iLchGW4h*tOwJuG#zTnd6=-BnYVWVLqZdQrALq_vi1lZJsJF@Jx0(h+f$1GnL+ks zajwsQIt=&0L9(T{Q9kjF#jDfnpG8N&{=agBY|s>9iff!B%h!>1dCmH^wcXw1ZThr3 z9+t`F06gWYvZ>c#%@Hp=g9~1ft`xlBwvn(rQmJS;B+lsqFT#c)U<0iQ8AoiCKT5nI z3Uuq})}|F4WD=dTTZH(D;*JPtoDJ3-t~Wj&vF||uW^G(s5)g7hfCX+B@W<t5&5{S5 z3Cgm_gCuc>H^2;5qCP%xErJ3fSEAhP`|cO@U+(M6)eArsLJfMyk4&l|OhXXgqflZN zlQfyL-c-c8A04>TkXTy?e?ZWO>V;yD17ZR5q%?k_QW~9OF+6jXce6@o1Ks+3RYXMd zf~5pshKT1ZcW?4XwlIHd@e>_=kkW~YNc9$ybaDuJ1Q%mCFq#)HX2EgnX*9>>LFeF9 zV=j8~VG+2x&8p^aF#OGh9+P))=#$WclqTuU(xa@U1JX9r`VvPr#|mORF{0YLN_0ez zvJ*lPo%fx)uISU#Ql2iLD+R^Cw42j~T0cM-<SGRThwN>dgC4cs&3BZzVkgXl3_Z_f zXr&bRIo4|x>y;&}wPgTrkWyg1(uY(ns$sC9A+WKZMf;u96qO?#NN1^PFb_#5fCzHc z1=u?&II%_uUiE~y*$AO-FqqyFRRe+JYiX5ahbpWj$W^GZ<(WHbnL8~2X2Ru5`rXI= z-oA!(PY4^*ao)xT=QEQWEdhmBa5{sWD-Jz&rLq3*o_&E857fSx2FM$0N&lshDh_Oh zazHn?2VHYfRE}4X7dow%if!^pU!=lkY>8z?Z0~SLIFQ!eGOPTN_IyNvk;e5|8mMqy zG_XBn@g|}xwTmI`4zm>$?`44}QE&5C+hCQ)>5SOwBEO*L@f~Z4551$(y)|AwL9;bo z(2eqk$3Z_zKa|iq??7`81I_u~3xa%4YA4y05pf(u^>2h`s5R_0XQZKi*4S9i$YQFA z1-`>kG@6O6qk>!`XQhl_<0*QD*p^DBJhO%fR~oIUnTuuk-2wwZ7FF(F{k{#s;sHck z7olgtL%R)C!_trL1=m>G?$IwOXht8f5?N4vrT?f=g&bgG#|AdWc0f17MnL%TI8aB< zjGpTPN`-?NPzVN&BhY}Xf#0xU7+FzdrCL*{oK~lxabxM6SyCi!Fdh|d!ud7N@8-}3 zz4cP6XmU|SMKBL<SWi=$az?;yP75=2;P9MmV3yLwlu}-5g-prxCD+Q7TyIb{Q_=>* zvNR>;?^j*~bGp%RuQ41#0xRH?L@$ERx-{omTH{@`zvvjyV$nut)72f<Z!`;V>UeNX zUq(ScFpH&H{Vno&{Ptmv`MJV^XBW+RmI=rEXPd^WVzcRgfKxi)v03C^)!IdAOt;_% zjYVUW&5P(@GPga({+_+w!@fNsGsSuqYxD^yCdhHGX}DMy!M7#ci*I0+l?47ep9WrC z(u9V5=x+ohM>{<xEI~v*7_!u2%Q}^=WLekyP&m2OOM6=D5pr=ChqoZ4#xj%LSmeRf z_7-`MgE9M&V6czC{d{zJkAjRW@*yju!w&FxEENewtpN_YB~t6TzId419v?=72YzZ! zmnQt9^QcJ99qC*juhCC}&X?Yn;|;HpWTNVUyc4Siuk)?<FgC|aT%pZvgKyPHCG((? zH0hVy0=1CFafl}l#)0H4e=G5`hj2kJi|X~&)HB%g;~5HXS5vSaNLHc9_Do_L4lH1P zZNTZVsH%;?5s%7U&Vz#xF&H|(6V7R1{WLi!c{DMPfHcdO{t#3h#|xWk9G7Qen+q<J zw?z31I_LI{4p}e=?DY6pEgm~r8-h}}dWzh(1eODK;KoA`U19st-<VH#xFPmGwt;ly zkU3Pf{}Ot*pC_)78kuWc-~D!iYe0q0T@;J>#1oL2{_4fA{T|Z|7zv9$xp$yAr)&o& z()n*tHD6HbDfVln&yaH$bRH<R5m<s(0NTKCBeFvRB`G8h6-Bkz%@a%#@Z&g2C~s2G zFUiRA1djeBH=;6gmo_ga?XxJCAcL^<;OWMfuWu2NlivWr3C%z~JnZq1gDP-#`>Dvq z4+b_a6Chy=d4O^FZUdHz;9GmWes?>)`H12w&M%alY)K&mRRz6cHL%|!Yl~lQ<6_$w zjxR2NT^!;^KtS$LShTLY3I{`Q2-+0asqKw1Iibs@nZUC*6TU&<(vwJ!22C2AcyR7! z1<p<cTuGpVa5KFf0dDfHB)Pfc7J43<*tVfJ)KG3sKZ&h2ws=XZx~F~234AG5CxeU- zrB&#QgVS21GgvnT7j9&$M)u69$<j{ZOrpO8F{bty7i>kN!yay!v0!lR#L_9t<TmEH zl@~$gJm^Ee_t-Qc_I^KK$qpI2XFmTZFH$Gj!na1tTf>S8hh}vvss>>IG}lnY&4Tck ztYW~PNuf6U_2VbpVJ#AnU2(G1f>+*V*xLhO2K)P8Z+pOb%mEa-O0!x5F+jNTVTzm} z7DF~5s26Q`eI$w97N|2vWCz?K`R*%Xq)lYwOPt>g0W8>+jhk4M$bIbHOKn_ZQ`g_B z2HRB0DYBgCeZ6s!{9DKvAuk57a<il1wjncC38k|37=B>0a9z@^Tly=@{|Hd%2}!`o zt6i){vp<VWgRb(K+0~l288nQObg9JcEItf(#c?D&Hy6zjgGi1uB{g;#%j&gIbT8O7 zmjH*pv_W99fzDWg1(gGRME2P|!IUXL9IfqJ19*(33}!d^QB?aCfE>hw;!y|>*3;Hm zMF(F;$qfWead0j(bIbHb*jhljn<tWq12E8hbLsQ9JPZ}y^XoJ44Gv}CQ(74q%DU^J zth*j>pa?I%z|&Ak045Lt+z)bsZAE#$H?Y94f%?$U1vmj?Mdc<<=mbEIyHO(Nt}Id= z;Uskj$ilG?vFYoPA3cJ@(HR)0RKZ<^JC#RgZ;nsShOdL}KrTXZNq5k?h0V9tKoH|K z8zL8o=B@j1P0ywE>AZ89X#>2(49quAuybfJ0Q-a!(0K-t4Cm;bUI*Y{hqoY4a22Hw zev*Cg23{zC)F&}!H3vEDjnqZQGp(tZ+S6qOP3A$GNyF}C^M!|p#<$Wd95{^YX?Weh z!}C7~c%{U!0Y;*^K|KYfNNpCcQKE+}gDP3y$J#akVzW%Xlc2EAuqw<kIJrCk!5~en zbmXSNk5v&7R?;&TX)GC9$Ykv-p|RmMV>7O|1+TeA`F@(fyomB#3h89Lzld6Mym|VE zjngLK9qz9<+M?Co?LTpZVK#-e4W5^dAvVn`tnp=9z}IA^j$`=hIEZiN*vxvop<lcl zZ1vMJW%95J>BLmYVXC}UPZbAVLml`=;*vVnjJz{XCbfkK(msN;1*H9pWMU3h)w74B z9)L0H6aEwOZ^B~SJfA_GSnDr(@G7xa5vz6V6>@le^CQrsuR@Q$`dmE&&rHxj8l%rC z+?Q$t-nPIC=FWOf*Kj<Gv}4P(>o(mkq=4|6|I4?m$~o20Gl*%G-pyZ4&*hyJ@Zgyk zYr}6Pe$ae+HZxbi)9UA-zEek??Vm+xjfAqeJ~DH9`V`*-T^*fkskcbK6kv%1U!ZgW zfqH#9n(K4P+P^w$;TLO#vu*@J_^_1clIK57q*gtldmp)<_4=Q}6fyBY9Fe0uM@L}E zz8<(v%~IAAv6`i7Z(pWnsq;?&o3Oo~mC`et647U=30ea0SXn?rs$P(}oYfKz-|mFA zZ`Nmd5qxx$^%SQx7aQv>yZ|s^k<ZJAdHEBj+{(+J^CA-QTlw@f-+q)A5{6n3_Id^> z4bxN?2{P@3fSYOf=%jQaV#X%O<XuPv`HF~<K;Xbvhy@1su-l@!#9}Q-f6J6oyJ-+0 zZZnqSvl7;{S_3*-p~WHtwf@rZIdhOGVG`xyY?f33ryQ*T)z+4x3m`5MbO3Y<j42DC z;&NCr)~B#!$lLYuc2#l<d~3F)){DcS6qXc9NBA`z1+9Us1P2%58pc971mX3m#x*!r zt6<SdqhiFof`ks^VFriE!Sw|Y3VABe!pxe7RRI)}Km_oDAXAI7e}XLb_94RXEI3bq zbdZikzfvkGtL-*C>rvzY`YenPtv7UG-mzw6ZMn+cWBq8=B5b6FHN{UDYfwN`?8S#O zz@`h*psVl^fqAu&jd4;VBp5n%gQ(N~2uxLB%O^6TffICc@rwkXt*kkL@Vb?TV6G~a z9)MBRkFw&Tf`N*!!l36;jYN7h`7jCy{<whMgP&MyhL$BN1)YD42X;7_MKr}jRfspC zsi*|#0yYk65sGAAk3bp1SZa7?fUS!>p$g0z7+_$i!K%^68-THcXMIYQ$HEceE$tZd za~TKTs4@I7d`1pBgeT3$k#_(J3FRaNhMa_&q-UE4V%rg}x*{m$T6jf<=}PjdCIA3N z-$1NSfffiiDcEy!Qn{@Vm0+h1#RG&wqC~#<D7&702qIvg3`jr(6yx2*v#LZ*GTg?& zNGS$NoF73A>og`y_GuvT2?fuc5bJ0CEi0U~ewoh#(z1iYnKI7LeLI!H_rZuFYoVEf zO0nCnVp{rJ-=z3CK`n^v7F9-Gemqi{J6>!L>7(&j4gSTd!-?u(9OtPcid}e8)0N9q z#ch_+D}uKCrAUQd{-P^H7+@}NTmGA<f%Pk>l$+)D-gXOGV$Guk^v3)Xc&R<X(Ekj` zVObLhX;%2^SDA<d2<Vf+WR@bj7WLepVs+QywHyJIYD>4uKZ$*i`wi@Z<zS93d)~=n zzmJ!9@$!CNLR1(+(8`8PKIHdTK52alRU3HG_+w*3FP|un==Ca?pWK~sesTr`ise4q za8mO?Br)UxgaM;yXm|+v&}XA)^pT06kE}!IQ6a(*S5g7OU?@Nsk`h9DK_4KZ08`&C z`iKl>(76H@pYb~sI71)&6XJ}ZYi<Bta0bZCJc<V&T}<!Sli~^v#kTrp+Aw29rH-r7 z`2toWu0-C_imht_Ti1eTXPO$|u9cLJ+k|uK=?7PiTl5#B5bJ0_g`1T!{3wNuBTWAu z8%GRF<&QS3M*^lVrkO7_0{T*<yLT@KiA!|%ONM(a&TuzUi~TRA76HO(jv$=Y;scg~ za)si-4%V*`VSJL82Gk;0C#SK_r<ZsiqMmdFS|ueH6TuO`!HR4AgZ(z}Pg|ZC$iqKd zuiKOtgL(?Z0RBJi_ZP6vZ=&k|*+}O(v^PSl!2cX*7f>Igu-1kcinI$6j;39Rev(h8 zA$AH7kWe;Dp`Z+Qe?AJzISlzUOOu3r6qJ{ckAj;2b5YQL_j~u-L_q;fbr9VbpdbS% z2%G#XDWITEBA_eUL>|}`C*}d&APlmOPW^mBBBOU)*!XMYQ!z&z@us#I`Djq3Wz9@+ z1S<)BPDCgmSy}&@?IV8FSO`q(mjnZG8u%m-+Heh0$Xm*PJ6^Rl2>v~*#(rbfX8-RY zq<@Zpz_*5w3K4|V0!LmIQ!7Eyx(SDVzZ7UGqtTLdqmV^$-1JShK{G>Jv5##9c3PEd z%lzkHCqYAh=Jy)V5(YE$-$VE3!BH}FCa98NgJr=WlkFfVjr2%%u8BT0zVnM<7=fWe zb`9o16YQdJL`*$D#zQ4OjyKtQPFzCZs9m~*;4T>l@NgHL=20(m&DdBT#8OU&D{x6M zhlP1|GxCz7VZc}`j1}G{b1h)e6kd;o9?SjT;J|2|u36l^G}DL2LJOSug3}E)N;3|F z00Ds-WTQ23TI<cu3h2zb_2ws&IOqlYbX<dP&w#j4iB~61b7M=|30^=_(m&d*J(({O z#L*)=@k}=p!{czor}tDi_JWR1VsUyY6Y6?x>;?UxIJWf*oLRz~5lVW3!S}Kl>MUzM z%p~HvJip4}?my(iq+xFCX6`?E<_w%t$-x^M+PJZ@evB6(Z36lRt|KQYd68Xj4kW9+ z9f>rCp|zYGDh-Nf9at=2n55_igAACA?;kZJ^TK>$>l)EQKYn74M^K?>5g^IrXwpd| zoS9FqBj{uly7{S;w>k8VQO5RyeQSM|T|rEvQR?sUDQrmCngXP?rX!8Hm5mXc1m4hW z1Gye1d;X2cKejm}y)G3#hzC~K-p_M#Y1aoYWqFv>$vM7=Ny8Bl8LzMcWC&@qxaY_Q zfep~xF|Ce^4zz8wd&Avsu$RCkqataUb`CgR9>VR3T6vbjL5K`}VHksz+Gu$=CK!a7 zCrslZdy?MvWo({2(X;Z?8ctLy)vBbOx~Ow>b5e~-2Wunnnh#MuBw<jK<iX4pbJ`e% z2Oc=zvAaaIGop78=v3kbwv0;4(n3{QgIZzm`BQ?z&<GOunA7I)l=y}8n!O8Zpk)Zs z*|_1FGGWwsf6#bJ)<n^0Br0_qg8M2KR1Qx;qCC;dFx0lt-Y-!F`HSZ8Alze4m{1Lf zs&^t)k8Vbh6hBOl;kpP>5hc$(dk;dzvxgcRP^9q{%d{dZ>I(Ok7vQo%MT<hNqSm2v z<4`hlUmwK-0$uD~%y)q8WnQB00;gQ(%$N`p`7smeZk?56PsJ0TUnTkMZpg&@f{7cd zhfhr$GJ{nO*0VFPlMzLH6$7$RAqVB3r7@5_39Z_xNs*X}ZaVtiJAwh-K!BmrFT~N% zOYlL{(;jAYv<`Bvm5q+;(e<Ez&=X>$igKVsk8=*S&N5JGFv@u4*Hm=LqZ#smMeXp^ zJ3%o#>=Lzyg95e{bH<xlf}@QQ%p#~IbsPBFist4u2UbPUM;09>836H(03f2Od4u6o zuQqgeP-A~6iK9U$V<5~j2rld=_7L^aC+(Txn%GOUbKXIzgNoB^%V-VfDe@txLbQIc zJQAGZ6*uQ=_Ohy+RbI}$)Ux;MBDtxWs6XOH#e>+S^{hbzw1%ycea;(_A*dx|NT~nf zY11S7Sn((!s+bh5XbHFlj$|h$p{T=(g`*Np6@6Y>JqaM#IIhu;@H&z;rh3F5NJCYF z&(6}QRMza3Sp5Vbj!UO1VFu~dh8r~N4|yR29ws8IWEMuSMPvmMHsy*~c{{lN2-DzY zTB6$usY0VnA@)VUHzkoz*0-!eAC^@}o4!zJWK%4e<`O!Mr?CtKX07yCrsF8jM{L&a zgWX{c_J_$C*aR&=NC_K6%KdrNSIWA8I36Ga?Ljc4o97{>oQG8_MW0N|cwzPL21V8a zitPQM$eKWrt@+>Fy?Jz8*L~*+6bgj`2!J37QIsspB~TIoiKIzwmT8F+1d<XHZYE(% z(FTJkZ~;Mpd{q?5VnIopvZE|=oMkeOCzFt##K+y8#qDHr+&RuNGwHPdNN0Rbx+m^( z#_i71olf`6B<bXIMw3j>=li?&-S=Kq0VK6dIt>yJuU_4E_xsxya9n@%BLoS{*LyzR z35A3TZMo;w9#c#fpv068(BZ$Qz<*)N_ZTLK&tQ|Oha9o&be;exEqWuA1R@y(0s`nD zDqydH;^?^C?L5AWy$Zo7Td-Bt7lN9G&r(j1DeIDx9JXU~G<HlOw^H_j`;Oabxj>{D z*CmGx)lvipfZYd=Wp_gZcrxm9IwmrehB14SMCb1!d^J~g5Z>GlIjDLxv9OSMO^vAq z5R6<TX%HthPEM##O?uqy++F0$;SBTlES5Qn%j2nmI2QuniYukFdUoN|?5Qe{UjRdZ zh)DsTD#o)8GX_U$COxDCR50~R64AKH(7_f|Lom!#FPuNK=;KVA$A}Fsjz*BICDYqn zKQCJhW)@h1rs+)E5gXjh)an*O7)Mo3UWVXFCGlbY@Xmmo0dX5u6>9bLQQAAl0bIF- zLLq?{Y!CQEy>zc#RA`%`mO3xBc#wFYthIiYeXh6}HqC|<;^p-287UyH@_yAqBY-;d zB9bw#%|xisIcdZnccqgqlSIc^usSTHdShRzBr%EhC^MLGkxGnr&0Qzmi^K)DWigXF z(`$ucICj6u>LitImCYA>Qd`n(MO#hV3hX!Qbb2>7;k%@w5-nJh&9fGYw8t;zxK1{W ztdsocjDC*sOA5OX+e*(;k!yr|uKT)(8F$VfmuF;LTgpguPwaTlc{frK^=Ig`v6u(P z2OJ;t&xMaZ$%W`HA<T+1NV;NAlhf?<#%2c~8}#UYUBp~A*5l!EY>Bje7JbwCN){8< zexn$7IQkhicTF#TS+(cDt<ULE!g?9vbAf5xygwtfXFTM4#6QXzQ2_#r@Q_1rjr!!` zFXX#WvEO!Ba}#*T)cVaD>qgV+ypZ86zm=zG9rT6?CkU)FAi<m=K~x{^nGDw`)m0(r ziY#-kb_)@b(Tsayz7oTgZ+pmm+c96nR;Bl9pW{fEdoTUW#m_6U>*-GHP4WmZa;H0V zcd3Mx4wgVy$YP6S3;E0Biu;DFg4QgPDbr%b3Q>Ns6U2<rq0e&a5-axH$3Ti?jzw(v zCgO!WHf6naWvg9tyh|yZFxLBvQ1?KcytI`3llmI+(Ee4O0Eo&+3$oSckHxjhii9>F z%6C-zPxsNk$3V|m$kv9dz4HTn9y0_zXb8HST)u;^4#t*4%GWzynE52r8}`^y0lt=# zj1*EQ68g{Le>t~8QR{nP{y@ZvGHoPd;`|qC3~r0g>;tEM#f%Otsq_ESc8{4<sy%=; zCftc&Agra)1aXqKQ19erf_ffM({m|kV!@1|0nU~xjKsp?IO=nBanyAbl3Q7KElwy+ zrO5Ni%S#-Gg_*M;N8@v5i8B`vwg2v{fViIkH)cADcOn>Y4%R7jPdL|MCC#QAvzXQN zNL^3jm#GD-b;zEWl;K#Xaef*}(ec=gCUsD5#6d5WDIxULHRQu3#A)pe1*Zno9%NSF zXP~hjFO5_d%JavG6|zt%&(EJe{@_Co^W^mW@kc-K!G+WFmE+|PKKg-?(4^p{i-6;5 zNcq6>jrN=0E;e&pG;5#$gRnjh;WjO>12kj4jugUG{rtElMoXjjxfQ^d?B&t>#;9(q zJxImPaWAxc#q}hUGc$~%CE8B-M)lpuoMc{jSwER4Rz>DX+)*prR6737FGAb*;xeU@ ztKm9@+$vtDP^j~Ustl#w#t3yAf|JdY?8r>CdJu`Ka9s2+b$Lw}AvYKPy`ej^WHZ!e z#!+JBB14UL>CPmm-=N(1+7wpnOCU$1$DeD5;DFf<%QgCdc6PM(E}||LYSN8A_|Y#> zPLUu;5KWMI!-)0?7}gdo_9dIOCafrxcE_E<g<wI;M5++OjyaSun+(?a%%DwShgC|M z?G(SP4<)5+peWzfEXqt836=*L{!!{v(w62xdt_O_<f!A)Ph31H^eJr>i1YauyTlcO z6mwTCCQaSKuUmSmd=!ysAYWB%i790DsQRvT$SivCPJ0eQj85vgJtN&ZHIT*=v{t~j z{0^B;yE<Lm8`F*vO8PaPD*-9Jg5Ruyf=SGdSK<{?nVPMfQ0ealp0j^`Ao^;G=R`#r zcutIA&7!Mk<~V}eu&ef5M6zjk3*ujVQZh};c=7YlyR#>ligk5ZC-|g07~lXpz5=0g z1O7gc&hZGJFdqZc)78M~sU?$yO<sn&TC4!s&N!e&)4`uCrv1|l4?Yt@uG#w3TV#{Q zcKW_KX4oNKkfn9hTrX3cmZE()=A)?-p3j>B*hiRa#ZDiF%fVYP;Gzcvj{VM0I6xsY zj!5vzcLnHxCeKHe1HsMC!Y8V2dM-?8a%{nJeXw&C=F<7fFl8-srEbQ48+y+PqO8_< zQW?5KW67{X#qCkog)(R>jZs2*!KVx5RUO}$W_hJ;tHMB&TRDrqG8H)#M0L$mKVr_v zZuu@qq#TLjmwXWUrWj$d{%2;&aQX{`JRrL^&Te@AMWti%RS}6oJON(0v=p7*mJR`T z7`ma_oYDCpzAgJImJ{k(*V>`ur9-r~J8A8JT6;Qf?Wk+*sY_1qdz99A<vY|`7@>je zse?glk^{tW_)wAo<)lwO0r`zo3J3!c-T8yLbNQnwrU5nDcT=d*xzxl+MBn1^9|%;c z#zIGJ$Kecn&@`Ee(cxqADv-Emm&;!|=n%%g5nzWd_PR51B`!CateK-<(B+!G{Umo} zsy_}T#{4_{VK~K*NQyOzMuY;o5e8THm@Ay~j59W=4Pz8tq2m8Z;~C?ItPX(hf&u#V z2HFRuUPC)o1hf+~9mWXfm#${h)TU7fDWMpoASFD^hfB9BGl{HR9dwtck4y7xFjYoU z-v&(WGC5w?d_H=_U@BgJ$ngYIyI$=IY=T+I&ipLP8kT(mn^BBKVG34-trZh89lvBJ zm2(R;fQ5)bfrqI^iHDj6j*XwtId?)pgAytJ0|@bsFbH_4y0B@haR{Mf;if$_*$kwf zox!RM^;Atv3t-QY{hqD{j*??#E}C_r!xeRtXeF2xEM1^DM_M`iLf{-dO&87R>eSG* zHIM;d+pK;idUqu9Hml?YfKyx@5KmL$iRzI93KIgVSuE{~q=~UuANF}adcE}Lr<VwD zvd{Tr?~$EEB*`LKrc<e61yna1)CY=<jXP;8ct8jSEQ;*Tyy$>$ME~}h1}CtaLHx9M z0<DOFfFn)`;X}-YRZ;a0)T;V-aYPBIZ=wCwhZkNL)x0UA>I<WqH+QEQb9b66|E>Fz zny_@PRjbU^MQ{nLiN974f2|fhS4{Ox4PizCOcr!N0PkS3%t;I;4?^p?bfm3NIqy<j z%fmMX*0Q1=gV6su1)-ZvkkWgp9e6&7Lf^o!fo3Dr6F{5x82eX(%WXhvqd(ome^5_M z$Fe?0Di{wxn|yiGF9fNQJRCGdv;0<`;{th1q^srbixxr+2@i^mHvpe6-N%&S4~Ah& zXT7`LqaeRtZnF#d3^`Nm6S;)WZGzmTj3agR)VUhWyZ|-}3-t8dBEi$i)`-^Mw28nz zvc^N-vEz;R=TyX?(}BX25JqmbNy5hjBd-D)A*|qhtcgVaY7}syr1pvaAS<j~C5hoE zf=@s>mc&q-g@iB99SvzGlWNo2a~~pUi`3kz!KbNYXkjk0w09CR$+uwKzrAYn<H18R z=ul4p&N@E&3E$|$Spr!>^r2}#bbL&N!q~{REg#zX{;hXCk*1%lsAwoxMsIDi*%%v< z0!o^jQ<W#&9|j{zP1zKn$d1jF5nk(s>Ur5_+(ot50~n*KQ^(k<)lK*iDz_(X>bKIV zkTV<=`6=kg$YnrBYrHqb`4;2#Z>(!syGFsScq1>OrkSQ`I{crap`IQNj5(_gK+bUJ zT>f>;{x)QZHLEwUq$219jwbo7?B$|3b5$6=XxRC~D3G>2!<VnJQ^B$^x-p6EMvTIo zw3QPDA&D;|@1B5NM3UJ(gRxk0y7tL}<qV4xf~eik*7XN&YhWkD5Kb(Xmr>PEkZ>JF z#T`APQf3^=iG|W(FF~CvG?LNoXGG5IzwG1iFS7?QrEt-~R@<MUE^W3G(HzWI2AL~d z^~jbHu4xuU5AVuK(N4}mLh$a$GrHNL;tTA%O#OzbN@G@ZOKD{5F3bw7%}f9b`#QB< z+p-avR$QJBd!(JXMHg#dH+QAfBejPnk;W2|4a)qOVyMiywJ{wB{v@S)Je8E$IL^(n zQwk1L^OkPqAlvyednRh=VhH0RtKKM*7+TWaN+Yj3%iY`<IBKz4pLJhFl7+-BP#buu zndKPf*?YC8Eht34?A>rL<QEIKTQVKPoE~c}BD88R>nF3PpW?w=-_zg?)bHBQwd7#0 zx|uCnr!0!y{+6iJ#lM>|aYv@-sW1j_YfYm6i^)2Omr$F<i2hWQ`)9iRGE))#Id`kg zyYfcw2=kuL%zKlIA~~&BnfPyedlL^hx!QY;$*+@x(iY&u;S{wlz}5gwwzL8hCq2T! z738kaJ)xd=V$%C=bkc3dH~Oacs2@k^#wx4O=pp_4`D4@5kFT&2EhoTAzgs83(qgZE z0+IzVJ228Q{arl)2ppy(o6dbJOn&Pz$j-j-DFm={Fq1esz@LpW_sJoqUG7@^!x*a) z4*}u8trmDpRIJ1^qF+f;UW}e0uzhE_`!<ZG9Uj&<hM%vx=T=JhdZUvZlCM;|<Pf1G zz4nZJfYJ9>^X}Q}zHTggt(1<|xi{65Q15TsCt9>te!DKya!UnV&pnEeg3@@Nhyu_X zSBw@={}2)*uvi@A+a5<BT*+a+jd<HMwf)cv#VegW>GDtR<VmkR!PMMRw&&20KB6)3 z_bE%+UZhN)dy8j3>fQ3zl>1*Reh;E*o_#+pFhcICuXp0aYAI}&^8{ZmzK$hxJvU6x zQqPO-o)UM4H$VS6JO({ay`fyC0G)xEKk8bQiXr;Cr((qC!{S#=z6`<cB9WKwD?Nw; zGl@bTV2}U)eiNlYNr;({h2ox|*~R`C&8vk&Cqcm(jQvhQZ#(hCOzDBGk{c2qI@DM_ z4~>OJ7lYY_8M6hNynOl0sl_djnM9Kf6+~tS6wRGDuVM)kBNg(L>PW;Jp#z>iWmK|^ zg|Sc_DGlFNKi>Ps7PqK`ES93wGnpe+N{JO!=(GqfY-yznP*3h#WGePweje$|p-8Oz z@|YfvXX5?v!WagrW%XhNlP}`wVGk+uGe{GNf6JKS>RV1n9ZNc?E^b+D?o_H9W83w0 zQ!kT7x2xz)H|QrOGZC)M)kmE4dq+IEZR<D$CzYMFFn~k>?&o<dOhE|HYhm(aQJq9@ zI+d8qCh{f~AeInUcsA{Av4X)Ah!jH~;t9)=HfCM9)j1M~N@+dAZohcy%=t6kSWU#J z+6hBgnw>o#DanFj7Gf!23>v~JtievP*O(C>{z<GL%90DD9ZhWhnmWKPdsVe3OKh_9 z@f>NLjL<cOXYB*X!$c_ivvaAG4KF@w5wyle?}1~~W!%fbDz)u5@}gb|Z@j<xjSQtI zK4x+5gtJI6OZVE7l{q*cqyRdy&f?!$CL_Otoq*v*g~9ngcb));Y*%NBohn_s|GG_X zR}Gwn?c+gy1v*P2*GYVi_l4Yl?~orJz?Dy%0J+K=4ohghc|Q0=9H^-?dM~eGxZAl% z+=C${S&0Kb?`KCj2H7}V^9%h?wD?J3Vxd$yzzpYV@6SvQ3;+u>J)H=)n(K`Dlvk($ z2YSs|^bq&advvjswjz!jeIK1!I6r3;nqyGB7rhvi#u{KL!aZ@ZWY|LR5`S=sZ`ET+ zI(63#!A!6q<g9NW(Fk@^q+?k52bAnaCRexfD}{2AI4E~;*O$AKm?+Xb=$9v`qX)^} zs>mvvEXoRAv27S2Ya>Jcfwvq}FI5D32T;6pxGs9ZU(?Ce$WM_#R^^YW+s0S51g?*Z zWLkY!L<zNh0SL5G{`G)?@d%04l9D4Fkm6$Rsi;zYhuN&QJa0QTE84`=uQttvX_633 zPyhG|bmnmLE?439)BX0j+@~CqwHlY3n(DvfT(0;lxUlKzFRU>2E&P?0Za??$q|~f7 zvC39|d8Ms>DEeF5;&)zWi!;#|HPOF#qZ4hV+fVe{-{ce5-{h%D{=2@(1;uSTe|?3? zZ)Idxnf-Tkn@_H?&F@`lo6ElSZ*8MX47nOCXQQK&nV$Zw73R7HqFCv7YokAT{f(ZQ z=KmTtx=rWTSD5_PjqYY2GRS`PS5%H^K_r<*24V#4cxP?TDqHo{m9{GU*2Lna)MiEh zb366&=kxq&5_TgMBwm-47}L{#s391|m2b8vObTVTO`!AyizSvJ)4c*gdWugrC)d~x zWl?{*nE~n!BRYB#OKCiT&8W<*@iJ+%WRYj~-uUo9nd1^=MAcm7ai>IVqf&t{o4l-) zYR2$8J*ibOQ^H>6ly`+3y>E2cQm12OCd&(B*qR$59I_&@ryRF@@Ojw&$;<NDNM$8J zCJ;uI?ZXoO!zlj{jL<8I3=(Ia{Vrd@^>ezJsf7G<u)$bCh=IvOgah?Vlj2BrYu-pA zoo){P(=<sacq{jhY#kYIDOXvVg~3}~N((R;<O<D<`HXih^^T1s74drV6J|@%6QrxN zU<NUS`>i&c6m+7go1Xp?ZBgUK2F0;7N5hSaWmv|QPS@+9A8|TZ#5WQskkjle8xtvj zS=TlB_AY-&Gl6%MI9sJX4r*Ry=9KMcsFytHGVhTx5l87@n(69Kb}%P%>&geTSizhJ zMR(<I!tv~G9(P=%{kX-3Sw3kXiyg!wa~?X0*`GyRwxKHsvw1c!c*_D^!5LQRsgRV& z(=yI4$t=y1w%*Q=$@G}FP-F9i;pycpT;-y#30ai5Plk*9C*boLmi7|LcrIrBV^)b| z8|L$|#KKl96C8$Rs(W4{M>1NPtP;tCvOFQ8L@HES;<zQ<-->F!LaGQnD!hShDlmY| z%)gWQSOGk)MZ)*W+_NVU=-5=`0nsjmM1hdpO;M<u%4R@i*o88@@vDJ`kDTH;uKcnx zUA0HUBpw1LN4UhhE$J1>sX^KNC*o3z#I12e-=)jn(}-MF?C2Fe$g1rd>wyi)pe(2N zfJP<+)Iq{H{i|h_-U1U%uiV&ntNpt+gNg?fglHTlq+;Mk0PJH^6Ho0zgU&OXbou4l z20V-Hr%sdhLJ<4$AUR71<fG4K@Ge9Cy{sFcQxhe1#8%g`wZ)eh@uC;C&`v5)f$jd# zyVU+qTAyMUUD4FH$F+oh!GGXc@AA1Zvz3~nyJt#fHd2st>}RP=kt36d^<;dMD_by_ zh#ryxdA{p(j|*<DV9>I)UsNnwVgjnXEcdV2Q=hQlcj<drtliE>RI*C%@5OpBwJyOs z+3V)Eo!CZ3y(MgskxPwhb0Q8bFKLDRK@XM1pyNaFY4r<)<+ueeS-1o$UWzT@5dcZ! zVE)>wT(UqjG!6AxCoI`tY+|0QLMRlBfWi|YA-w>q3?l2Xv|&YJq!Sm-m`04!<jj2O z{rAPgF5UP3(n96*d>IMsW@iRrMN&2os;H#{+uSUU%^s~@T9})3bNG%mj@5<hR3cL$ zE`Oq;7rJp?G-e9@4L-)uqK!dBqu@IGK5baDi5Ngch^SDaL1K<I35#6eU{)uSx<Dt6 z@S)y$w!ps4o$V+0RM%N{?r}oJO{1LSO5_}&sM=JRF&BnGw($5EfF_Q!NtB*cyUeFR z!Dgg&>ji9;Y>X*P4UY;MKC8=j=<>a~C|b79_1ait{$LXpsiZOB{q_CFwLv}M9yCMM zwSdUo>YV$!@`xr(*w=wnIlVTcjHWl*pL9oEM~aVSVV0`|pXVfFYM9K}%%>oW-i=8+ zYWZ9-gg=o4B@nP~O63{{W4W%UV2itj5Q`&F&0P5c2GdQHr&l+|^sOjYqgp*#d;UzD zcOWy)@B*#XK^0kbWy^_#$R-E2Tq2XbC1;llN!$Uw<9tDEg~ysKniFWEhO>_2BQwWl zOL#<<E?%mY9{u3<)ab&3wY4EWU<UAER+M=U$FkD)u^n4>WMPGsg!oCyZrz35F%35X zq7|xqkSZU_RvEm}OD>7k&ONbDdeX=kJrW&QdI)24j3gK5cJ2^HSlIb+wz3tP{Q%8A z+NNadNSL}C8_A9xnw<x-mEP1?c)4jXJ08qdx58+4JglZ4$(FsjrXOx;n(D$PnM#-w zEMqUA1r~M48W3`$e16vH=SA1V)RpaK?}AoQa4VOuEc+N$9B4f>LR=^3?+h_67>l1= z7OG(?fJGpu11KPJo`gP>3-9yvOmN(oynLa&Y|2zeLKwfDI%IL?w8_gOZc-l;xgjQg zSG?OFTii8<Gtc7Ot}SHuTi7)|l4wpDzfHt8xic{x&aBvIC*_Qvg(JX9SLSc7`nmE5 z)(CWk<hPnUdztVsk#x@#YF?~VQ_XK-CaP@lsA%OIVSWq3O*UJCO9m_n;RQCN11HZD zPHn3!2aIOX05yGjF`=&#pE}T)`O}|<{7)c~h~v4C-YDQcOb||?aHTp0t4Haia-^4I zRIyn?JnfdNHmsEOV%GGvBxBNo(w)i6B8SpzW^x$i`A(!49%7rIg=u?s=h(zkle@QV z+s5J~=yosYb`ZX&8Rr_hb<9a4FT~P}M~m@}dr}CL-;R#Wd7=%1KAXg8als5H0ycNz zGzkizc12NG<aCJ^+LPwd7y0UxS`(i}wAdDzDcWJA3#wW_`WrYpbuf|I$=>>tJXxWk zf5cY{sfL;cgxq}Y?20YP$lCFaWd^43gCdp=PC>kxcXVBZOk3W=9H*Dmu1QZEgVz)R zks)G2p`(@|L&9{5lJkLVZN*}e@z;3Xyo7^<W0*aCgjj!YZ17d75jSPN&lb$I9LPoy zog#it5LOY3Zxbih=EFvwR9gaibX`XzW>_k=tFc)iP#}Xlk1@XDyIG6=eDDgaJ+c|= zC=vpz#qvs~galgCb*#4^abv*h#Li(#S>>C@UW~uJ5JsJE-nem*;JT+}k=x27zZM$) z61j5}dUv^txE>GWA^dRG+vQ@3h<Pi+_Wi)1ti|F|<(vym>hb~cK0(0<rHad+Is4^# zpAE9yZO(q(^M&Z7Is0{opk3Xsb_Zua3)ofrTA1TiqjmWZQBLN1TwEZ~M1KWh5`cho zbS6AD_#1G|SSm`SE91>m#uKP$(9*@%vNizVn82~*GQ5=|ngHMI0%2_Mqss^kk}fnl zBO<*u@_HfqS?0QtR~^we+2ze%o-U$zV@QojTOJQcZs;A20edW&fmvmA9&hWL<nn0k zrG{l~1`Fa_$YFLd$nPc`KNb7NTs&_*oN;V5B&PRTPJ~WH<ryx4`5%$@!|CGL68i#% z-iZQEvw~Kl3-Q1s>;)45@T?oQtAp%FSUY<27=WYa4)3)Yd4--h!}>qaNV^d)&PDNQ z7lX)gut>DQRHlJF!Q8p&=^xY}jpKni+{7<3+9vkU70iq(KvHKgqMr3Tpq+s;ZCTUl z>BYI}=^qOxt%V(R1u~F3z!e=hrN7jy#R)cYjXaUyPBwC<%I!g^taMcZ>xopWEpXfw zX+KWh1D?4R05x5Al(HGn^!{Y3!4?c<CEB-l^Yf|}HL;&twMCT(5KObGflcyT+0I2- z#gt~+GNECO`vw676$lVmCdcFZ94wPZ9040-^V&W0J8Z51a$K4b1JuO81HvPNwYZVc zSw0*Bgxd*;?Bpt^Z@tsbw$jr}MCBAsW3I<@i2&vl>E`e|Idf_@f^@6kyF+alQD@MG z6DKGRpm_ozyvJS@gI5=*AWFaqOkwCQ=ND)P`<IR>yVbgN)Oqpo0h&+UjC*Ygh6G_* zk7bUCoITVFEoZ<09T>N%V6>)(QZ!o8P^wx=D*cr@&0cZsVu5RF*66$ogk-}`s!xxh zy~Io%gqJosnK9p)mlda$Ku#*O&3Zmp85`NLJ<aBFkOVWQ_8uh8y@6U$NCt0x;QL0O zdgc0SWt)&{BuMnr+KdKW26Fhv=K-S4gqrWbo1L3yQJ2_{h^7#-{I94cft%GF@uu-B zbAd6h_8<<$hs=biBt{2rK7?l(cHPV5M_BIRw}?L|dFL+vOuchAQNUjM9I?L$p@Q1; z7~wVvNnR$4LS?>QB%Een<&}EzYG1uiG|RbX_*_5tOgVpbO}%)HXkjOa6Q&w3?X34* z?I*Ff0&glG-T;xn2!irPZn?j{hWGo)nU^p3yx|13y-UAQFZ2^J465KyIZ10R+7~kZ z<pJ>erx@Enb%>t-Nx8U~EB7uBmh<(#(*>;5x2d-3y86KUda}t8R)vr(JSq2)na)2e zui4Zw+)?hw^=0r@qqP<{xiTt|{l=aT5KV1BCYM$lGqdzD!o2j>2NVGf553&-z^emB zQ|zX%!`4^a5|-D}*SoETL26i=so`^0!`e{8+E>@cR0(<VI-_q|p2M%%+r4VHdW+5K znrpyt#?+%ZulEz`-R2z++}?VRWzAbV^B@pEY~JgUG&8teMyH%jx1CyONH|?MO7V^2 zjpr~63Dv2HW3=q-C9$c2LYzPIp^qaWyCk;TN*^}3W{llT<x=Sa0?z7EsF4F31G*G= z3czE=!n+v!nvs)Z?6G*$;7Ou^RAtVKcP<T388f2*GD$FR0MyNe8c$D6==!?@v`WcO zx+SlI$U?`_&7&5oy9v4y0Q8iCplkKc9GfdkWf-e4q&pOmX(LJ+utwc@KjdJnEZ7BT z5lS0BA9nzf5cr>#h6p+nNOSl3GiS5i3&5LnxY7+<L}l3s$lL)uki>(CzY{HOy4FQD z8oh=k*GeRg*=}+Wf|!YfqTZrGwd(yFsyZ1KXhpuwM|{)mP>YjFy7};0aYkLKmidsb zNZT3KYKo3&FQsslcll;!ZQ3;e6VfO`tCcpphFG#l<*Lf?on|q#ab!*c+R9G0;Fy=m zi|DsW8+Uf-3ZJh-=D$w0Xd*Jy$-YG|7)nKH9}~AiyG$y*BR_U(I40xJVkw*k{Dt;M zydqv<m^wRJ5Thsr84}V!Lq!YjrZ5aD+_cBK&I5niBj2F<p4MhtTHNNo-Zr~*_ENJj z+Vu~NovLCRz{J*PY;<%qv>czO&B%@<s?rR!5tgeM7`@GF!82f`*S5BQ@A$$Ja!WJM zsmz{&gCfM@tfXn?rQOodBipt=F!#WNEzdW{-M#UucFb+v@jy#OOiEU6Yg>P8<fx>G zmCA@VhMQKRJ)t0G|BmdnErV-+vQITpZ)Ns@E`a`EQqj^qCh_@}hnt~d5ikPDFg!3q zwS4LXQ6oI>JG!lPowsglzZ}&iNo`5^(C(!Nx9xan+m44n*wO(ejnFlz!{Wl(X3E{v zJZk#%<KWKDl$RF|ud_#+2lfIFUdpb_=ERYu-F9u+sxRnCOC2|{b=z&*7wqBv4?NgX zvG3E3ZROT&{DM7ds@3n`%#vh2Y!=n9;@)HYE&DDTmvZmKzWqDpI!Lr1poao<8cjg( zx1b$*uvx2ts;Q|HH?@;nck!xyx{R=AA@=QB3FM$AOc$$LsOtnAE+?be-aHy~aZRIH z@i?t`lvW);+evMwa?5lhUi$FRg7gX%c|tMxY$3jb)&-D2Lkfd!laHIyO}LQvG0z&m zX807t94uvGLygdeAwWc|%q3z~&y+8mIt{wV;ENL-O6r^&&*%};STthXFj77D+KU#{ z&e2_7&*d8BiwCWrm3Ep`+zXS4yHsZNMKc%T-V;}c;2#UAd>XNbsZe_iNk^m6Z3#k{ zI=EM9jXP?&7Z*J*%by87=^5KQF*UJ&+@j3A*;z90y*E2wt`*$Ls151w);-Tn?m0ZQ z@6f@WrSXj^OAHG;ca4goW!Ti{7r8VF=y0M_X9;(qAU8In(XIMcJg^I1XMyTIt!Ktf zBNq13%guVWPnT=Dd`K51h>8w#86PqeVBF9|dO0y>kEdN5#h6ZQ^c(m+;;5@ee;U9y z`k<rYZ;CP9+~_fys#0;mVk{zF!J$EyVCtvUgXeT<vO_DzRLPgc+8?C19nU(!q2i$G z-(cq*h!Jz#DaWR+lAS6z-g^Ei_4nPmO?F4>Zu`3tJ&|);Ti;?J8aFrIiQOOnG1x+R zGUa|dqko}E(sKm<d}Rf?r=oihP)=cCcc?kJ>{m3s=QS>c1tbua$d_3c#VNX==a+Q( zf{Mw=Ci+2rG?Uk>y8F1E{SUhP`?~xCU4Bj%3uOBx-Tk62mIdr9y89JfzN*)LLwEnw zKI-z@x=2G4{WIPDuewN@=3>5EB;5Z^AHS}PHVtCT0~60p?>jhU;ejkLVe}{Z_EV}w zK~N$^<cR)4m%r5IuXXtwUH)HP{<AJpgGB@u=!kN<bm@}UrCXPRE<L&wb?McmPZ!e* z4(aZTYE4=(7u#2AmS}@6x9jp=UGCK7E?q`+*{qA5g$KE73?PG4E}mK9-pK7lRq4VB zH6gXRa!Rm$i0P^P5I25r<@(q5-_mz$@z&yC-yMDHi}x1$iti~7@UOqGtC;V5x>zU{ zhc*(5@x4RuRa9P{-I~w!ciS!;>3d-C>EiwU?-|@!94_|Tzum<yf9F0I`Zg4MioN#l z)?#1ZINx^_yNg}@g}&kbqJ82?--cOw6@I$>U8TfLlB@iAm;X0c?s~2GJo$g~9nULp zdp_DmF>f$6aZK2Jwh9x2I5G*Nzbp}_&5~jb5?NHbGEt6%9YYivY^C75%s|)czGhir z`_W%@OTVVX@KW>Ke9ltZcOu!9#J-E%x}DLdD2`n34y}_qX9s}ipXWYam7qGXFP|j% zTC92<oLV|Pw-_?jqMG=O>i98TKC6qJIy+O3sD<_mu67?&tvVCMu6*a)nqp-fs5wp4 z1WxFfJV;POH|3=OXF0Qg=tfZ!5ZpTPOZ%z2n|k7@i<91&?Hh`l>3mssaNRz$V5Bwy zIt4e6maxGFEiHERah<*I);zB^t<Puzij?mFUYbqs;2!n;?M|*bv-|p!dmqJC+P~!< zM4pA$I-l>hom^n^6r<aCp*ChD!i1Y&$OhvRnd8MdOrozp#cK4rQ;eA*N%^#6yAN8c zQ+sRcKC)=*XA&J-Tv9^W9#*#;5YNti^!oJ{;HW0aB-VZbFku)vxOBkwiJWRq;de8Y zv6T$=y^5MEQMJ<Q&Pzp=|9GcYzoU!0OMSBT(=igS>8YiD45z}SSQjpNUY+5@$i87+ z+zFFa%C}h<uV>|>X2@uj^QJjEqy`Gy=)Cp!v_Ek-y(vWc%zTah+rBX1Alcj8Mc^C) zE?cwG43^@t-I602-7&OxTIDM~O54~d=Da7H^SrocA;pV*ObltS`|9zfrMFi@NG}u2 zkx~rSi0XDx-E3@of#wP&OH7u;&B5jb@V-S371$(AQh?wp72kJnqZ8gI#jq?W6D%+W zj==519=hCqUZx-kn2VAtV%eI3M{*PHHTAB=Z+BH%ES9AG_^Ahxwij7l{S}ll?D85n z+4Czyc2a3t-WCDKOM@-~kj^k#ko)p3MeIktZA5XNl&w`XG3ERlU1$f^P_EzEM3lR$ z0~{taIvZs_GgwyE7c?E*uPu}NWqQc2>+F~n4_aW3+5?NqgyhC(;$KG0{_}Hb-asXT zssyw3Rt!F1odrj$<wx$RjMRDqi@bMyy#p&o(+i|Gx@{&che3nTj3ANybBm2Zi<@yk zALXGDeUqXoXa7IvNEniEWR7Xn3_b}eq!5I+v|3~J9yJw4dnCM|<11G|hb=^PEB(1> zX;~?l`SOq-cEBJj0IzSO7J)7j=%NEA4ipv$^VqDM&Q<P3+a{1^mMJ_p@TN7G?~;~A z>uk@+5gtHZ9KfRxeNZU>Q7#q@kl2f2=%Wwl>0O$in*)j8sUgP*aub8Bt&0cvP60-( z^2-4*5+SocOYMn1(NASRmo&DV%PTb3^WEja@9sEGATF?F@AHN7+H$en3*PLpr+wu$ zP=m#}-g19=;5Ez`p6@e!x(3uX6bXgQyvVV-InXIJ#0<V|1{I{z0tGAFDY8XNK<TYT z(`jJS3X2)!xQkn3pb~_dIDJhLk6i+P6T(PK9Rs9gFX~ggA^&V_<kayI;v^Y;WqX&7 zBn<lG<<V2eapgp1W49BF<wNK@_VLW?zf_k8IGMT-GLs-x!e@@P=}4|$d+FliJ4SIy z1=w0^W0xL({DJXNXNfw2i1@66fL<VOH^#6__^zQ-!YV-~XS{;#z<KkLQE!P`Xy#>t zAsSFTPY%GO<^kug#i|ZIX^l*X;Xx4MwJ@h%E^=Y%Jb}0I&2hGF_NH<cff|CBUSda8 z68S$PO&$yYy^w0eY`RewpuL){;L15NJ!0yPk-L2aQO&0CjL--{xLm-oRS=JFLOq|n z+~l*n0#Xi(WiA*vrrHs75DRBgrHdLF4`|swr)<J+;BCemDhRmMNu+KHjrykiMyutf z?>@LUL&F7R_H!J-CS;Z?cMx3fj%w$8*D^*}Af0>_1B5HOE2L0c52)>KP+JjGnU_6k z>zyabSanT|+G3;z=*$~J>o<fZ^?k?mfT6NMyRO9y5adQ;v8w>zb=UO$dh)Pvx12-$ zkI@59hHnJz`LVwhw0Da`djd*EO*d}Yy=U*lNA^!mfBT;Ac=phd-P4oLOdL7tfcd{w zDZzOM@!R3PHps3~jQ41x+oIq%2I2>H$fI8eH#Yi`qvhRxqMd5#NnIZ2(jGs4R#04m z1mQ<zvJ+;Eaij~Xq-R+3@to+#Lw>HVhbs&8i6!ia>W29|K2$tLv53Np;Lks==VA(I zo-kLZyDR%Wp2Yehl<dackCKLG=k<L#x2fe@YUCZR1>xJpS5(gMbdR+oJe>nie~zs} zT;+L^09|X>{#VoOQ!d^1?<Z|1-*A^|x7zF9$L1yA`7TFunGltn_F4<K33lo330-Vs z*h(4FH+tYh`r<91|DV^2noTCFc1P!Zop*MwC&<;N&U-C%d~IF4f`J$aY&|U|5)lzi z>0^!s5y!jUi94GQeAS)W`z8r|OkLJ6V!O(#)X}={RQ6Y5>cQ>1T7TRt>3&0p*hEH1 zPx9AT&N^Mfz1SH`Z)xvO>}xVKkvJ2}FW*k7I!T|fE=q}6jG=67G}C)SBfb(tRsXa4 zs=4XN*Y1q_*}f=->n33BZ_9K(Ocjw$k|^ZJ*iW0dhcs~$x~#&Ds`uZmuJm(L9LnRa zICx9nV1M^4pTiG?k^NL|nkN-YKeNEJWC<%rNX)eGqL5A}aC8^G6*!WHY++7<HZNzB z%3`Nc16BhJhLfHv7`7p2lP<~k))}b8m56>YqigGiYu!-^TS^BHO<9fUvd(8(nVGzs zUMpvuII>M<nZ~h^$pgCyW1q#!vuAMFKCrtqd8WJri$9dK=6J><h5k<cNf>DB>)0fQ z)8rNRHUKd5X2B%cWE*zTX<{<Ats<MXew9bKBxetp)pgBTqZw+Iw}eNI-SV`b?>6M< zWItU8Yk5UNOfhG%$VUt8L_UH%jeZxr!O<d7Ks@o;74~R7yV|(FqfO`-jA6^~R@>Ax zuh+v4Pg09PO7)(g)P@%btHLLsbhO2IB?YTqjekO+QAhz&gPc$447~-Q*+{_A9pad7 zYaUPlmTyy}q&4_z+*q-%MWhrsr!5prb57-=@kR&$;F$8|-g2SblaVy`MO542y&K~0 zmk=*ndN@w!{+M%s##@0}Z9OO++`ZL<@>Whr%s+Wu<-v?Gwj_ymMAGPKUNol@+9Mn> zimwX?qE1Kmc%i*!$9BKB&P~Xp_PhL#wMuL!NfyKYj-mf`#GLcIwaWhfD0B~)R0QgL zhtWNIJ>9^bhwgDFArIX{Nq0iHcAF%DNYVBT$xfg!I0?nnNoYq>yoEFI?==DLn2U@^ zpNe=IQm4YSi*G~Ls^$4tYSCn^MU<pn8NBv(4#pyN&s=2d*tVa5ql`|OO_sc)6NVjQ zJLjT^a0-jJ5p%m4@e)Bq1wm$D)i|6KC%{6Aums?@OuVNmhP4bc23B<&EaRm7cn(PR zg(oF(S}Ta&n(XVvlG@v3trl)w#`MtLiK_)$+Ly7NpDTUwfNxRBg0WPbyzCj($9G^Y z+8PHKyA)Ro5)p5bN!_zc=Lt$-QWE>t25FZmFmjB$eI7`!8&||2+XD`#$F_q);l7{P zCt@{YZ|P||z)3JYbaEC=m&`!}osbe6Bt6yu6SH1bd3H&0aF9&U2aGKoF=4IyDfBj! zNgXB9kNG6YHa@B(J#vJd8A1*<plajKZXj`07R$#b%L#oFpNH(&lF7sBgcS`l?!+Fk zx=qHbW?r4@H3llIi=skH=V=33RqXFWe<XWrY-D0;lK)RnOiVrf^hC;@L`ActPAK`D zm2{-e*bAeX=St;uc{CZr=uR?$eefloj>fa3N6AZScJ!s?#MY#J!_TRU>4t;+BBdK> zs<kv`ayGnIScM%j7IYhpP%XhUYgJ>W&FP7C%a74c`wph&uytnKAluB$jZ92vc(Zfv zbL;GmqYi=_-vg=fg*UFd-XyOhd3cx@WO|u*TQ@+<I`|C`p10iq4{a&k@E$PUH-pE8 z!wru=#Z5x$Uc(C+1cz$Gu6dz4w8uv9IuvL!p@IdNB3%;S7CpYN-5azK_Yh?}wN36p z3lyefd@s?fO#>>dkZ3>~{b`ud7|6__N#IR2Z90gUf|wMwxtmLS3Zf5U&&8GriqiG) z<h2dSS#3ioOAj6NrJ~B~x#hfcrnu~MlcQKfG55E2kjc1E?>^lbeOXVIdvN0^;(XJ~ zC!B6BewW;Uj94g$ytcQHiIM7UJ1HoN%WLXu_}jlcQ17n~obHMa*L$ya%Z&&167D4s zCw;^rKYY03+~H?C>P5-zk*kUPU{zG(3H4}D_0|W=U608n1;-rz=IVn+s`Oav9rFlW z0;z&(8V=JXz-|;{@X_c?El{r$hlI(E{)1ll0bMMz&)vF9=$TaVYiA!ORWbgZ60JsG z)O~@qRPt)o*jSrhW<A{-FJhysGJS?iG~4K+P@~7=yu=tIQ9EzY(vH!Q4g_OGLIz26 zCeyA$ZiLT@H;!tFr!wc_GajR<MNg4UPAc^F)YRI@e-=omO^{B#8PZ7<m3}IZa>?)% z1IAN`lMqia2v^bPcnWkgmKNmsf@xlQ(7ddTcJTVlFbx?zaY}13w>G1KTGFi&5E6xm z`76V7#PmfF+2ejx^#X$3-nZROs;6;01)<8E1m9&4l}*7ZDIfwl<s|>0$)KEQTZ79# zx>Qctp;t;{*uBSLENv*BTrxjHN2N41r(SzsiFA`huvdx&*B4J`Z4p`XerCntZ`{RC zR8LxLz`0mO;j;^9>O>kW8cnbR{AHc-mHI-Df#gs(px<$Nka1;$XsXGD1hD*vXfe=c zD?0<kgVW?lH?<v{FgIhyQHwH)cbOrYIw=|tn$x005eX!jTI-hTB=%!@&O~C%3FV6P zXA#R)h~H#&9I1Tf)QOW8xX!ZRO3q_7xfxb8%E`;eSQ=lUTfcN5N|r@#tusz%?{<?j zqnA006YbF{^i*d5CI2OcB#l+l6K5JG6}D2DqzEa3nvh=mgbS<+Stn9fD`Jgm|M|Ew zp(^bGPl~$<4<-Hl$dxo5V+4-DMVqm9f**(@hFkN+B%My35vzK_oVj3C0Fq)Gv>~8= zWRws`HsPb4LMF@GjLfnoW)$rE%)T^7t5jzp6w7569g}0?-y9(o1I}Yipj4xA#WW&) zT<nJz)PCxKTOX@%p91Q@eXvN@59dJ^POD<s&}o@Q)0|?8I_;k8v${djzLANEi4k{} zM#>Wrac!J~9v&PnA+xvVAdNTV5iO}(VR<U0(Fuv?%DP0l%yH3a7_E%Db)O286jRsD zQ=}<P@q=uK7NJS-Sz<rid8m}gEl4bZ%-#rY*4h-Y@AOt`Go56`olH25{g=^Cra#6y z%k;C8a~Io{syuq^R8=<o3ujNx9Gk;PH$5Aiwuz&Y`}Ps(id{~qu1B{%@bJUpp3v;# z4n=4QydLosWS5><m^p7x=Bl%?g}C~rT%W!XX}@o>A)jA{Ac&PqXO1l`a2_n^LS+_1 z@G76mr)IdN-y~()Qfh8netdS$HAMD+dH{otnYV>+4GZrb74|r3Ys$YyS*vZ!q!E&N z6D3-K*gYlf2o9;A1SQr!*BXwEY$w{;Lk~alfk!`xNSK{rPaO>5%dI?3=xjR^uoYD0 z`(Q{8#??DDk;7TpwA}`6pBy{X;mh7sQta^Z=F&;z63)$1m>}L?(uw<M)N!BeD}Q9R zCT>>o`=v|@Ps(ZAX<yzyx;5ozmTH->!Jr0Hz=ONTgu?(&hGLx5fKb)ijj}T!Ubls` zIdkfwj&@kxN;0XgI^T<teII>p|K#oiDegAavi6Io2dHeNouf^cpbv5mg&JlnuT0aQ z^K<c_&3nLhqrDUG;Nzq*bv-<2l$;T_duL5*2DPNW`t9Pk@>|fNSx)Emj%aTg;l5E} zW&<r3{3|%cle8|E`VK4F*NXL=|4!1*jE0@E3&tt+pmle8@8aT+mC_UFbn!_z+;^Xr zk!UaO{e{!m>|;>Y<I=(LbdCEy`WfhZjLQ}aGAo<zC($!+MZZZ>X#1p+Rj7We6T2Pg z|Fx!m7%IbgOs|6{K@VS+(?9jh_uSfXx(5gMuUeZ*EcaDw$K9!JcSlLRVV@o?uR(v$ zCvVa=y!cG@7WbKctNihDe|6*4TlMT(r<G+K$8*LT4lmwb9*Ey>{*E`+^ZsYb;#-DE z66g%&hA*wBzD;^Y7=w=Kjo2yNft|u_=G_0A&Qig`Q*HG22{N-?d(a$Yg0>Py!dCi0 zt+wRT^^TX;EB)Z>%t6GeDOvV8Y$bR%36S#L6pXHNA%#<an#OW`$0dFJJzPE}mP1YC zJ8A}e0`Hh4YI^Jhp@TrOyWY7zMF+(nndNQh%CV#?2{%`J-sit^1PH12pjV7O2I`3j zE<wvW6N@-Mm5Wk4j)~#%l7Qe=U(ld7^a5DbMVn74v-U>!(xF=S3-?rBy1&+QPenKP z)q3^E-R53AHh#Nf@x`$?7GKUqjRElylTam<LrD9a-9&GA)))xXsJ?FWhL4gBTs#`v z;zs|sV=7NA%AirqC4ZxbHBC+Sin3*I^v+bgxV*7(daeRApF2XL!HY+Pm#s66Vl;Qu zq`i*w{XVPT6>Z3u=`3#C=JAA>|MMEsVKsJy3!LhyMX{?F8{J0pM<3N!S~D+`;E%1K zE#4P+`6Vsh6gSem=dlaWudF`g4bqQ3uaCr7Vp+w$x-0e{M8=h^WFfbmx7MQ!$nnPd zTn^@T$bJ>P1Qo%6&|=t`i6JG8CQ^;v43M*iE?n2EoDi8~DC}2dOo5(E!GU#;qz3i; z)x0cvc$UA~eT~GOO2z4oI|`hu=Ud*$At%X|J3k<K1u_Vv6f%h|F82tA&G#b5C|3LG z#d_fia*&H9YAyl|zu;@_IbGo1zklv~pC#l6GL>Atdz1RShLXQt?lLJ$KVds^bwSc^ zrr!Og|8@X4b0^R<e>%^dMui+phAVYi_;hFGcK5E8a^tb*(Vg}_VMhqm(mWSdi<7=+ z9%ShMy-e)hDLaPagORpQli_Hi3s=iV_laof{8_hg%-Te|C;EskFX%F*%TZmlfyVpX zKKrn$yG9Gn{{8`d|FkY9SFr;kOkIhd;bCJCqt&Ggd*W!0?c^putj#Cwb_bhD+i!?X z){lA0P)>3bNl_Gnc_Yu{Ca1*fdj3#no{c$_s}0)r3i6W-m<x!uO7)ip)2P<sGj(Bf zh8v&$IUvq*=FM<zQT{%!DN`(3Hhv3;!(PU5#Xf`R^tTWYOnz~Q_%r@HLpefpd0URq zAtugn!BPHJB(aj*?h2MG%I!y1zm9UJWN4DAv7h<%Qp|rRJy)$uVJABc8t~^09yLv7 zqtE7jq5|CbHO;BXcx2L?3&;TiD4oPFd7;)zaLaotTkffh*9vw!9-9alz%=i*vs(JP zE{C+>ALbHU2FPZ?Lzfg{&|ANxuE<WMBeo&y0+tl|JMYNRv3?I5tYhPa6vgDoCQ~66 z+gi>Da5;M!>)a|<G8(})bwk^sxQ$)(NZ;mJ?!!;eB<|%=S{yc)pX<JgXjw6Lp6@BI zF|rJz3E@}~Q)DvkA{^_rrxKJEQ)bBn(KwaOe43dtBC?Hej8P+2@W!n%v+kk`wh99r z!@9eTgv?`CNhrksw!SJk3(*EiLBW@^OD7gj)zGPt@Y2a$#F<u0hc8u6!iB>SxTF)V zJ#<wn6go9`Q6|4Ge}GfX85BW+=2-u-7jR5o9(&^OV=A#r8+RE|8TG(Ro23s*OR@cP z(JS-=A%snktIp{T`4Yojq=NQMD<dZ#cDM*=aYLLqRljim)|Z}mv3&oF+g>c+mtq0P z7$cJ17aLWtF3rtEyIw3`erS1ot3DHEq<WGEFP5Kh56Ux_{Kpg*vze(mzO!_)T0Oh- z{qINWGJARnQwqW)Tp&8hnfISNkE~2e$M-+*$Oj($;0NDN@T9HfrL8!aZ?(1EDkJQz z#?x#y#$~JLgDP9a3T~YtaIR$x-kJzSZ200DV@@X??t#nOw>-2wHhG{vxx2pmiAg>_ zxI8}g++_W^{q_A%Jm){}d#=9kqxFwIvCn<>^8%?fvGw_v?1*JlFaci54mAxeQ2+q@ zs(B)AeX`zJ*-|C0X1SBx(Xc3Qba@30><EN%@1;AdeMJ8<A^&{uH9ZsQ4_h!zw5)Sq zhKL@R9|ZE^+^2t57tnJf{w;BR9|s<v`|@){1hsZM=hxEm7X@Lb`>L=pS32{6NEjF~ zAlB+)vAV9@E!L$<Y9?bvHkg_424h8r%|Q4TF(=a-%e_G6zS_@Dv9sB4KAar_E-BK; z+Y*aR6>v^g;G7Ac7zx&2$6=CK3tDthVPhEYA4e*pwP!DHJw@`|qjPgs&Yvk2Cm^%s zaxsY_JTPm#Ftg}Q4%{JgjIYVbd`G19CBC1!v8}efy@QVJi0j)a-yO5lzUmU-empfS ztEM(-e-PODL^T{#jyrG)3xAHP7g;#CC5gw3iS{j|(2+eplxdnWpE@{xtE0OG3?1El zS$7Rx{#3Z+&vf~7E{z`FwMMs%*ikOe3)MWwg)9Zp98rNxZcBdHZW6~VMU6qf4CNzx zs+ZsnEWUuq@phDVMpai<&2wB@5tnewH-s^^anoV>Vnqt~$>kmbcfGKxQ6+sj>2x4> zyOb!xT!#j23fs`TI$S}ESLOqUB1`Fxv`}|3rE7HVayPoRyoK)*{n{P9cyUv`8|~eY z(Xl<yk%fBCV;$$7K|2Q(YV@EP0)3z6BkMdAy{tLyHRw&us%j*PB%0QAc#fhCrPt^z zyHvb?sKRZ0FaIXN_Ax1^<h!yIhZ9)qrlyrvqkD-^WH%pfidNeNBr+P!3kPD_D|fKg zb7W3*O(14$7d8<yzp1fkGq4ZDO0{kWz0gN&MX$N_w(u-C6wE-p+>V6lbYwT$yY}|J zzpTb=Ic#H}q*-?=zN96(9wnph|1(W7za7PX(ZhoyeFGU<#>hUtZdL6$>cu%&<pcGC zV=}5eN4+Gfy@6<yI%fW1Y$0_$>P0ZJJhyNP=G>7M=gu#g<Be!c6i>kh*f3g#iV;9f z?0ph=?2Uauep^eb%{XK3W9Wm%&Z&1SaeC5DqOVcS_Ga8Qkx1_KfLOPd;HoF-BsGUR zB;s|<wtFA3AizaZX(j6d^H+$(a55bL?jU_hS+`iNA6BQ;VTlP4ce<`rkR&U|da4bf zgE&Z^FJzRV1%W#$0_o_7_Y+ucWMqYx5I?7a(Y5p?31_&qbZlt}=`KkGk^q4Olw+nM zKU7oRDFRK1dV|_X;oed$_;7crNj$%39X}GH?5)y{mc=L{c8b}85ogjncKK?^x&%2X z->t`e9>PTC%hWEGZEF3h-Q0eNgA6rq4f^6MN;PdWS$cd|$ZTkXRJ-Z^fRi8uQ(43I zm`KMmQMj-CW&(jG+6rv)MqjMT+fFx&x-or+mY4&hobu_?E%RZM-%1&ut3d7A^pua< zCK?+ZNl~#bPT9E%*=S~>*^_aRh01*Scxl8`a#AJ6volhvER^SukERqE!nX@^7pL1a zbony+we;#dKDxZz(s)uq+fH1*obJVl&G-nheOo$GIk(WR6C>(FW!9$P@zIgi!Mpd` zw%s}bj^r5`iO(lT(0W9uyiA8$Lb<*0!f1LN_R{D}iScvO_kNtKl&~6ncS3J`XX4im z?w!gg8iXdggbO6^6FvVrk$+u44(CB2QFLXyVgrLi;d31|U+uZlftU^N0bKZY)gd+( zN9qN69LT_^@-Zu)Zz)gh(?$6^UC~`1-s|1Bb#S+)Uf|l#H%Lsl8>r{F4%WN4uB~@- z9jf<mU02UXe_UNZzk%Q3r}XA6<wAA+)s3&iJs{M-mA^y~zD?9UB6Fe<|6cW0DL2l3 zv)psMYop%SwD?$AHA3mH_9mjV+uggL?mT-(@^-aXZ6K8CH4)v}*AcDHZz|({eDyZN zlX5>UR&P(rZR)^fdGJb?Q^cS?K=ttfJd~z4)w^irQ@(~F^`_o+4KBxjE2YJ+`fu0S zw@4Y{Z++hfuXUE!->PxF$CqSoY(DyvvhZ8$uiinwH}QMRHO=jM_i6gQC@r?bZ{0cn zKGYVu=w8opX}yP42A(Udx_GX|+;bh(61zm}bXWNn%G_n`kCa)3>CI)<VES$oOl>+? zyW94pfnhJ`hhGrvaFJsiJk10N7)?V5VH#-w+r1=;u-1Q1W$cNaFT8wD1xdasR%%1x z(Tj^OMtc0cDw(fSu+}}UKSAKep6}@4*OV_0af9+@%QC@5s*v4`EQb-HiQL#*>_xc@ zXm3er<kd3HsZ1IL`tZ_0yePj<WZHL7Gm4oM8j7Cf5yCLj-24Vjd0H|h4Er9QJ|`kl z-OA@`V;>fI;DK~t7uqOpA_*_w>>RK4Xmpa$72VCY@mkjym;CsB_f%>(#^9ymGfa)& z<5)9MdX5PFMcp-VWowRJLf&(6k8xYQVZ}`n+2{|SrTB1>9Bf?L6wztT)7tbrsZ@_A zxEjS6Og9Fz<U?cAN+{LlztMXDZ`ytP_Z{5RDC|B&Si1ej$Jx5rN*FmGNx>8SF_*?I zzR4qVFx|6rhaH<A1>Q0`PEVr~x_nYE1<$9Hfv4w+7F8(HMGM*J4YXBM)k6(AI?u&( z5%E3<x|a8A3mm5rbS+(q&_!Mh1m5~}_fFict9)$5aEi>AZbdTFg1@^{?{z)GXK88_ z8SZw^n2I@dc?*ply`}9oo6V~S{Pgl0n9{HF0T~NIXtAbvT_Kj9R}>4LUCW)lv)o|{ znTI5kk<>-%T(6MnHib<7YJtDv#d@NznQBGK;NCUn%?10~SMRQ_L6Y+|PF^=km7n6< z{^+NKcgjdr%Y`4$FBee16s`_j>wvKx#vHY0xmfSMI#}<)5EV7fx$lR$MZp~Xa<%j7 z5O?d4>~vr2vR2otRm!5$<#&V1(@*n~8804uv-8C_J9{m{;hUZPZ*~rh=ZSP!RkTBX zkMkSVx?eo;*p6M}!_iqSq@DIQe6#V%Zo!vS?wl@(Ttn+0{d*=e`m`>#TmDFQ7xjhq zjqMYxj>T_AZ5VCivKxg9n4iv^ZFFC#V3wqhvpQC7`0lgXRby1v(OJ?ya(cS1_2}&e z*%$g(%%P3zLS>>~A_ivm#dTQny;OWtEcufxuveUT9ej!@-)2A~rnfNxl3lJ?GZQb} zgHaf~N%ApPL>QQA;@#~u>dg6b=1*M;?COOd*6a*&6Lb*p?nF%-&dkBIJUXVQ(Lz8* z$yaO&Nyuk-sclTQ8{*g1<&A1wvY(>Na3@yMJUmK?wB{kBYq&nQP9q&Nf5Ai;ThNAE zmjXR&h^xKiIP=oJ%iv)PGBV>u{jzMtV18l2>Wf2%rWg`b3Na6tstB#UFuH6%VW=o0 zYJjwTuMmpBvbrr`|A?Ga)x#JgCPhUpeqwxO^#-^=`UdR?82~F7y?0Sc8g@2H@T{@z zuXWoS8<_WlS>^uMVTikuQe?9?zjRXBGczOvmo$Zykk$dqCG#Re&7-OGo@=&TGo_U* zohI2Mm4i#weT!ohNtj;8Mh1b;e%5;|SV%SbPM1$(%ePP|pPoOyrLyCJ(t{6edGfB! zTOQc)U~C`P$~=wgC0T5`_jKo8)g5o^4;A>hD2bibtZ<or^jDmZaX-T8S#5^EQ{qrU z9EgtSzG`=wh*|JG(kB!!PC`u|J!v6DdN6&G=AZ{dB|UxK45Ij?lJGU+NZ@$N!hC(E zZ;<|@Kv~t*Z><d&)m$LNu2HPVZ{9Q}wHU1iGCB+7eMh4&Ti{?OW8%n^L>_|x^K=os za5SH?sW*z8TC3hHS)A(MECC)CveNveXrd%2W4A+Ke@}(XX5dBLy~L#z5PyM6eqOM! z#ElG1MB2pWBw3@9emTU1ofl~1#B`*G8UoewBYa3vErsY#<zh1WgxNRxM1~|#`!fGv zU7%2)U<@JMiuOtTDrO&|JDll8+1I8>ALaPHb9+swo;Q;Z8F;+b+6wP^M;H^m$I-lc zBAcMQ=%@1<vZ=D^{kM81Lko~xJ6b@N6}C89-imWu!Lq0g1@KQbwVS9;Q|nA83Z277 zH9BJo+)a`xy$-%FQ_W4``<G(@yje3Gu@D4^51d7VGl*F1SKQC}LdHBIe=s`65NmyR znbCn%#kC%HA7u8nRh#g>&6{R*RlNUo&B=P3lSF1e*ts#+pR27;%|?v*yAnVW#Q1NQ z1W@mPQvEOzU@auTroMHv>Qnqv@HdsmxXF+Jfh;cf{CGFsI723akQYub@zU1eowFA6 zgG6Y*KH5$dGe5wIHvDJyX~+=`Q48o>Xk61khDQlX$0Ow+CIXUiE6GSOs|K97T<0!J zG-d;d!TSl6r)Sui=FLJu*MQz|mhh5zlCie3L?YN!l@MAkOQkcrmhwPpIg}h@X0b|T zPC?M5Z%h#aA}dn$>2!Ef2I;Af+vdrW4+$$ulq|SN7T3~?)fb}|7s=pSa=C4t+jUGh zPz18Uq_UXM@i*-~6MP*i-q}cbYh5}{If|%P3il?X79^H78IG>0bw76W@Z>K3Oiets ztCoLk|6W}ukLbF0?=Div%7!tztjm~W49mK!b9pmg>K*7yc4h{}2@o2JQ@rP90Ux3o z#2Q!g*b_S?5Bur0B7%;B6IRKuPv60Mb-jj=Y2FL5c#o*HT#ID{ce2;z9(y;gN(0sd z0<4<wZVhO$pQo}D*3(bb^X`*M8oDF6<bO}kG9nrE*F-XRaDzx@*xAFvaJE{+VgTD` z>-enpV=Q2~%8UNsrzm|1SpG^UjY*S5>|ORwz#eTRD=pos@TLJ#x;3QyXgD$=6UrFr z(g~fiMz8HZ1n8A?x0*q-I`wAKsi_nyb|7ZJ;bT?l@bM?K@D@hg<QLzi&0z8fL%WLm z*o2<hJ3<|e+=WVeBpgpwkU{*VIwWgkhlWc;mNz@kfR6D<9n8*Nf_nw7R>HkK*TKEQ zxm_4rcH@TH9WZbA#SwAo;M5rNO8QVp;ojYE1NYi|-bJS!?lrV)2spvLE(2;aA8uBS zvSMsrQ?Y)%{Y;??sRg=)<(7Y^LTY(ryVgx#z_W-BUsF}0{cPc{gJ3?X!XlZRiQ6jH zZQ42iMhiN`O|d8M*?lqmgTom_ql2fPiVj|kXbh#u*0HF->jYbu)nZp;aQd(hqF}sa zI4KN0p{vLEkfp1&zLE+#2W?_ci~jBLhKxk{CL*8)_Iendg|0UyJK5vcjrV=KCSUke z`&V+Z+O65{hC|QUu*!dovM#E+&FL!Bsjl6o`uR%)ed}ubS$u#3@hp}*vtjEc&3a8i zO?$nKV1lIkB2gr@V<|>m8o%-@@<ue}U*fMvBKY%XEI&vR(ki$^8pfG9cAlJ_n5Law zA~_{~RCp0Bo^VJ<Mw#}bzgm3#8hC43G-HNrk+2rQ7?twYNw)z%#9M$kgE8IoXmP1M zaeudF&E$%#N^Qf_OH)ge*8i{?!PZQr^gF2zeT)mHut*un)~l1>6}{-PsV<9P%tiNE zhG&yOF6S<8r(_qf;(14<%M=`g@9g`}2daIGAO|}-rp3Emt`Ix>uL+ha4@IMg1XFS$ zi^C))5;<8lH=qB1#IrFC)`^s4><;)On4b8S)UYveJPd6#m%vV;>i|1<r^YS0s*OEQ zdKlwg#4|eHMbF_W;XIILim&OGnXn9iyonEXF7KIAOcjY<khx%5=CTyI?Zet>3C%yg zJ)6<!K_*b4bfd61cR?QTpU?|!xQrbdHou%a8D%SOGJ_sY4_YIR1Ff$@JZloK3)^&3 zN@`Mv-J-4Mi&;l@ZE5}7d~7=b@0nkt7j_U2C<G5i4hXQElVUYQkrCa9`>Tk%V{-(A zF-a6YWQsY10g8l{v7k$1_htlEt6j1>dV7RTi)HC6JzgTYm_F$TXIEOGHPsu+>8WVY z)^FS!$MBlg!rS*)p@bKovI_O8(WuZ*7_YP~sZ@F4H3KW!Mq~Tw#!<;;iTHg#zO)k) zqx{7*w|eNfz8lZ#(3NdxJTcnQh@6<H>f}b&!eRMvDnXLI)(<gas26cgGQd={+vMBK z6pX&4S6!dmqb6~}St#d3J_hADFdO&8hs31M7OGG~^3YG4!$Ch0Tq`n}LMDf_KLglX zA0{n8z2x|-R5<?kSq~l9Qy|l5V?B4md|8?W3%<`rI}m3i9Oj!00)A8-HD;4jOWf8C zNmmmx<?V%?(6sH0n<)+x$}T_4qwv$^?{5CI-ol%;kJzrcv7?F(L5q3=hcvT+G(YNP zWeb<=1`-yM<pcfz&`Z}W@2;gXar6zM3}f8H@6?9F_VWE$(B|^gkH+FQmy!AR>Z4^> z`n2w@yWw7pCs@?aF!6V_j(Zl{xmaa3+%ak=%AAFb0e?Q?@TYCPyTO;Zos`ji6PdnA zdbT(g-pWM>UCC88DzR;C9z^M~TMg6R6$W<0Sv+PmN{3+k!7=@4uXI)5dN<m4YR_sl zo{Oi{aLhXuJylz%cHk!VYzDoU=A;>+WcI4|sqNLb0PJLU7Xv%>^9F(4Sxr;`cEfPL zP@9G$t_SYKridzox??|ame_~o&TBb+Zr*V*AQaUG_|-Nta^Wp(qpCXWScM{X+880< zlJ4|7wTU!^3u;R6!x1X8+=U-4lYVX<@ZHZ_wWn`l6M2C14sM?oV3yuI>fa4+p6|?T zp7m}WZUAt-OcMbFktVHqyDUByzEuJaHrcHm4nT$H`RLo?P1XE%6Lx*8@al>N7sD%q zRlqBPJZ(sZ`A%&%P5I?jHk+MK%9!^;nnRt-AMZ4NUxGl1kmKZ333pnIB$}I%t6%e; z(~i1v+E_AB6P{W%5VfK_;fQAEqzOidtbhzbZYz2-t$GG?PhOVF+NAU@HcHAa*XT+Y z31pl=G8k)Ph9gHW^>OlYaT!Ye<jgClkjYY0<lL&n7eTyA|Ln!LNw^$G=7#tc3V!3l z-PjjCI|ngILb#Y#e!#}5_AAbI``DZ$?zZMkgnVUM-(k!m3|3>;M_7(59U|)+(>Eg6 zHAxGuqCm>p?FX4*-$)>8U96EfyPDS49oAoGfe~TGGwi4i$K*$E!2h>r@&B86*EzvU zZM|0chQR-mwCutEqar+9z<y(S3zacPirA-~=+WjA8lPO!?m5w!CoR;^RMfW{CM`az zQS{NF4#;4o*aRzVNJf%5rtLY{=Xlr6<CmDn)grWO#@~o%4e4CxP?oxQduLT5sF~+) z{;YZ&F=Ig^T25&u$<2RBrxaY_LK`W@Omaqfyy6LUBfZhH8Rq4Br*e#mzs{+Y<TH-H zzPGk1bvQ#SI)1Trla?|$nsx>wspfC+Wd42aF-PZkk?4?iG*i=tFcS|N_|U^P6oC{8 zp-g}K3<O#p7U7w2E;~;bD%o?}iMHmM7JoI*!Ddft-Z249$JN^oB%(IU=hsf&rZe{Q z8Xv!QW`{Vl7FuFmJjQqQ%xWpFWzK9NL(GLU`x*t)__chiVb?eyyF9HV1D2O~2Pv)O zW7XjkTDee)MJqp09z^=?yvWy<hvY?G-eljbE3XGnuQ?$PtqtX2l)e4-{Fd@YN)f6t z-|_q)(EqkbXrkt_Ylq~haV}Khz{BDsqCE>lbXz38u!KDLVI1>jRq)EhXRL0;QfpQi zG9WJG(PaPh(HZv!`K`!VZ8rU_{2Z6$EMO_xnerAMaata9Y4RT?yhij`wTFBw1T;D! z?A5z?(!S~An~S0B8W(-Rg+98{87)-%t37xS%T7bSeh&ZjE^fg{A$;-ydIs<;{+zRO zulqK9fF30W8Z>e*e=smo;1Cl<S2PqcQnBif?$TVd>Mt01#!9~<I-?hP&s|K%CZ*qR zY6H2-YxmpiBNFiBM>vvgbdr0Cs%Zjvt*8SC*5>c(<G;|wTxU&aaFMnZ<mD{kHgujF zT`2FPYwFSeu9Dx+T^yM9Q}o4Uto8YVt<OOv_!V{cPG0H&8#?o0_t&xA&U^x~{-%|N zl2JBj+>`tomK9o;7L|R9dI6URzV-Tq=r<_TJbV9yXJ3nFk4XFPX>IZZq3x=3XUK@G zmh_{)+Ktw##87HgVPs6n&8KPLvFkyX^}q#=RWysZFB>#(O)IJBvcD69f(|HpbWIzZ z`!jR)EFe9zqe55Yc3@;0aXqAEr&|`!iw<>O+~_{N)GrOVbIUnbLSdnf=4-F+xmcxM z87<(k_sX1U6irRB9IOr?n~y2eiqCm0A*oTRID2z&+rGNAXxLB!RDRenaX<$%(2Tce zW!v7&fCTf7@@t_yPS8c)>5gk1KbSj*&d_F#)%^yA;<NEHZD#aaeE)m#>J~a`4>r$c z(^ykSL{_D89^1v9Hq>Z)x+k@r+BK-}zpe(2;=}maF=w^+U8mu&wX~KxUHV(8aghj3 zupv^41{73a!dEP^vYe{`N7`~15AzLn7FahBr--NKZgQKYY&nNgYH@qZ8+Weq#>;+J zAP|u^2t<Pcg{|C2rp8J@hUFc%GuGuy%4}b2W?E@_mHpS68!1|xN=FI4HX<qMmuRtN zt2;xWursJM!2|pGa8pKO1iE9$M3NvR6CPekG#x%k3oZZcdn(R<+Xv_#p$+FHEe_QM zqe)cApVYTD^wm7M{|^n=aq5Xx*d}zy%^Sj-g@w^-1Lz#sM%YIC3D&#T!IJAZV?vWT z&KsXqrca(*pda~s$)}>LEDc@`+yzu3j!+Iyh}?WnMc1Nv-RZ8^K6hb8XZ{oRUYCMw zqYcEg$AZrhSpyHXHI!a+NM2{yo${HO81w!1x!>N(XIryg&>kVD?uc9T&j>QbGxe~e zoVOt1IlH$W+)TSJ2d#pV3+oz4BfO8WY{J9YUQSuWWKiF~)B@WHH<66(cU$V3zF5}f z6S`PHqF|EhY*kH$?zg|e1f7A_?XM>OlXioIld!Y|bLj6D+7q0YUBMmvA~eKXKpGR| zIb=?APX=?f+ne_bjQ`xs8L<w5P||h@TSjOp*)pQ7aZu^1cg1KaIm17y?s|Uqw|Fc1 z5smZ{+_eruWp5i`5Nf9b=vKS4rDJo|BhE4VAhAvYV2e99$$OQZT#(3yy{27;wp{@b z<%u(>j)G5(x;uBfz|mEReTQA+0oZD70H#FixWofk&wZn-dgg4@4m_*)d)0l%ya+hA zBQq>)4icVl7<tVOq8-M&`H;*kE=Y)$6~0RwS+;JZsDu2Zn_aDh-#doY?$IdJEwI{H z^AaeBU0YP<6^<jkXSg#%9<^U_q1er8Ou}YKVp#Lxb`6eql6g)9<!4lTVgvIPef)wh zqO}|)Bs3Wr?)ajf+3C~PifldA<Z5CLb^pscN!sI*e-9255~aJ?+uz^c*FQ3t?_Yt1 znxcG~g?if4N#(A&{FN@4r?tlL#94t!Tx}t@dOR~#w3zgyd@qZM>PUs(S{G?U%?vOs zqj!!dfG_m7Q9Lf3)#T--Nn5rc+Q)n%7|A3h&vS)grspCjs7na>ibcxdh2Uu+$)*_w z8lmROA0V0zWiVd_LbyOWE(*AlR*v33N|bCY_Gd_<o4jFk+-k3FO}%CYyR#=TMu46p zq_UB57O8^lbF-(-B*>;AYm6WYuwA_4Kp`q7*R&Xn(&ME=i*tvf1544Ii_vMqQX;D) zmIJ=r1X7w8e63_8E{}|F3Dt~^=$0qp`<WAbd@1oP*-V@y%z@`-DyJ}4xIi#yh+sTd z5{m)fOsGLEV3*L+2G2qnYsE%2%dQAN0v`Ig0gJfWAmiFLZEmnft4n7CAW|LrRgw-% zn<_wrFEPZRa%0wWpMo4T763ZnYPTo_uX1>^b89S^)n1MMqmG*$ON04F*m@-P)B3)^ z_pR_>FMKe82E!nz+O65X27dGA&EeFiM`OT-Ih;OE1@xwI2lRG?4+#)<=uMJ<0E+Vh z#U{Ci9KNamoERS8hJmrLNcbc_n<CK^kqy{9b!R~~=efgp^<i#eHe|lZM7Prgdh-6* z?a+=`^e5wSVJ!SUo3Uv{eoaS64AFCqXqh4irXgutE?cP|5ZE-lXC#Oz^uJ5%Xbj5t zYsLH$TA@$rL0blVmpbEw((4I!DY0~|Ki#QW!|!yvmtX8X9jlw8LZRp~47QAwAt)g( z3FDB*br!c5B9(Su{JNFMJ2Dbv{+r7MBzJ`>rkdhn%H6otZYQ49*Dh_u_14#Nt;=d4 zKl8cY&*LV8ScL?s`e(t}^sK<M&vz0#wG)d6$kF07v85625Uk<jozJq(aTqSXT6~Vc z0#-*a<$uf7A+Zhaz_uMAUpr*#rc#7_Ti@D;dQav5toK~)$JB2-hH^bP^5oBLhX_GV zX|6VqmP|wk=q~y!H)bj`H9p{0<|p*T=to;OJ7)J#I(i?M#=!KnVC0;_`b<wp|4?68 z8fGIqMM*|^F72Il8-1V@d<(>yHhL{0nSg^)I*mR-DkngT{(-7(5-xm+YWHZ_$M~|N z>kh1lharFRIP2<nBU?bkW`T&OgSdWszI8yG;%sbX7l=8X3mwNveoc@QxYXfl?ka%D zB8cM+pgTvfb*EgGgFMNofz?DJchKvX)oVw6$P6%SRFb}@WHK50@=^NLhQ2ImYqBLb zrs>Oi*L<#WJ86cXGYtkHH}X;&5ti<7d-C|#sJF2eQRk64!Z^*%o|Z3STS`-}&ZbY9 z{Nw?a>ouVm|IMDJiu0BmGXQtSnn=o@<O8$HS>x2m^_+R+nlpxNr%v5fb7MEU(}3MI zi0E>`SRgTaGDPh;Xx99V&dcWU5n77Z&tRJqU_o@_f}k^!l|ptJle3zTMbK?YLshLn zw>upmVPe_>w?^kOnBo7Stn)N5mg*PuQ9z3`^?BVl?Ou_I^T~8Fm9R;rTy0INE%{Kd z7z#}YGllbX8X|2jV;-&>3Qb3OOwEgvFAnB&LxsVfzT2QVduDkOeqyLu+0COgrCA;{ z$}$$#uZ^>(mW$<H6W0^;MdEq_r48^GQGFgdlNB6_BqyEuRl1s`EX}1B1uPOQQr{>z zSu2GpV^Yg~;|M*4S0y=(0EO2~J7+D6mYRADAxg#0qsfJ5T38}hIL)x864%FJRZ(e| z6B=?g^6}*q`M6@7RdUhARBP!_<YT*zzC0S})j%nR8+3C@8Iwt$@p5U>lntJAH1(ZK zO1H_NR63k7dz4Ut&T!OKm9;V*A?HTv!EHMp+VM!q5^uPd?1hY7=?kNjRGPXMMqP1t z&pUCnq^v$e8$|%rIN?@0hU4265h*E9GhGQavsf@Y!0vXs1)acmh+g?b`a~a!0#%pd zE8}4QQ!!zwt?Fn>qd%U|`4XjagH*}K)ufJ^1PjC&;drMSo(eRH=#fB^Oi_OsZ6ese zo9uIii$BHW3CMqTx#tq0o<el@B684Ipd)h71!d@nUg!vdjMRJK)_ZXyk*oDoy%)20 zJ}u`xMbZ0euTd1ko+<&o>!0$_L0syc&q^=pKldn$#Ff0o&gA>$JXFT;b41D%ol@^P z?gSdc&=LhiVE5Gv^Sw?|U(UY)S$gqfbxCobgBI$e_k<z23e_Si>l$(!*LU8#+xNbd z?LFTNuh{?Jey-!(Z__T@=CoqFKgBE&$^;Q!_s2UI2c2$JF6E+)Y->T~NctOa2J>u+ zkE8tcsut0KYotH$rgL5_-{`#948JAG{s}EFf0=fcH4qi44Ye?H=2&@V7dW7g)@oSs z1l_~Tf@0+o!S)rnYFt<hIuZ8LHriJx9o<FE(GPI~T)_Ays!F<*M!tgIN@Nt;=O{hC z#^IW*R+uO|1R%ONyMJlc@-8It<o`g;h`w*+aa(vG`p3HMoNgYgaLe~-ta7ncem?!{ zhsKgcphSInqqZdT9wcars4j)vkz_@l9eJoP<?JgEusl6a|GyJojUrj5FD`+_e_o?W zQDFX9+IN}#(anI3CVY~ccZzz6{#zEc)>V4B6xtG;Gw{h@lLEn;y)F9XA8UlF75e49 z26R>;U!u=Y?5z<nzo<qW*A)nuzNE3Rz!_3j(&9Fx?24k&n1s!_qmh=4ih7NHl<u!c zvHnW3&|&~;>*!sUST!l1Sko1yd`4RRq*^iAp3%^&xWEZ#RMjj3y^i7l!n~fodnL?! z*9oglG&u7sbo5;&td5_GJcTC4O_6FGQ6-wqC@mwW44~Z@F;%}=V#=Ht_F6ZbEO4~G z8d0^G6wo**(K#hFL=q{Rjx^O6!{1fOu==}6hLPB;w0Gvz!d<1UyGRC|qP`sAC5kOW zf`zVbE-CY)iTx^b3%IU<QBs2|*=mK-fxf&klCo4!5tyNpo1rf?u&3q}7`|m>Muuhv zg+R6Rca5(6U7d9fognSK$;P}P`cfzMZP1thTuo=_%MEQhkkFYK+1GE-c1&kp{3TCg zzP?<zl#w728=YLWp2~dDORF~3iwI{$EAFosp)dIq=*w7QHN-o4C{wf`MqfHZBfaxO zMqj$mg?R*-Mqk=zqc4Y`?1o~>F8UHZ!&#HyL20^90^*pi!>(0y-3?GzMTbI+Ub;(D ze@&Mr!s>H8YcH;f{yQOoAJ@f%qMy*)qM6zeOyAJj+)W8bFo|5UnC=;JX?@;O^bkue zwQhls4ER&KOVoi;B8FeUpk_ny&Pt~mJrGEukN%@NpQ4Y}r@H5h1k#1^zdJ&nm`tj_ zi)7N@qz>;rnL)k_<kDZMu_kgUJG0hkSoXg?vZ)iXkY9fzn{G=@&08X$uIkX-5cwpK z_`hhPjC>k0@@dn`<dayEj9kiv>5t`71UxPmUh8aUMv6SD2&Xp?Ndz`?rl*-~l5N)w zX*#!*<U}kN46ME1MMdYmH$o-hhK_OS<C32pIzBdXWY6x>p(7IqpWajYjy?PLA9}X* z^pQP#4wjzU|B*eV!yh?vc>f;mCnmqW^z1YHrno<H=-Gp*{6CeGWY?QkYLKMPqaXgr z#F0Iv$$dvAd3)-}KC0*D=+wlK(ldLWn|S)r!P240Dg8~=<dun3lSr%rLE)MquB^H~ zVxM-7AlyotA9GJr6=HI`I32&D5BA2>is3dEG?y1mxk>OnDhm%U5jk&cM6aZ(vxy7! z*(a;e?#4#!PpWu@Bv7HWK3L(<gq~133~;k0m)<i25jy55)>vg-8ohUP+(oUo#M>It zDK?b6=~G*(l&WgXrp4UaH3-YF6FCJvzB1NR`%;~-FXQM;iG<KitWqm5;qHS?<-M|G z_S1TADWsLOI&HY)rPSjv38|4LHE)Z~FHRw3t&GV-UZh?8V`X-dmccfXRld`2LtDtw zj_o8^-|@iqc5nH8XLDY9c)J^~US~(Uw;$fV<<ab`t_ipG?ZpSSyHW29+t*%wfV5EA zH=Db@g1q$RNA$v|dq>XuZX$H&I;uN6mAbKxaRX1VeY+lP(S^y01+kh{vTx|%`&kUr zw$;x_n|DJQy?k+}rabfL5|2^~K)6wXf_TyTlCABZ-|Vua$M4?NuxxR3^RNvyJsls} zqvy$NxDqxQkFGQqAK4SeluSj_i=l*{h=*I|A+?#pG`KE@cX=)tz<x~4j9-$}wkw5w zm%vT8XR|x+h15o{*E4g&(rc=0J#-iE;q3glQZ_#iwVxlWIW+{=lNUyt-V7!D1f_O` zp0H6;XC_Qg+^O((JVpNX70e(W1sS)h589hSnA*T858@yKfhrZrtlxJ?dGLe?BGm_z zR}vUsoxSs+3Pf2r_O8j$LFNsOL77YJL3d?1t8#-ng~!#CnCIIl4eUUsKS8Omj>g6C znON~n8Wf8M^OYF)<$?~TOA*9P@oLXdJ`mO}^|>3ffo@a8=27&ezQN8!9y-}41(bl< zCnyoHtK~Xhu>1`epz$UK2$o2e#dF3LFq^V!@t?j2H{|7Fxo^1__EaMNv&wU!Ud&rx z=1~nV_fcle#aHWns2N^a?ngn=FaMZ&0prjD3X&3RD25YKB{)X3z6KQp`5%<C^xU^l zWfb|0cIxVyYJZ*F6?|t(je5UJD;w=bX))m5IQOkO0sDxp_ALSfhG*C)57yUQ>EzmX zMWIN(Qtn;uJ@*w@SS9NIak5{mMGcx`K6^Cdm=X*q&j)Ut1NDK89ap-Dn(KU-2AMa- ze9x&IW*S9CH+b>BdXdqMEYm+?wtMx7nU}1s57PU!8qKFW&;2SrSyvydu0J75q1^Hi zik2ZW@K~F*0up0k2jgCDkTl=vH08!o=ER-L;JQvYi>&56?<^kP%S%y71pN_q)%6tV zdr~LoF59VrzfCDhV$ECT{7U$4${9smGp`AP9R|Y;OflwjY43@yRQImevu{!3-neI2 zoQ|y6v*0$-zH6npYn$YS!U4<6|F)XDlB>|cZ1<!&O!~Om#Ho8vC*5n`^i9pmL)3WP z^-{C@-qB{?bED0E+X~IXmbpDp;>Pv>6YcguHCOFA-qkwM>1}GmRwu4E+uxqFzjvyZ zgN$ae>_<@FU?_jz5!KA`xG8YSeFuo0CJO|~&SBh4j2qMPCB(UMI3#%(c}p@K($UzU z4oSjf({e{VEm+ss(J(;OvIotO%T93f5g}M;0W))GekaZ{=eBQA{e0ZtLdW=q=$a1x z*LiHRv_=oS#SUdz=#80-N@LKndL*9*>~lOSC1*Ed;&POzIi<~veqXf;urvzM+!>{Z zH6yZL&|}H$8eNt1XCjSwd|g{bXI`CY==y+-MH<f@#&l%vT-irLJtXmeqyO~W+*y-p zF!zljMTCcm5PcjG{9M`TM0?J-wTXUMLq4E>^%JdjX2E*{*fgQq{hYqG*^;JcQnPiK zJ}M#iMpKcJEy4atS&BSEa=@HIUJmoA&#O^~h$1S_i6Y+;5)UQnFu5i+QBH3Uk<hy~ zn1xYcKWL-At9r_N-^IglDc)QhhWB|w=3NlIRn<(B=&e89+<yT=w`KLw30+O-w!!+> zEN(NCu-@xvD{n~BMspoK@w^ltW@i@qcC4hPT%d49&NiH}|02~`xyR&e-u}zJl?_<Y zyKGzPFVcQ1>Nb{OC*+hpR9?qBeO7jTc>`sU-XWLkM=rN9D$!(Z#`uS}PTAf(EOyH# z*z`N#mo3uBp#5jLNiiZ>zw9TgB$J)*sTKjY4^#_Rdz^tNW+&Xc9ByVXDj#h^Idfej zl{Y!peiR}BuQKv3cg_#+mtQjOkfGVExI5=Dj3l31=lnYUuH!G6c&05I&(&c*ZBVIL zA%2Uqrq(n$Cc|KRgO80qAlLb0=GGdC#*5_Z9BtFxt-1*IJJ&Boi#3xb7c}|1^wEs3 zU)7x~u$_nG5O*<$VsEc(i~Zf&Q_@m6XK2M8vvdW(HvJQf)4$pshh>KAo$B{2o>T<a zz*Z$nE3Jr5g(*K2Tmbr*Ibbg3@|l=z<FfPyevefQNuhh8=u;}9{J~(`tN?TPR@oR5 zMUc6?-Eat$AJYikN$u+#&eh)AZX|)s%>Zg}g&WCz+&I@}`fBdWth78j-9EY3o_1YB zd1l^!IYy9oD`Q>%2Cqlv<Ivu|RA2pMe7J>*WUh;?@#c12ZE_k8uuz>12O{D_Aikf1 z4S`L;cXzSb6PM=%?qGQqb(i(sUEFdrrTxHH^VuzF8qDuXvjUO#c|F*m`xZX|75luV zB<-%N^^?ycPGH_6(a~J-er)5iEAU_-LMJN$5pJpE?#b9k7<-pb6)Af%Ot8JHT1g!= z|1j(EO0Kpl@g;TEvHFTi!s>b7#B3Kqm$Bod7EC{J7wybE#e+HuL-^K>TEM#bz*?>r z_FC*6>pT|ew%dQZbVu$ogL^T=A=n&sxwB(-INmuUvBSBj@9km)kqUh|*@Yr*)@vLi z?RH@n(}hi#8OtLYOS@h>h%iR46}P}~@NIl7?d)uzSI)=M_g_Ai(WiB3>c2|<TCxi2 zJ4Qrp0auHQB@38%cYl-*H|5<e2Y54Wj1HThw_zJSyAeO{60J4+dE3ad&feZMz4fGs zeE26CHorje*w1^I0PS%+iR>1PQ-H{0QjQ~^Q3u+2On!-3F|g$ht(^lisIoONvSk(1 zsuI;+QNMJ8%};WDU!mB8m!z&)A4zQ+{oH)az#-n6`Ab&bNRRzXOQ&Z}&drpag{JXp zn4JgDMg#LHdmHj%OkUo*<Z^61b;$)^D=(qW@oB<Bta7T*%c>E{>#3?Td!@o5yO`x1 zZVGHEosvoX!X@hxj1jp$WHu_Zc6G&aWb=qXG{UK=?gXoMU($!5vwGrIo4bsY=Y^R| z6(YY?&qs^+e3ll^qYO1)93rk&s;d~hD=1tt`e4{f9SbwZ<`!%aCBj5A9<$~5xyTgJ zt~9zcQ4^JCsx#9U(59lFGKHacn6!?g@bJ|=UP=nypK5rFx)N=dR9mqhrc)5Q&fH%* z>YY8UJUYTd!AmpLs|<TfXAdntZto~+bJd{N1eR7yB=*7%e}3uIVk*aT=wnh_=s{C< zuZ&V9qr>r<8~TUk)WY2H>Ikno!>bi^P*{ywby5R(jgr~#n;Jq7ol41`Nz|`LN%gTd zDZpJ0K)@rG?jk{TE=Y$_FQ7X!m!698n@*1-N6k>)V`Pu(4E`kO;R}@g*E-K4GDI!b zHY9sz1yWE&C;9cF7#F5Su>c^H;`mu$+nmEvk}%LSqYAQC(aoS<km-+-zQAt}r}|>Y zDvrzEa~=4$3Ix;ad`+#0dMskyuu_O;5xQx9%XlP6TX>{A-rG%94aPNLr-d2o?Yuan zc(1k#6X=DBW1Rahfn=64@;b1L&}$QmfBSGO4MNYDHRtLOZGv!<N)GS4UrN7UIeqGE zN%AE*8@XheAz_n3SEh%2U07Hut?HpZ`f6gCx+2`PwQ7IzwzHlqoIJRkX?%cj28Gb} zu|i@+7(&dAdza1=(dhi*1+qec8Vr7KDaCQLwNczbHGa>8)1TBcqZEuGy6)lqOKoLG zp$;LkLK(Hz&D{!zH;Ac3I(u48)LM?Pw5T1@d|Uc3dv@(tL_FN3F5Vow_Sf-&Q?v(w z%#iP6IMf*qt&0W>z({rsy$qMu#$j<=8R;`4$ZOuqWaVKk#C6I^kyz$(L9gXry}W{P zeVAuYf;9u9FY<aP9)1~-6^!O!m|c^RiP&l%VpEXS<%dvJtHqwsHu#fx8H;^Dq@KPN zf^3TT4=|}GK&0O1yHNN!h?F--)XgOHk_6`fzP+bNPim6ZgTe1TW+^q(mAzcr?{Bn& zM2xSqznTASCS@T5ygXfv#d@sXwU&(QCS558EaW2{{f{E%Z4yk55hNptG^EkHxKy1c zLfG8@SKhk-*LCOjeZa*V1WAabC`zl<UV)-;K>{EFQZEXmM1tfly%ePtsg;%>1z+G^ zkRb8ko_isYmw@eAt=C$|yRkE=Ydf}wsuPcs#%Wr+uH#82j_XO>I`+6Tbz)z;O~y_q zcC!;d(z^AwN&5Nz{{Qno=iGZiQtRDy#s!Ik^Z36XzyI(3i{b-93%}m&PJ0}~*{3Ed zQiX2O)JQ)~XO?)nMw~s8?Qe@Mpez!}+Vc7ZZnOoi%X1_P2R&M7Ms*FLXm|9Kp0L~M z;eL|v&1{bMbjHEam;ICs>AaPC@9j&Z?HXtszy|Erw~&4=mA)^E2z6q)H~LpP8Pt9& zgIHwmIUDsY>su;+1+i#1_Td+?>e?c~<7Y3v*@pOZ58_kUTnn->`&lPIb?yLZ18<q< zj=)+$Y1Tl8aaI0~_Ug}Q7L3VnUbbWi?)I-#Zn1UxasD*KjlvkYytH7*+N|x*`YwAR zkUeX}xH&GaZ!v1o&0l?MHM%_;rc(_?x_+%#IeT>lZy3hfkA6lk`{49@lkx^iPsjgG zP3tIal4o0I*VNmo$=wABBu2gN*&s0G<>6}(S{9q8Jq^<ypo;nHlPO^XHI(eldmsv0 z!2N2EHVbrfZ=^T#YFzxobKA@On%~8+FA1gOEbzb+V25GY^AXY%-=iEmWeDOf_kSWb zFoH;nop?-8fy6q(nQ&O%*N79iTt<~Y_9rrClm<#5Npi}Nt?e2XBJP+@S5aMDF1w(G z<Z&B~o0Mzn^Q7Jw$rdQCZjpd55s?M4mxElYAQZz-l#8w`Vj!O{h&qB|agrrb7)BTQ zg!y+@*OrKA5pmcTBe_O#ZBrV8Kg9!Lopj|T9U5^jbahHk%}!tft?=hgtlWz{3B8j8 zdRprBEMql1r~Q)<1Q}{%C}h4bO=Iru1F4e7{=?a|z@#d91-D_vQr4iM;)nqe?^$~* zYL%nQoC!<=G2_}JG9|RdX;u1l6ci^-3=o=Ws+I4oE|!>RhwHgI9AT}7uwfyt-GWi0 zLh*rUW3avnWMgP@Ayk~D78^!(Z`Q7+VYr-KO)EN2s)UU+;g!(oa3kY&ZJOAVQsPV~ zBuN^Y-=8l`jE>x^y_V}6gK0TSfzAyDz-{ux@F2L>x3s{u9t!ipNp9%Yc?xfU<$oX8 z>Nsu5d180Q{uJar6oB}i&Rhn53$p8{@;sLe{B{ztSclzdv`fCGpaVg^hMY_k-#{ch zwfHXQmyPhNHwD`XTbqJwEbdx4S`7*Y-ylezspBscs7JeVc~Ox9p`y>-2@At9_Y%am zgPDktTkk~%Z6LX_GUBGx{v|Lt3+m|DCLMC<``>Yn2kwdKs~CbHdMqPwQ@UnWt<uiM zORNn{rMB}DQ|(-hwLn4Dyr2~*Zu;$AY3y65r8mt7_cpZekk^~@%$2v`w6pABv2;24 zqcvIRQwp_f$#H3JymHN}@x3%eeCAz}!|Y0RARtrUAi(hiEvR)~`I-U8Vhg~rBh~)E z7-y#c?6jJO`a(Qjy<3pjcW%pay#r2|Cussxq<na(quc>bXo{Y|5z%Pf_5RuOuy!xX zO?hU785T#SXuXu$Ns9o|sMJj;);}R#MNLx+a67#-DVS9_x4OE7Ya^AaAN_4rgGD>O zS1lrD-$~W7BU6h9(oG1r+7_Lq!p$M|Kcv}_3hpK?(rHlqNbgz$Z0(z5a2eRf$S^U3 z4xnw`>mil_*D^QikEDE6ECMRB;Mx$<Ch0<ghI-!7*Mx#^4w&QM-i26OOSm_pthKU0 z9S(4u3_v#C4nd03r7?aVp2j=ov2Hcv$b0i|To6yY%F#5xTEd}Y5%1gBr{td*D=l6{ z9#C7nIhwz@v{u1Ajz7bW_)ni*D=tao5n16v#YqfS)?~yyO1lVUe(V|fG>nhJ!thwe zQ%;=d$ViH5Pl1~otnAI><g8>=6V1PL_BHE5Xp9<!yPPA>WZq;R_A1wbBf?FWGan`< zCk{=F9XfPqBJ(=)uopbp<clgK^W}x-pL_P1vCJzhRyGk3+@}}W9+(OGk!Oe|8A@;2 zhZgNu*0@vI{H?mtq6>K!ib2DA=ET`^NAsuSaFZ})3{@Ac0QPAikn+!rjOGh+9DH;F zz0K97qtChl2n?spxjfGPi;p~=%f?9&XT|s}VyTJ^iCVh?9=H%BPJKigFBjv0Bc?)W z2et7$jLWn|Ag1Zu?&59p(Wk6G5`%J`+vZH|p?Jx*IJw0;4a}n&54YuM8un2WLkL$t zD;HthNIzDL8=QUXAE`TWMA#QyvwYpr+vYjE^Qt-a(N`ElDzSU2?XydIz6xt<r4t== z-2SZO(3OuJ2Bw%ky(y;8leEg2Q)?*dJ7?pK4BOIpfT&iQ>*=RR2>#H5|6|OXMs}$1 zgdfvj?ING>gvU*dK)OVDm&UnFZATcmZwAH?eN1!uHBlP>wYrg3M1-q57#bhYg^MuL zT9Fz*uXD<lonc(}WA18|*5XyxI|SdVyMJ5jGfjN2^qE$25mgk4yAQOX-@6X(vXiWv zlWa>Q6{g~UWK9}`FeJigZ}I9BN85>5WJik}qKxXSgb>=fYp`#SC&PTPQ;*llIhS(r zX2ouP;1OGwNEYd=%f(2}dadLbQc#I;8r*SaO)HnIWKO!pmHDML&Y}zt>I@XGm{6Q} z7o)YZb0*hZ8K<6+#<t)}c~_)BR=!}YCk;Z};UZwGxr8E~dc*k&Bchm}9P=vQCT1UT ztT(mO7@65-dRCcS*6FNv1DwAKhmK)DWgMg3#d!w*cK)+#tCIgXjtAAym{e<t31Ld+ z7@->HZt?0h;Ogp1wTS)cg2uwnlDVl;*P40~52v)JUtMY0Oy9g@p1t;h#sJQ({7SFB z>v{rGkZPWvA`lSgPukC*1%Q50b7W`-m;@&)O>5P>u%t%Q1uN+VCh6j;zFQkyM>pg0 z`6%(n6m&Y(z<mDIwJK=MiU|_WqIijB23%G}lpo7a<i7<xXOi<hIY(`gh%vUFzfhJk zNA)(hr^>{iUo_0eC)n)IdOm+j`WdehI3?4NG5s8{YvXP5a+AAMwk$q@W#|OWo2Hps zPu!kGoCq^kuBGvycpDDha(+H4R<1QQn3l#r&t_Vh&%ba)g|1fMCoj%(d*Nnzi8K6a z-rT^#n9iSDC0uyEFub&Sb$taJ>G&rpbmB-uq0hZQNv|xz^;cpFb&adAw(u*CCu~fT zEdY6SRUX%{*LRazA#MC~<he|t>B;uy-5{PVY}hZHevJ=_Ldkkc0mU&Y{c2;g!cMpu zn9y1Rw-p8bYJTlz3N{);lu|=;_9l=ZyQNW4S#`S?B^o>-r2|7&7J+ZYEDUhMa4mU* zznKaQoaMoxojMZ0TR;Q|1Bo~;5OR}v=3>d0Wy~JKZ~Kgv(s+5?!OK!=HP5Y<oZ^y( z*g>ILgUJk+ZNLJ(B(njzW3Fo#Oz$aC;Ynp{)WEU2Un$-!kjAwzh1RpUZj_PpVcx;) zB#r^3AYGot8<IH)(A<Slh!=wUixUECinSOo1m$-=WDbqQ{j&tm0VQ@ecvBhQ1WE5h z+cfai8|G~y)w8URPq(C7#gbRn@zUBdQ)neNyZyw*d_sCb@ov}srrTW~aY_{$H^xcp z8-FyP>~~%>1V=Xq8>s@qw8$Vmp@<L`mESoUU{J^~GyK94Yp#bQ+z;IskPOl6i6fh} zI|WnXhTpfu&>l|ecwHR@!lmB3_WNdr_cO!Ky`c6R$kNRN11u#z^4w;fNWrksi3bIR zp>dhcJoiHCy>-UgY%kB8pBHhWAN>`zrQgc8a)~J|REaIJ)4HfCq}QUej1y`>e4w*L zb0KM7@2vJA?mtuQzq@6<^8=+DSm_pFGCP2(3+58nw|P~U?Z$}gJb&>_ZRhzow5-Dh zv`z3d{J5}XVX1~PV-*qP!OrAC#t-!Yk6{>r68(x&w^A1{)38@pT!b8>`AiAL6EQng zQjagm>9+p&RNk8I`=f-Ek@`UVk1#pt(A2g&nAm~>L`x%~07t12VScAHx^c`Z<$-py zrp7AP?5ItZAR6U8Y6Q}g*pOwh(<wfwyX)QdwofVnw|;oNf4%EQd-TuNdriCI8j1kz z*fZy%Yp>x_*53W_t^K%gmE|(;H~MjHA3<gIBu>6wlTCGm`>yCs_{ye)&<}ZSstWB= zC&-h&x7ue^>92XJw7=AW!a+Yd&%M=#*Ya~%F{^GC#C0sQ<>qU>pD<uJr(Mq}rqafi zDk=-~S<#sWu&{p0sXLfbM5kAZz&d+<E9DZ)X??&H6}nJV$VETMuq96JnIAd4M`PJ6 z4Q*OYeL<5K{R5@_N4hf|2Kl>Bc-*FgWX6cmFKDK>wWMa{%s2YGx~OdD)86Yf>@mFt zhceH?41>_Al+QyR)!mn5vEpI>wtY3DMm)9Fdn=rqBBkp6x^rIiqjPF%B8LhliT^?C zO^%Y}icFdfy%;9$&Pki07vedW>&@jLs%4lsz#UBZ+_sMH&cP0OdF{=~P?1pFgMM8a zf?%qU9cRuPTl>$T52?-hb84RPU7v-cy>(s<jeo>`)=y=QONKn%Y5GU8j7-``ErNym z_%@i)FSJ{Xn|5N|C`hQqy5XHdgr=>|c13cVQ2ZqD%YnAl=-nbp$fYvIRD_uEY7?OJ z2_@q>r7?x8NZR;1wCqNl2^bN%TfXt}%or1B;B0FkP$K)5u9oMbB3SU^%EIC;ks?-+ zqyF9$+A3NlRU!1sjg{4RS4=HjbSO5&SB<(B8Ysu<XI#5C;N?b((wOni$Mto1YN|;k z@jMjbQ3$&m;>$uu8M5q(HG+CIU8WF6kXR{DE}<PC$0f&n%T!8yEFK^Bl*4l#)~!*Z zoLOL}DCXo*2Z!8?(pjNCSFCLTn?0IDtyy@tbXq9f)D&6Q^K<;p+X$PhQLt4Q#30m= zj%9JLnF0jYX@};8bO|GwA{djXi~_o>pw!tpqmbwGt9bQt>H(Fq4Pn}4GdlBUO@*DA zH3C|3*^Pj{y}D*CW4@La=NGFq>#Cem*~}PgU7no?Cu^QlR~X3bl(p`4A#~fJZqutP z48Li^P=d7X{nQ>y=2q31c7+=xQ-XlbK;t1=Wl1c1k-~*?8KI^D7;o9^wKp~l&$qQ+ zgkG`PEvA;TK>{M-qFAB6m|rXFdb0l98a|&<ZPlJ;e>uIS7(YmJV(naaEJm|3>~IIU zcBUQV_crqqckJasiU%43@oIy9FN6a%(-<{mn%~NGF2TGl?N-sDD$?)N8QUp`m9rLo zNB&H3OWB6M5xws-3r^i}YR$^0NT))xD5l``0lbCi+5C=}SsU`xZLRPO$4y<=iE(e! zOw*_vBwczm8lXSoz1gM8wZ#RZ@=R+;cGF20s8UFWv=*IV8A`D`l3|LoWClv3X#>^E zjm*i8J29{m*QE^a8r!f1hmmoKuchV%Reyu6nwR){MnV{B?5D=qRMJTzIk%;>%pYSR zH=KF0eY~KW?DU|cwMXK*8Z8|u#D4TQ)F<vV)76HKk|tmG&L}RgyOdR5?)*hW^j{#e zn>Lv<ZPF%vdQ)vuXJn7*hCdm0sLXp>@g28DVa3-&5TDI0;0~$bUuO%rx081F8si-s zxUj2CF4Zcupe+`)x|I$!imtgwSU{zY4GVQdtA*lA#(*j;UpvvLMzfmf?(*8yT}ShX z>Fb^1d)9JCrN{pNP`Zn`5)9ie4a`Pjs8pwyIKJu+&H9-?zv{x%l-*2yft-Hh)cfGU zUN9QJVd<K<xU9~{`vx=G4wIz_cLi-i@~}N#TAp_wmavwSpo@Mh5;|#S43FMZ#X*eJ zLhfSUD~sj#2)PJ;+xAKO%c!`mg<i5@q(;UV^!qJ}iTC?=>b^-mSt;I0=F8C(7+Vj- z%~U8wX>Z)aNbi?vdh}0q(N1#4s)>D`YPgp|xf(jA7MPLV4p6#|-mQc)?8HQ`r}v?G zK8GKT(aZdrU?)NEoVr3up*=gJUnNl(RP9s!+Tzmo_PPnR4%UVPMXh1N-zDw0t5vF! zQ{mC3g#jF556;fYQnx|$qRgqaVc^EFYqjm$;!=t4W^Gjk@sB|u9x6jzk`AJyiy#I3 z)8nr}YrZ==NW$8u>=?b5*8^cgF6K?}dk_!;JC~*JsMuO9qtAzRDeeFG2#!hgj9r(k z&TajvU5Q40Ml)%1R{&qo*f=Q65%Y+Nh&<*(I7k4$1&osm{wAdj)2uT|*FChP)u_+K zb;uwzv%13IH|lGYoPwQ~ZP`Rfy{@-~dfk>tO8dqCnTd9&jl;V@T|v8$lFS48&`O5I z3X{~hp$=b$TWa!>BD~&}tKd$Ki|Fv7leZ<VDKa~bSsL=)MDvrVAOyyg{&cK)DPhdw z)wNYLBfJnKZ5#Tcwaf52uTmj9FYvpPqG?tP{l2Y6P2U+VmaY@4ZKZn5WL(1=ae350 z`v|VNN(fCWuUUbE<7p|M=6s`J(HMfrvWjo&3>B5d#YJ)OwGhV=8W}<QAuZqG!(wEO z>*74zhZ6AFuV|b$1`-LZl<9xqnG4xnFe6)f7V>OfYu-w~N4230-_0h?5-F54b~j<r zZeDX^#op<CsBf==!q@_EM3+$`=CxHUVIssVF^5c=SDU}**k*ef;=H8vC*C|-IE0>u z^xdolrg4?^wGm*$^DSV*I=DC(uk%YGRvr<ZxW-I8-8&03p+?>dqBf9&96C<wz40P6 z6t3Pc<5{;n%-sm^#&9}2`Ti#|M8C$R`JfYM_-oqw;)-F113N>k4gISP`q>K*CWFZe zEU1$fI8cXjw5uvt2Ou0Dpa-%t7<^R3JWGEZ6XH?rd78YA#b<y~-HXp;u>qT#D#sIl zLroRxEZlD!E+=Z+;zl|~&wLE6#6p$VvuS?Kkra`m+de=CW8Hg3JcbdFyg1TiLgoo` z`T*AIRmL9fUhYddxL(rZ=#D<I-g&nNqaOZVMTKu2a}ZBj*|gKpU!@MF$&U1=xR1=& zR-Rr&HuPWA-G(l*-D%d?_$l7jd%&N7?3L6BX@}!a^YL%1+ZrL6)bzIx$rDVj_E6k) z>4O>J$pFeR%RN;jHH?u8y%+YOy1qLeYZ=&X>mSI5wA0k<$EH7hB-=R<o7n1XfT0w$ z9l9gATPyx4)!W7ir<l$GC&V`j+;*~90g{)AGn0qafyq3gJBaj!wI!peU53<2fkyW9 zopW~*&C!hw<3i|VqHesAVghllTSJ-wH3C26vYVLABk_tqaa&0sm_)jKahcb#_)pZ- z7S>keCfa>UsnwOrOQ=Od`k$kN1r?AISviQPteF#FXaRrKqjRIU8%Dq-A-Ej_3ucX8 z)HyI`hXJmRQ<`TDEpWydvDOUcL(T0-I`%a*WM;UbB~Hebfg)N)`uz~5@mfJC6zaa# zwZEu!Y+ylFtJ|#C2}q0Kh5oWC9lYq~X1znZ9UR}`!%e!_+O)0q>MyA}_87(0w!6xb z{do@_@BOx<y8SaMTa8mdq|I#J3w-|&8<HRaZN)b!bkhx4WM?|#u53u0uq&PGe#0^B zU1`ze-o@y)L)7GfE%w4_3ac?n7L^xZ8p84PY%kmUE-sSo{1~xHF>R?}5m$~k%D(J3 z5^zv0&aKJ1z)5cN=z$bXf6BP9hU!?TBUBsLmRGDDFglI5Y^`PsF1vC!fd~?||EJ+h z;~QX~wqy!RbEdM4L}V?3kv+E-EfsGjMr*;K3NTjq=J@^~EEAqvK;jdB{!G@*C23U| zKe!R03t&F6s%m9U<;3?1c(W-N$}J_~U`&@3rWJ^OtkHyyMVmjxDla4{95l6bK;$v| z?2+%a>gt%20$70fq{)u9WHeir6^0uH>kRZa3%1bW7-<%n>eUij_NzD#`iqJdwx=b+ zS(TSccCc!*<~iyjT;Yt$wh4y4LSZq?`qZ+T*hR{fpia~>*?6&H9rNdzH8d?vh>PL4 zN__XXu(jiRu(V6osSY@e1WVNpJX@^k<8CugE-h-vdU#3IVINx5l2+HSwjBjOk;<QT zP#BEZTYh2=n);M+T9bP3Ym2vE_~M2rJl^qRax_1j)U1K9?(sIMG(A#$aNAlhov|aY z{O~(VEJ-rVgDyq@5?HWIstuxz4T-4Sf)e`WR}+M?=a$$ibHM-4dfe-L`Y^}+A7qaE zty+N1r@crBo%qxIR{ogFt>1>fio0$+g#X%Q^Z^Lf+P;pLu#!BH=Rb>7UqMadkoCy( zPvTR--o4j;w+p(W+o#Ww{_U#V=@Zr-H4SNj_xo?1eES}Fme3cEBJs!P^7jxR)}GR- z*SqfaQX(P4O6|wm$lF6ZayL3EKTF;o<%@o4z2|NpG|4ZKzbBnn&uVG<9Uj!t0f_#0 zhtaIV4>bA(j<66O3sdh*hAKRwko*<BHA(&*-MypB7j*e)U4CAdr*tuT$Gj1Uwt)cp zalK9a0~v<&i@d9MaGKXU7df=+eF7>bziWj&{X0#b3RkFK1^W`Y<GchshKoUwrcXem z?v|Gn{CL>peqFFDt+HPZ*wx-9>`DmT%luaIT+-N8;w8Y5IwdJ}_e5hPD}I_>wqFx6 zX8{0fl&VoJuwUX0qy6NLm$Vx9rqoGgbuB_rjQM#H><fF1(Nc0wzq_fsuXjtcBBLhA zNTLJzgi<QF=sxe3lC#4dEOD013FN8=t_N_m7l;54ZxoiCBO_3rHbJiB;GSkHty!3G z9ir;KzFZfF&avZCMd3FsU!*vvHDEMfPze>KD8JLf6_-uA?Co$pzt$aJp)lY4$re3M zluSp_i#@=IY|{71)_oVc(Be!pqQ?S;7!783^MbZ^S4t_Hr3oZU5q~TQ1RIik?oK?O zMjmc>hSR)&mwxm&kS%(+>bNW)l4$uD;)a-L*%6P+c-UE+3l6*#)>YS9X3)(p7)q7@ zP$<8`5ykqioZp0RZ6uMhr$9v_HP99tP`O4BAtCAQnCDgaAz$0e{5EkYnzt-m>$Xe8 z+hFVB`G!2Tv$lZVgo2RcIPF@8`Z<kW5G7V2oC$CbtwUBTH|9G-8XDkNu(Zo9&Of!u z&K#NGIGr<ieVj5}(JiBXd8qA(s?2G<S7nI>UGH|K#-g@<w7svbmZtff8X4mjiJ!M$ zgJKH=;7P1rTzb5kb_yI8k9cJIwHC#)wF>@#U2t^SFcZT>Z8NTy^DR}%Dbj}LfL(Mf zu#V`TYnJ|*E>BWm%;NeI_t7Q#61}TCIe%|#a2M~!)Zkd6D<{XD*=DQv4R){Oa?MVp z+F|(Gtu^rF>^!ms6IM;Viv?G%9!{;tZDD}y(|Mrx52&?2sLK!Ok_b`M+UPg4-3Vpd z%6VEP3%!sW1$kX}*gI;nK6LO~Im)Hl_I}%Y?O$v&ju|KX=X*EWZx6h0wrI1+b5|5x zUY2J^oQ|Kj9urrhqgbUFTcfAYoI$0E6{=NQD$lK5Md2T3nC8OLuh;RsrFDxsR)tEZ zknx6FWRj)ufU1@+)&vL!=U}c49X~E&0c#7YID5w}#4*tn8_ss{>>ckLbJm>^oHzKQ z86~Y%H;dk#sb$$K&*qzTY`%?=p>c<S25qfO6X#cjjS|u=){Sr7!l|htsoW$kF-7`2 zRv{bHP!FSXWVcYhrD$<dN3*j^DKk}~PljR8rl)Z8L2DzdgW+XNUFXZMX%bEtHza&P zW<_%pm|?cGCgmpNUbC__s1)2dH0Ydrw&<{PkXcZy`f{njA|@c5`OJ*7$qqNv@-Ecf zv6LfD4!1^)|JIFYJ_9S6<8P?4bfa{=lCR*@gkLVDr3GECFT}d`O^4#~<6+ITuGFm^ z2$D_9<^Uy_T>+BOk{I=}RPuk^U)o{MYKr`}+}TJmQm3Y3#kAHf$QKxAD528A^&3l- zl+npd{K|7L*|_#2;evpVJi%9l8MASvcz`V3IfK63v4QI~REv3M2z+PsJYPE=m1;&? zteQc*5fqE>;z@vbH{B2n_$TAqxzM@0O{!1=2<vTMZrkVrAUqF1kfJc!wj15;ZMDaI z-fq+$x)*XT$LCNHF7a=p``fzTLX}u1r#_whpLNCQ*5$jP_k46k@cFZJz{r7m`*@8_ z9_DLbC7zpo6-IX-p%M2*BmK3HCIh+;Gr6#lj^+un(qDTd``N};`JfUExEgt3>L%Yo z&2krq2f3);CHFYx=&V|Uy)Bq@z58bIM0B-6coD$T85rSF!>J+-j_55VZjT-fpjoG3 zy}fo$;CK)B5*Uf3*aZQRlf^4{`d9l%<3>&5Db@T*?3(<O6v7E?Rs4&%p14jsd`qNw zRu!5s?O_aSx2h_gXkTp~O(JsZY!2t{xAGv}9?_bQc$@%Vi0JjWx6Usj{`y37vXtx; zX4Of3|Gjo3S9tS7DkVE*oZ1m^%72T$IQM16e?p55IDDeKB$NjH#TyeA1Ik`<G8XXZ zgyC9&l_jtkqoF!tOy+KKd2rg+vUn5Lgupwpl?(;wpjknE6=t%@X5T5BE!n%lcj%~O zHr7@kz8O_I26I|CFRj^Vv4o69;`y86u5lnu-yz2w2hK5>oVJ$B3pk&ZoX9676~GJ& zSVm;}j^%4mCvZ^NP`q%A7{}P_B-nRruhUK#HUHDuQIpPr8OfGj%&#(@(YqWh_pirF zwYqFTMd_GCtaTMJK7Ef9E1m@>Y)ZR?&axPXiinryM(1U7<%LT{C(SXUW_~_J#<VE& zTKSgA#XLE93_sHHDUi%fLv1Hc96fpR==Ai_Q>TueKAqH=eedh6<?=Jp)2wIbaz-w6 zj6ETtrMYp6zE2=c^Z{aUNx<t}*2a2|Z$iDhv~(Vvr4boDNtU@7fot3P6o}|!xxl~@ z;-+nD2;6mUs%`JJ34Qx6V!X*b0|X9Pcd6q>Z*)k?Y1*D86M-s>$qMEecROM1pri)8 z?>0r(b`)WAG76VZqxE(L=HpvmwdZ}dGF!j@5l#W%^p@h$7~yNNfpIZrzG>q{lG?s* zdtMYucg^j5x9ufS^?EYq3W6;T{<xe{o7U#M3ZzhB$pxJUTa*Y@9PJaF|HkR7SfElF zwxVVl8nQb*tBOa>;&#Pm(LvVhwwRa)Wwu-dC&0razw|T0U?qy358EKPM7E_pajDIq zJ#QD=_%!r1eR3P$>D8Ax*6^KDxn{oF5DPIlw}lA`swAW7utfB}OKb4b0aFISG)RV4 zZi*-R`8lEP6gJ;<!;|^qTz(z~(1Hwg<9+9LoOlD)2X#hL3L3+t8oC-eND_}kJQLO^ zjfD%qO%`AyQn}GoIhZOAQy5%1=M>WL;7QjXddM6*?u?s@kkJ(cUrQ$2K}<f3*<%x$ zxl~-9D;4t~SG228ojC+*HkrcAHXR(M#Ld*PY;9TCK?m+LY8tTM#3Vj@B~Eqvq-<R{ zyB(le9UP1BTi=%!NXITt*Z10QKFu38@^QE<##+fat|^#-$)QEiMW?v{X&Ug7KM_ij ztM}O=)`D|tsDWIpKWsfeBS}n(PIzDNM=TBLdJMJK4y4B?!A)A`P2y8hx523k{58!H zArtE8dx9o$C)$m<3l3xCxwR}bFOqYVFR3y7ZL2-ex*1b$c8{Zvq{V%%yh3EH=u1>z z>n<#nS4Q%tQwrKgNo~=DE*EwAoG!*eHemf@<S;1Cz#7EH3ea|G^uGb<4Nil5{VUz; zvkMd_wdggq5XNm=+YU5>I<c~XODu)_Kz9pV2W(4pH=bD9Z=vB0ufMR7V_<R?va<kK zmN#l<Tc8=9Kj0d#+I9~QT?2>4Z<n(-_;m`3WH=E0o-W(CjC9o7&qd#<55K5O!+0v) zUsY?JB9C)-tdMk8LTD~sOimf8T*jvidaj;H06U*EL|U&pH3*`bD|N|@woVK+_kA&v zx{LcM$~J8CiIFwDlEVt1grER+I5M?yX9QxxXw@mO2+(>wDAvsZE&wG_6JL}{WdbAx zi>yEcsWNSH0#C6gFszp@L9vQ?jWN8Nvttr;hLm3Rlsb=`UO-xPGC-pW%nDG<V@?C` zHDBmCkrKtFf@Ms|T5G@dBk5h42l7J}cit6ar5e-2Qi|y@adct`h6VBD&BKMgnH<`n zsVB?xMY!7z7Q2xFYFZItXqH?%gtNt}n6BjX=@r)^aO>_5QGpf2p=F?+DU!_?X5dT{ z2bSuczGFqjT~@bzu2ZXVs1&8M5Ctee-hfqPXNDbYE2iM;YRN!IK}my<uW@6P2Ujl* zdjd$AlLSjJ@w4ZkNpdpgz>*XgN{DGGV*^WFRAi-D>F0gtdzL<yJbgFi8oilW_u8rg zH}?$?Dxw>B@Ll|==THr3*lJ(o{ePparp-i1#8a6;^6MfEOK;x3D7^Y2<_%h%XjM;% zQMFV#K0Xx()n(@!)oT0wS133#;E&m5Gw`o>RTr>eBp7H1>)kcaDAJuW9B8QPzf1!K z$i<F<_C2{8;XteN*W!tNkTwU%+f&fm8_9DfQFL2mz}3L4@MOl#K<HNlOf_%-?0=(s zqhUYAiyu*g#M@}wim67wqD_TqilM1Z)ftjF@FbqGP+QhU`zH-44&W*WxFP~p3S6PK z53Sk=t}gul99(Jde)D0~obxG?fN!{~2B&<Sr3ZvmvHE=4z}BIUi6yB4TO;m)XAtfX zV_>g>WR+C|bb@<BhL*>l9Ng0T01dxBaBaV>Tp$;#wt)xV@jkZySi$?_)kCb-;PI(U zF$$_cykMb`Mh_D5A`z815j!}5{Lv;b<Vn3~#2xEf7@$ho;6w!=vc+b>J*I%kF4;G{ zA~10=N&Zi@c^&?!7?HJe891UvmcX_az$p3Hs_+=ZWV-OVR$YkxfbHxd3xED?05AeO z|6{t11D&<;57)-H6}159x*VW0e6j)Bd3-Wgo{U;UJRNa=PYp7z-8R|v!@29pKt0-= zM9&o3dF$~~JNP4!)Pa1!JWfF&U%8F8&vr}S;w~J#Qiq=H9wvb9;oY&?gq)qPbzXjZ z>`GK%LDX`WSE4&q!A+Hs{a(ti_sq^!u)VwHkm8&pF7EQB@vM83jK3ZLHnw!TU^x!7 zM|yuTtXe_yAbk4ARJz_CJ!beMqz_9y_j%Oas{rnmU2rV)1d#S`5mA9Mcd7AJ0)<Cs z=u#)ZzH8+vd#Au6m*8Cs1?WQWzvp^ysk_=|T#XL68eNrYwf{YE(h@N_Zhd*Z8^;q; zt?A#>cB2i)6R5zfcSC~p+*+v)=w4ip(iS<XFom4+DCG2R^uZPHLlq_${i@Qe_d4## zF*&>VTR64oS?}Z9-^zYNm1Zkx`(%-@-nY@Cv`h~*px)p8*_zP$?`^OA_4OR>`0KZ? zxt3M8lm-YV+w}ni;0=BGbagv^4|wO|?yh$Ux%r@dH`lv^r9qcgd>Ya{M5-N%&Ksv{ zOamYPY54dL-RP&}|H6s(Y|M5hW9GT`J4`gVi_&^sX^mx#JY4)OPGW<e36@XvhWQ%- zi_aI0y(xTq3Cu>pA7H(DgaT+U=Ik;q3*ds9I2*>W1IJ6ND_6^v>X<{4k-M3le5_3? z&HxZz)>{h*v9Q64%2#pnfW8>6XPui{XJAFVh;rn34#J>g22T;>_1ql;UuUG4i>|&% zggNTT!=V;8%3|3%t_KuyW6%t^t>RA8Ju^F1rDo$Z78sK7vyB9xmqvV`ska1y<K0jA zY;hVJM9P~l;!;GNXz9)nZaB70vMO5&rHdsM=ZZ@K>3$vd*{y6T#$J|osCc@B4ng*~ zyjU}Vs6TdvZGxkh>6Ybp<>mFWI(MDMXZXi<Qm3*^r^nN0z+IQIyM4DDYg_}8Dw-7L ze?U}$=EbVs$eZ}nS{md#Uc}gJFQFq_9=AkRtrGulp)fSX?eY8+mt*-Sj}0Xx816Lq zlxBp5w!k)?voc!vhGQ;eT%p`%T0z2)&tVLUmDQElOPQrUU|5E0*8z)u5^^~8riOf3 zA7Dc#scvF2pFeTp*yQ2-$*E%}PH=yGVscYaCrYO$C51eu%fzIMA93PDcr|(0y|P48 zmWr>i#Ab$Fs^f7+FK^V*qaXe4;MX`hVtD9a`2hH(>kY*af;rJ19VZ<a{=<Oydiz}C zVIiK*|Ea@*ziqWgY@U)6KW63xj<@O*DQI=d5ZTp+dWh9+oM~#!S*_8FN!8IGbKk1+ zKZz^P)S-H;4joYzWY_h_O7Okew8%egS!5V0oqTHcx?`l<AU#M+zZw@?d-kk%8;z&b zHOZskgt#Rx7uYb6<+dY+L8$i$<e;?^X^@$bKVT}1)HO}Z^M(i3I%oD(t^}e={a1sP z<G!@74tB=GXy1;??d8T{7V-NLCMza>_cYFOOwiUk*hXJ%U(Yl{({0Vz!_9izl|cm5 zrVsQ%`=>?kJ1r%f^uMHzeI{v5^zXQD)tZl{TJv16r%WJ@1C#>()>JWC7MIKqXmUDa z8mX~5tcJ>?0FB({2+#MjO^jEMM#|a-CjF4{%YC$Tb8g@oY_zXN?y01$BReB49vAD~ zRAK9S{IV`xx)=}e4>byZq{|=c@~A!-pTN{;2lVcz^ln5KBf=%vjx@X@{q;^AV$m@M zuHG9T8F)ae5P_+<RPS0YR&G@4J<Rgl>QcqniuDdD*!-bN+o^&)1+PfEj)H%KPydS+ z?>TPT9+5#Odb4mvd)qs6j_Zia5;SNPg{zx4_@zQ9E}p5r;=Rh=59H*<YEOG1S3p?a z-9Ffv*|HjdX@1S;fVk#D1%(5PYi>Ahd-1nPWZ*VIP0GcJ;zkMQm`7X@rLh!g26Hqc zplC3;7M~2=EbTO*F0pyH6|GgH@8}j=sZJ1+&tEi*#=J0r7Z^WNhntcL?U3g11}wcs zb3um=>8;swfRj{B;A(YwNeJ>E9dm}(zygH!vf5*5nxxxa*c%JIRkOS*0~3UZ+(e53 zS4--wLyN!$glq{bpn*=CFcIdOa3|wiNxhJ-D)R^hJW}UnHsD)hV_+?A)h1^E!g$K9 zLGTjgN5;lQgRPGysE@nive{_3fj0}1O+{X64u|IhM#oAl7_1+E&elf`Gk7%wF-{C| zGMZ58;>hL}H<rs;NgZ<$xoq5o$=N3-olE<=CD<}*$Vt7y;EY*%py0`A0bwfEjwaP{ zugzmFYgej%ChsjK20m`mnKSJ}(6^-hYzl>bwgzW~Z#D#>TW;K3IZfk|{umqnTuD&E z^yhK2OBs=v)8V{{`Ik33Arf75LmDWKQqh=Z3b>!)QQQD<v~-N;zZjN54{9jXX#K-r zJgDuEQ`3Z3v6Umh>0IpO4z#3SXVM?(tq!Kt;i|*p>G*JMdomm*VpR$0u*2kSZp2W& z>ttP^Y-m)NctKo>^^RG@bEQtF<OGWjF2W-+({GPnF5&wWu0_{MuL~A~E6+~wRA_i8 zf4N2KBqBv8SaM(SOH^lTHaV6YO=>W3H6n}({vwdC;8hNxz+w&b&cK<@nxYq`Ck#`7 z?i<bswdz(Q8vu1&$%MQ%X)w1F4Zf29#Kl+6v7r?&uUfn+A-8j07Zu;N7giTWu0-%O zx-}FlhfL7&pfDm3-NEEIq?A#PniQ$>a|nEdtg0n(znqMW6Um0aQRu31JfHTb5{Pt< z*FxpXlYM-IhQbV;a>K(o#E`)Ln%IhZ<0v%KcZ!t@MyX?zA7j$65Tv}t2y^z~@D7oS zw1sJ~bJyr6#=%PCH(1#^py3FJ#<r7+b2`;R=aJkUVLG;SszS2kDKQxa5D#NIiv28X zr05!-R_RI?**t<_Q6M6<0Zx09VJt4-5P!iHs?5oHi92liX6Nq2LwS)oII|ihJxR+{ zD{h*-Sk{KXfmvtI$uW+<MCa~Cs%+_@wrbqCszFMpNY+{wNQrQu2u6i9LB&}urc3oo zAe$cXl}P>!hGN;I7)1H0x#M|I)lz<H@wisi)WJnK00()CH~D3}u-M{GOqC3MvrUjM z49yLV4lNEfs6WezH|(SNC7LL%fml`AK^KcxQJ5}XO^y&d1vsfl)G(;TWl|v=uFm^v z!Ih@d*5Ab|S7rF4M7UFy9YBXiP+xI1+If?;X5F;&DP_5t;nc|Z_kl~>0r&%cI$Bsj z(JLJ|B)`Kkfj{8=rV1NHL0A&B)t+n^gJv@SOnv)ooCv2~z@z%s<OPvGGVM~^F7Rv0 z7NGj*F!S3kF0JD|<f8vqG|0c_!okp>4AXEJh!3$4H#Jj@=nAXmX>L>voOD>N_7`0Y zRfl#CRH&4!r?^si$N5y%?NJ{?c)u3Zx3D<T(64IST?@xjd+n)sMErhChAou=QLx0m zDJ7Qg(Xsb=Row0LS9)V$SMNiT{E8v}^#KModFnF&B#BJ)A2f0eW3)&OXVo&<3bpMS z6cq=p290Je^Li7REY&7QC^<Mn#f(o5QH@dUrmgYh%p;l%ARyLq8<xq3DfT+MdO>=Q zs}q361atvs@CvwM1p!NhM2e#e)oz+%E2}GGWkN%H*9?JVSNrIon^(u;kt!0c@`^}q zeQ&OYBqw-oRX@76VrKuzw8Ts+a1V2?_Bkqo>tZ7Ah7rBar<E|*U7>wyTR=gM@X&yQ zh_*%DMrenSk4MB$!grH|APxm_GM(bzq@adD_GUC<=enaz$A+*9e{Mr$+0N5&>lk8z z=r*>JY3ZuW>1(7_I*TQ&J#@+hXI_DXv-8h;03K7hD{iX;B;!itF^iMYABU;wh8GVi z<lPnc%nAtfAX!NlGRBmSTF91zvtcSI423^#9Nlu#c}<pg9~PGqC)i1R77Iz3x_IK` zaSnV;W+)As+Mj-?ipD3K=o_1ffG9+s=i?~2Hy5kdE*9r18yl|bW_EV7X^$NZTy$jF zSV>jK#;|N&l?%?qrWnm%b7)RsXz6;Tw1A_qr5lyf_3Q5L#`WtHlanxz6SvGN*^w_+ z?q=u93<fa6RwOLqXNce&w`gYOd3|w}@NFXdal(D2V!llt_8Bu!S3A_8?q-KhV#L?5 zrv%Br7`Ep}Q{&ORMeF^^`ZF4#-fJ&dD;bEolQNxdpj@4?v9+1&Jy!N=)Ceb+NWG>O zsO@dL<m2b^%$2eI<4+xU`=!Fjx8;EbS12dbVQu+oeoYyV;{<Rdl_qzXXf&KzygGZo zqr?;?|7tu0_Eg(-`SPKcW^TQ8W#-V>3&pX86Juwt9LO{v@Xz*8h53%OMxe^aDF>{{ z8BFPP+NQOR%ZG0LzL@^#7<R9%EY4qxOm(x~y(9$v<^#3yKa1N~>!W$J?77X_^jM}% zNU}L=8K8z%*%1A{;5k#&1AgGNNgw3w|NhXF+~q6L_c0rhV#r3r+||2R5F}R1^-e{+ zu^@2)Qfp>{82cm-PK5o%HdGcn?mA0KDctuuS9Bk=U+-|D+6w^qYA2>sQ%>M2uc*Y} zHDmqaZ`1Y$xb69r4&jcO`%zH>Q3C+dsbl*~NF~t3B;fWDejbSbNtWp9yAJqOZbLTR zGBrwI9pb>7`Qe!>!<hm-b5gm}=w!ueD-3A`UBMzEFBe}!ayxkBnP;DS{)GgG4k?Rc zwIpS6Zl2a(y|#!w+w#il&CeoYU3=%<TeoYib3QezysBgKoKMZVycYv(*6QQDGDn+p zP&pX6fTvrSG5QH))}ba)9!@`>16oe684*(WP;vpHo4{Hg4Xq?7m0~OZpK662El^6S zdR46I21v`5eK`9<8KD{nKoQ2G4qKToD$ZQ^=FVrl&XtK+N)JU!n?gpu5Jw!CzH@mD zM<@|T(&Z}~o({>Bh8fJ}CE`f*@-3W)7RY{UassLs6DS;I8I{Y&C;1kdGvX*ogZRpD z=+@r78<up5pjF}(n^~x>O*K{F7U17X!>YPCw}_1Uc3ecJg{$)xNj5%88+)xb9`bEG zbmV?*4C9I5n4MxOz8KkpMruxqa~N&G$@KgS^Q(&OnF5~CqhS{BFk?`z&U+sRl9H2~ zK1lsv+aptw%Tz}B__p%75>AX=V!O;fl`W|WeArPpWk3#{mUbMmY?C7cIfIni&gao{ zk%D5WQyM6C*QL8s7vhav3{X(wF<D+HU1tiA<iVtPf|r0zlTF<vQ{$;7S=3JoN~%;; zSP!^e-h8O0-o%2vMA{f@t3Rb0eoB|$<5KScY#|J5_nN78q?-gxr@7V2-?rMG&FXC3 z@5AJIaEV;K6W)<DWcwtrHz44~Ac*4rt5o+NZE8x~S!v{}XZ3BkEI$cGNT9OQqN)B@ z9VlBEW@kx?RRXDEN@Kg;TTMmY{x#JkSzp_ZUaUj&Y4d@2R&8c=1gFjQjXv+FIVQR% zt(;A~?L<311U-yR=EK2xZd8Pb4?S*&N-B+%O1z`tMHiLBd#dwdrvw>pP}o+>gih?_ z*F0oH{z0m|mor_&CuB4V`GRUL`bx1rV(xtHi5TH`^oUf;X@akFUx~%}A_Y2s4js`a z8O?g9(6#8(+=5fdz9pHldLP`$#f96`t4lwt(KKX?ajZRQ)yT)fi7FqH<r>nvImx*K zcW7b^?eaC)B)v*Yekv5(HP8_@9gVO}XVW9gie!3(%oYD03DReKYIcAu%K()YbK?UG zdgh~Ck4mP$<W3uo_|xVO8XChX&w>nyXfe$w?n@4eiu8cRuu_3wSiWHA<dpF&11Zw* z_4r0%1m%5eZ8JfFVhn^=q7~C<%^#atVQ%3qt+*4nDq)bV6vY~Ix;f_$p2(j+G1O$O zg}V9@jtfK}6_~ke<159LR1u7Wnn6if=cW$yb37%|D<#cJi-rzQ9)SQkl2_&Y4R)Tq z7iGeQ+U(9Nzi3wVqraMITjG)!ybl+M`Hj7EHsYLs75wSmTw>UhC2FYo|DaVw0d2L9 zrn;J}%9x!Hufd(E^=S9D9wn#v2P#R>p=}_8*{iM7{5nRNCoM`Ho>A6We3(4x6`5Xt z1~tq<fgplnIJ$#R!ebCmv6?M;DI1A$b1$}gB}(^<ozbQOoq3<LOBOoo%Z{n?n7&NM zlFUdzhlbB%=IK$nH%$nkGaBDicr>htBagPsaG2%?OrEiG6r$}sHhfC)cLAQDJ0f|S zI+Grqd-ebhx$Q&emjk~K^2OmwPxi{!t<MiILPKt~C&zYFW&OAn*toLYa!yX{%cT6} z)JoJY(U0J-D5V~LE9bdn&6IEN!TSt!rd{z=cO6yrjSf^(ABRqo&zX~6F%@liS@w9} zGl<`2;l8r-x{4of*6#4+l6Pe0&pWNaW&9}F8JCw2V#DQx)x$pwJ^~~g%iFxX?zInO z%{+cqA~Q51N+km4q8zg15McyJ&b+`$k4$3Z^d^9|LVkh5)F8am8NY^lrFoeY77L<y zDSu<OFO|v8M5q^Iz)jx)ktfQ6vxoLTI5u%_gu|9oaa2hUE9Tjek$~BowkEs6<apF# zwfQ|~kz6$<iA}LZf`ag12TVMhJs0u?r?*H$X)Jo;CeQIUbK1#XJhs_Uvyrl^^L@*@ zi?MSi?qbs+(cH%X|Krlei4lAeiBJVEHQ6}NhYsZ@Ci0WmIv4Y2&g2gj^M^|L31>4G zLmcuXTQQVv9xajlH@dgmbP50z<CZCPf+Yu3C~jo)#xCE^D;9bQz$?CA5xaJzj-f?r zueCM2Y2q8+vvE}do0VHOu7$szVIn7pD85H?31=6B<99RQm|zwj9J3b*WqfrBIfv{v zD{HveK<gR>BAJs{){M%!je14sQs|^^n#5lBn@({pC!QP4>vW%Zj)%!-p5ab!5A*PB z3fkXiuxEx}`HYlfKY8~2$4|Zbif+%m`nvv@dhI7(ef`4ew2}NbWH4sz$U9pxwJ(3< zy}Cf~^7N6He??>b@pz0cxG_e)ZcO_Nj4@e0!x*;`01AIFJV$b$G}K-<($iR!0sR&J z5paL8?XDvFxv~R&NDNXI!1;eP_vN<l%Y7Ejhvek&bZ5PjeZ0cM-ymN!!^z>27>4sN zdH2=$T<LDBIVV%VwFFhVSxoMy1gr&<j<-IxHmT(&sPs?cT5y=YD~2pd$-u`SQ2XR8 z2t%n=HPc?08s!F`cx#QfZm7hlqKgp`>CRcdR>|<2s!^m|TYg(d&Kv_NYG-#Y3@iCf zVr6)osESykrbts#w9Yw~Bc^S=x!kIYc{F76!xmicvcQf|S({nr_lBYk1*M5P?fdw( zHe**}Z8pnxJo;hho)Z~30F&cOSRxS&n25H#?W}g;trl-X#G>s$k>&@gJ@P(#x3Aid z@=YhEFe$lLb)dSnx^2CKx2AftPJA(^?}@jf?Wo}NTy2*t6O3Yr<9D~O)L+{2d6ang zib;(r>vXMrp|thxL(Y(<y2CM3@SeLfsTGDx_j~OpWsuaecG|Y<gZAon*9zB$`?O=Q zxgFJqtGi1NIaQ+4fb!#Uw~LnVQ2UTKKT_IR+Vw&1?jA<t(GRQ_^y#tE!|Uc~3k9Pd zQt!S`>PLL)9wO*=&3=Sy4_ES9G~GS5*Uw6IM|jP(;Fu{elu@2>&XL4L6=zjAlyrvR zn1JF|#4;ZB2u{&HNZiM&kwS5;V|MIlw4a55|J~x%ueKliYWu-6eC*QhIL%7QkS$t9 z7x>LcM9i)L@w)ayv<Jx4dUrdxkszgFBkhS7Xze4j(%F!{MzX5|nRP&oQP7gGMbr?% zKy4fg3*i77EQ~gy_92P&dg!A6a*^`;5DoX?rah(xsc^VykGE=4%u)J=4$H^Fu;iu= zMjxj=Uu{3?y%|mIs~nHs=2fk0>LB+ckEdc=>NIds`X+QI&k)fwy1cB5Sw4PFcOnSP z_ffP}cM@kiS0x|S-S=y_e@b_6=`y3sDP08Q>bco-&ib&+5EG~BZaV9`nURrRA}1HG zLQ~f}ZY?i~!men&VXa!cdIAm6^LiNY51%H0Y`NZ}70lFMde{&L*+o>&v2tHOL9E{S z8~8YtynqA^O9-xDylA#)#D-{I8^(>Dcz^E3XNKb8UCixj-`#l`k00ah<3RE5_GmB7 z3=2t%RtssGU*qlxh+~s0@+DWy^T|-0L?hxu?K{H<rHItL0mnK2G0OG9rWg;SBFeB- zz_bkOl+?h5?wtp{clx!9s8T@Rnx_Vn+FQIT2m;Sfaulg@uC4fcC;iBh1}V(mbghmN z4Y*o5{)#jbiHr<|0j&VhFa<74{EcHn*Q(W<M-LthnjquvF5Xyl!Lr6V(T9$QFH;AL z$7$b<MHmHF%Tos_HbL$8f><V+Szg|Qc3-Sul7?9}c51{X@C|B=|M|(WDh@IeY`ZvG zoOSvK>8c7tu(1NNio4Mpu?1K$QTVcqBS_@+S>pmz;y~WshOFU6n7$H<kP792$EQU5 zDxyJxzn77PG2v#>^K7S195=9x4@F`^4{5-M<Ynqz9N?jIF=A>n=IGfw(`SFE@0$Na zJ3@GO{NwZl)T;5&7ck&4nT^?7)!~Mt2~|(#0x{oxrricZr-il@e;(&g!yb)ZVPh3y zsM_|>gKfOp&soubmR<MO18zEV$n0mraRF@e9ZYs!!`4B{xV)$kG7#eD@T`)oXQ%Ki z!}EKLhuADHhVe+^WifOHh@>-Cd7jI9TeL%<sAT$V7+uRX9A<o9G^_E?x4n;VqTrRl z<k?b#25fZ~r$F->2T%s7EE}<>7vUoaNieQL%z&Xc$YvAHbkIFULTGuNw?%_I;##ZY zj4@Cd1sNycY#0q(-@E}^V)~Bq2=v>sm$3|NIa;v*FD6lJ0s>l-t%4$;!6YB(+{PIl zV;v?A(8=O!FGvp<fMQS-mbIjS;?)~0_3~FMQrbYLPzGYha(n9Rr;o=R^l5RIni}Yv zfGR2BPE0@<+F&r(z^w<Xc^7nDlrcOO=o_mMKGnja45^dmdnMddUiNU1J7b(<Jd40; zO4v#ThU)6du_08>uK|%@6vbA#$UcF9=BCNQpPNxeELYgSpAKV!B(Kks8lz1{(quH% zlOP+0sdgLvUZ=F@pa|!-)P6Zv;H4z3*}wnJ(7fXP;tgpU&l0OJ28Kq_2T&t<=UR!% zl$AmYZBR6bs&LFkEpHH8a(_GX3i-m&N@e1xE0(fCxdhYEr^%zP^wD?>@(y;LVM4PV z@+V`_DzoEB`pXN8w^F*#Vis$%ygw-5_%hO(us*Hfewt&+8>65w@+%eCi_(N93cOst zXJCYfy_Ow*q{S?dwzD>x&I){qYS<9v+w$U#{#xMsq_uQd&C~wU*J;ZUFV>5zc_$8| z`Tl%PdSAZ9+G9wiY8e-t3P@`Eehnl-tWaxX!>S)YasD&2pFVN!jngRJJGBd&s|Mhg z=%Zb$E-OZ9BjawWwD`_(H~D@<F0e#QqdW6f>GIXvH_OL{uHvJ0==enbNFJtN{?OFH zrXn(li#M;4dh~F9lHZBZiA~ZUH&)d(os+P5si;-D=Bm`_(9m?}Xw)dbEpZFpgI$Dd zSR^6IbdZTXNk5^+@MWu|00l-{Qp?s>gWDEvBtkK&O=H6-b6aR)uqtO*wuRJKrg(+Q zA7eV9yrAK(wymph^$NsCx>PANNz2v>xQ2cUu#8hOl$XVHv=|yN9fyOYvX86u1P2S< z+zZ_Hx>1adfpZ7L#L`y_?=gC<{7KkYhSJqJ3YxW1fAE3KjBT<vQX^}l28HcrC#mDZ z46e#Z#x^eT0f#opoEq6CbS`YGWO*j9{0?Ooh23NWcRpZg9Uvl-5?v5hvWJVY4hM0z zBBLv$JPWxd#$kt3Sov3^j{b!%M)TVxa1CoQ1_ame$?RY!PSpatFc90~Vv2=D?zW2L ztGC_~8g%6~8iW^hc}9o)#~r8BW?1ilWrH?@g1BBMI1*lDaN4B6N4oc^<VoGXUFdMy z4|31rjRtDF<Cwv=djld+JCMNMVZ5HRzbg(y$?I`6XuIhN&C4fgY;=`Ny)Qsolv2K= z*QPi7vrwWq$fSbvqLBM^_i2&Gh^f2u;Df%}5Q>3$M?)xzybZQwFXq>~xz--tWH4_Q zK}-J)iD`>?psp$zeMZI&)%1{Jm<e|(FKX+lP{ky)G}htRefI>Tym)O)ld|#z7dV3h zL;}I(%?c_~@|wATZN_@rV*8iHhv_K(E?I1WU05Va1BS^QtQ=`#Q3*qckG&J|D1%rU z;$lES<4-!Y!GH;NmZJP6Ifa#2T3lFIoW~#;EY^8j3<s|1%4N_QK{AK%d_#{nYvco; zZz1)EI^dpOs=mm8Jbe|PFaEHzg1+IWT?{(}h6LsBbxKVOk14q0Ed@dYkPfGc2c}lu zhXJIiW9A!lN~xO<a*nvJW;bE7;gjP}<%vQ27xDP0_3o=UY`)%QixI#gaDrZXpFIn` zuJ;*|E&i2%D<Ic+RxFe4I|YSw2({%0iIGr<mf(KQ+Y8>|#3G5|eU~q?%TZKrAP<rU z9RWxQy1qAet0w<zau)WzxhqQ?7~L*<9xlRA=alBn<xaT}+vwlevffwfywMh2B;ZCb z(5$<JE3w^e8w2(}7rnpUORT-#$}Qw2y{LTlaGZPxUQM~@u<51jtsC3SKB#kj013(V z_5Nzt^=@+$Hb)tK#Q6KiRU`>=Q1)JX6~|rGK9!^=jFksheuz{(mi}?8t1tQwar$*B zn1(#=Ddc<HQl(Rv491sw%C#StVsBZxt&9(8*SER9uGICWx7MOw`q!`it$f9L(@*Q< z=FNITi9dl`wBG8#d$>X)V&Q;#v(ZZ}z1O#{Z}%<kb$3?Y5BnbGqBhq<%J`ko$2f<L zOPtI1!u2toVtZ=j;y&i0snAE#S|39m>tp6^Lm$=KEjF85=w*$*ZK-anZeJkq3ePv! z2d@vVZ}~FnW-I;cgLk<%6Y}lc+l;SwooxGL8}q(>qwBLnZ-Q{Fck%3u%Lj_5P$M<q z*Q^a1aA6&HS8->CR+sT0Qqmkd^&mkxGp&@E%!m3#T&#?oZ{~KHpvj7yoWHgRBLJJD z+fcf%dZs|E`wpjA-c&qO!8?CPrG23~CXR^_^omToI==|p=$$e}m<CSJRFy9iV^6|A zVh<C?*{kY9C&x`oGj_*KEG|KcOw>z`4JC3IUW}E4f9X~Hmed@bE`r!~b3sW_7Ly-K z)A8~FK8!_dj1E!zzR$#)sgz|qVBtx@3Sj7sIHg!C?L3NN=s-GS=b)2RQqaKAXd$49 z-I$7F?8GpT&pDVUl{L@4_gbB9=wUZdxas7L=M|){QO~AqE|p(Hv_YetLp!J0vRp=& ze`T?PtvFVfG;pQ5C<W3y=u$*yWti=Q%<(5_ipOG@762<;r-ZL0#ULp<gDNEp2<Dnu zbyGTPMZA#ZRg{BByEq@~S_SU=3Oo!ypA@os^BiNsjfO@zTg=Lld8g>bvch<W0ZgWY z1@%rDn?1AGw+YCnTjW>zi!Q$vD&~|bpm`c{p9d>#^#>);wdIQ_kHYe>6?%^KdP0lT z$6t1Od+<}38p2fj+|~md4+>Yw3AZ~nJnDx&#@%p!YaPNPdy%l%y@^h2lwm8FO~4+O z_7+Q<X)NZ?ImO^~DJ;9V{p#jnczV_?W5~HNwZ6Yg06}^iq`1Ciac^i+l_YUH(adpn z6Y;bjhVQ}<#mUDqm8yr{k)DQG3H_vN;60GY7i6^)7eIY<Zvu@R^Eq)ipfh6)lc0X6 zd>=D{@njl!ksVi3rAoGG6vPqefd>@;j(B2mkHUQ6zi~mPKdAx?bmFx@=AWxKZ840$ ze)i*^xCloJ`B?Ju-03qHy#sW5MEqqriEs-hZn(Y5vc}^UF|9)HQWdAB$nh^+YtzG+ zB*_;Thg9ZlO%i40m&@kf(3vLXSC<#7tfi3`V}sXpj#NQZ7kkNwSCAxBZkxuMjcga= zi;-9ic6cSuRb8qanZ>FD({~zlVD~SqjKIEZgl5@PiHXw^?PPFMJ=f|Dq?{cvBnj}m z;5CqsP2afydsU0RFkBcONlJ|FU7|aw?px%D6=@xAR-oT2>5k?gJ~!AJ3jp1*cmNT` zG5J7QK&6%eOPmF#^@YdDMTxE*H#ZEZH0%`o<yZo1W}Tp7T;93LrC4V)<e(s-#;tNJ za-3I1H%AGRGUT(C#Y6>C+~gRNnyEEnU9D8%Npu&1wV6<co(jWb@GscqnN2j3%~EhC z0>k_B2Zw>O0tkM~X?Jas_&|Q_{)xTo47DUQE9u(iTA0rqIK2Paki$B{tC5CxW0PZJ z6BC(aaCt{jIbK>iwYGfon0Y~QfUSv{maSrD1|7xW17w~7fDiBI=GiM4PKUw^4fW3? zISyY*awHiV8b^AYib*BboVdq{3Du$wqGWbHnuF%C(0sL?eL!8{c&%?=#owBL$=b{A zyfGMmEIDjqgG_kR26qH|<6}L0@|YEG?b&cD#5o=6SeRf1IK(kunB<;<sLRmG!r_tH zWHz5a6j0fhM5_hFmmT6m&RO?YpzfTf#6N}Q<y<3vns@b1Ewf1ac}{WVBYN3o;NI!O zm?n#C!lVCN7jwh-ITDRLRPT+kqI$Q(XRuiUY}7jiU@SHZHs`2IpXTUw?i8h=5}hh9 zD1+X@kpm3eu5ZiY9>z)|2qANDUL-ErlzJk*nREdPt=t^EutsY42JQRXqIT8Awqy8H zgsHcOe?+X|7mwrobAA|m+n>(KALH)!$I*Bhz~6_yJkFc`^cRbUPHc42?64AQM}`V7 z9i4f5=<>?t=<?+&>pTq&jp)zi%l75gmGxU`i*zD}?*D50P|YJd88h0_>Y5;)X_{1O zM~1C{;Z)J6Xy3Q!;g&^vCriHQ{Z5$$wIUr&4j=F-SZtYQ)Z5o;yJh~qih8ZAK*->2 zvjWpVd}J9tO!Hg$QPzj}#SrC#Rq6hSh=+lBqZg8NzbxYj?j#T2Lt-F=dyAz*9Jd^# zFG`WH0qh=+W4RlB(dVQzx!$q8O+L@%@>1TrVKrF50FlG*N%fHkZ&H2S$l)cu|L&F# z8d6)D9+w6JHMerhm;RMd`hc9cY$qZdBsXQ+UAK7(&(?&ubzjpFQ|I*g?vtx8<mzQ) zjQp=|HTH`2k})a4TZb@KE2@KvNqQ2-%SoPS(RQ^+eHH1u@>C`zL6cgg!XMj1r7aq< z5P`H4*6~2`+t6AynAc1)8z!h(cBG2Iu&lK=yVtyur8Fe1tk?%Q6n0^#Fl5L0&<KAK z{0e>b7zt#fC4a4%zEa5?#v+Vd6~P$WaA^e5Mm{;Xn!<3XZ3B!hLpmo2LJDcJiYec@ zpz=5B?1NS`@?k4-23gIR8&nJwf^Z&3#HG8&_$Aoec~FA{X#>YWt4tuTMUncZ&cvga znji*$2}K)VX{PWr9H0^#9>ncV3&ImhLgHnqDw-LL3D0^ukeE*>1ku#Yuk+Dt7D2ur zR#KT}I%3PQBe3_c%HO@zM3UH}Dc|vNiF4)ZyJb`?l15v3$b=FFh}fvziHTx!JgLa2 zZPRy>kxKc#gMzg6ZC(&!LXZq70Ej+N{kYt-%Hlz!v#}a*SR^9H$l_xcYH%Rr%t<}N zLo0n=S5C|P8bd8+rVIQ0HK=^DrDsD2d65QLG}eaEgl81%$t)wIS#%h7Jk}Kt(3wPu zfL@h<I||eNE7I=qp8p;5=3=rhHP7enq}zaUj1(Y*?qn!ux1&wN$>!VY3Xp3>xv{ zKYhoRZ9)OZYh+UikvU%VVr7R651CpLxVFX_FO24{S5uH*SXyQD-7%FCu;ch?X*ONX zw2OXPNZ#S<)%!+tF(E-S6~bHCpMH!WfKqr9B^?xnZXyCYFgy#YX!nr!_L!vi1b+)+ z#C-_`(|w9H|Hf?XOfwI-T9ZQ0y>{aD(bu_<10%jdOunJYQy57rM(9YMl^OsE9bgn( zC=B1B!NVI|k}Ytoke*kx6y`5fZ!eV@AURiO1VT&aX9I0^OkgP8*20h`2sO@-+6`NL z^<6>92y`tqG4Xfz_ds4fL=`klMZC>jgj~i7q<7{D8Wh}COl#DJW7As0K*Ty1$zUek z8F!;m$o4#x8Ez`jr}IRI7rxW1kfY_eSeacdl|%*RZ;j;dG>?WiVlUj<H_53KN>=y1 zCRb`iGM`l@V?JA5MU&xH!B+b<U0c?}#w^%ZMSB<~sOZyA=iM^_AckMSwQ-Basp`0a zTIR0!G2K$cNMnPQd;>NnaP>ZgO&mJVSl$Vhm+7D@F7qlGlC*-50Hju;c$}$8%xDCs zrmCg7%+S7qR^kXp-agal8L3G9_bS%<`wIFyQW?tcvugYfXrfWwToccOUE;GsM)IUR zc56805iFUu#?+cWCAX1|v((1p115b+I|SRjfXAl_0J=ga&KuE)=+FFWfn(c`{z9-i zg%W8mNX7NhHYv7B<K72OZI6DMPvqUqvgs<84i%DMrI7%VX3LSF$MSWm_Ih0H*Sp}G z->8DCaly4$TTLHp%A!>u41&)qq#&M9cZSCJO$ssM&^0}2G-DiYYs`iu!N`utX!SeH zPE^<BU+bc|jzpzLTXd1<&S;HkasDw+>+!dAQPf69`$GtOBb6h%lZnYlmnd+d-1TmU z5i4A`A$8F|5+CF{m9jzK=yl%h(=e!*wxgn>`#n`Hig_Tn$8=jdc}G~R+-|$dk7j@S z{@hcFYY3@sKWe!gOX#^G{iei^$VP|VE3RelMyK72xa%b(mYfGE{A$k!<`ELPXtyF= z>h~@VsAc(fx4YB}8QA0Bb&#@K)^SKsT`F8u^G4QoeMH*)@oEn;W9;A7dmyurpCajW zB$vH)(%|(z{oUw?wDhSrOQ}=@Yr&dNEp_2x*ZZjtsiqNM{SQEVHAYo}%fmtKJX6f! z66OZ1=d@C`xf7PQt4T>bj%x{7g2)AR%$s_!Q`8~+pH4aO%TjrBa?J8yh_eg1$Pyh^ zjR+3!a}DlpsLU|r44h}BBPo;Kykq%$y2tg5cUGIrF(y$5Ev9a~X?yXQ*PEB!w3zD9 ziD2`{4zY{z$=&eKg!!x`HBuLkC5Ps{3E_3t>L`~^YCKa!Vj#<ku?sXWPs?=2Bma1G z7e!;3I{H+pc6%fw?hD<RTV2JsnI(#2f5(CxH&rpzNXDdmTTymFtTT0s!cj;PhR8_* zUqn`A{s@fUYG}7Bkts3JfQckS@6&=JIMfNT>4IfBZ199AD>RW(P4n~-a%oDH2L#C} zr|(z_=E^OzSi!nk93VWr0jHws{E0#>b9|pjGn6eH)S*ME?th#jPE4j=WFHQPFDJvD zYB_nbP#m2bozGNt@?^R$m+V9#lLR5%Trr)>UZm@{7fH3#q1sd7P9?LYmkYN>Z#R@K zf;3;gif8TYC<s&HCuo@KK?qWUs;AZ(LozerxY$ZpsV>VU_ZjDxqmV-HQzDNHnUf-M z669I<*C{9fiYg4z%ps8WQ~?J(K?7Z)F9DqoWV^%XlN^M{C7oD8_V;LtL{L>REfcT) zliHUB^#xKUfd`H4TcCN4vNBB08hpTRU4g0IN2bl385s?ie$)W7Ux^D#nyofxdzd9y zT&W|zZ%OlfZBtYELMVMbJ%H;e-%?37=x0b33wqVMEypz4zS6M5Y|2%YAA|*nyi`e< zdQ&5^yjogY3RL8)A^wVrOC^JokI86+_60O)k|pDrNV_}fMaVIZ@DY5OMW|tJLa@Q6 zSy{trahQBdgnl7TLu?85T+?NQux+VN!$-3z3FtOqf!#6@;SL=F>4u`58UDD+Z~@>5 z6Q_5>C*pW<1c~EKQn+HuB~L9{c`}nAZe~$c%;_@!Kn(^0`4-zS<cCk5lxq#&Y4ta+ zUaIwiLzY%|zS-Pa!yDQ@oo@T^sq|Beo(M9flf<>(QV(uFNH=_;`C$RFr1@daLLUUq zG|>8SlyN`@rGltmA*$v+3F!dz4Dmp_qCx48OJ2aUoF)+SS9A`Fg5MJEJEP;y;X)}V zEp?;_@V#-R5c}W5v2T^4YunL`!rSdq%zvv5iqt~Es|-rPi5lI;yM-ayFOodktILyI znnMP6a|YvI50&yQDfr|NW+|4}x1+o@f8#X@K5OvnSA;iP%-i;XHbwrD1ZtqY_H+j1 zC4^T)_SQo+Nlgq?<Ir?QL+>k!9M~^<bpz?4i9Pt+aBOqEudL0vzIQkugxf?+wCr{? z4Z;pFd5S-&zHYO|URaxRUHx@+RmKHvuA8~qzI$~t<ZInWnR#x$9Nxz^KP-dz9u3qR z?Uj?h-?j`G4}8eCw^{%Fa){ohqqXfe2rDS>xkhGIfJVVZIA{zSy~$8)wV`;!m-X8k z31?a0CLJP)pa=IFjW}y9*O#w%pFMx-^!bbCv7z4k#(DQx+ZGq#5VVmkjvRbgjqMfj z)~$=|UmZ<oJ_U>jG+A!HzWx!HkuCKdSp-gqzMI{HS_G#x&u4V`xGs1pYl}X?UA^<Q z)2CmrcfVoHt9MtHEu%Mmu+?GK71wCOw`&X@=ceuaK<_}$K+i77!yWwVY|rIJ5vx9q zaJII01}D4ohsL;;p4H`f-7e^M!QC!gsXd}Z#R+|xTi{Z9PM@E<Qp?RAt@X&t2@9v% zo~xj!?CRy4`IWhf^IVrN5^Jf}eSGTa{LpZ1;OW9kuT8P$kvt!d{trf?mK%Aow!>+Y zxQIdSYlb^P$DN#0GiqTP+pgn29Kx=>_PUp*+1UsCK6qX8ZVzK3!J-ja*|LZ=y%#Y0 z#mKoL1u}_aL~evND0y$2l|9&LYbefuqTiw7dbexZCOn-hB>BHI<n#&#QEk`3%ll23 zy#LC&?w&k|6uOq%f3UWF8e|bpa4c!4ZJ&B_Y;5Lo<?@9q`(GLxJ6;>G)@oF!vX&d) zUmHMhV%mx*HkE4+9Xx2#?#nCdGjCsBxkADH2M>nw9-2OIprMM6y%e%5CPdS<)1C7+ z5&1r}*r~F37Mg;$@}DxVzQjKgH^0np<tIpAZoAZ8YP*Er$4edM&N4dMm%91e!{6R= zUl~E`-7WI*es`eU{XzSst-RZ2@5C7xP!3{D@cq*E@}RuzkeYNp^+V-{;4BQ3;V6{g z4<t|U8McVeaA`+*$K9PJJnu*(+}>8+QGTertGr7Z&vzgGfM>@+IH~mLuV30--hFpx z`4LMySlVj!ZL|7R+8)|~1~zF2!@EbzkCykGq;AT1?1Q#TA0f>{mS#st^EkcwXlW-c zd_vdva+HA2o=YDi?ZcLKH&1z<9<irAJUv-{vh-;ANd)PS?SfN5j*swmh}OsNAJ=<? z@gJq!rni>k33BW$@4fp}>0|K-5K|*>-=5^#zVg%Mq4GXjzt=`!NFlzdiNBYIY0X}H zdWxq)d8Bl#^mJ+X^Q5@6pQq!ck<xy9IzY+;mU5Joqdbk-(>PCKJRP*BLp+U_589|7 z()DE9r3uQJC{2EzUR;`_Er-iTN{1!dFF*5Mn*{uf+q0#^r6XU$BNKgmuJnx53Dj%K zWVC7Pvy}UM`31fnz560F`uxeZ(sQNfzeL0UzP`ZMsq#p<vvgD=pnR8(+4GCx`FLpx z5b;uUlQmoXJBh-&cnADeWYy~-51Q3uPQ5qb0(ya?*I|UsV-Y)6u!~;4IR;rDB_0US z-;i$b>P_v}U=fcz3j6zcaRv}Oqjd;ME*-YYl)pKSu<zU*ToWu+rgU}BmH9;h8f?KN z0yh526z_2RtP~#GN1V=9h52#r4l-inm53>n5KvSSH0_Ric0by)2zgPkmupB#Vu6G- z>y;DJQ_IEqS^v_t;_Peh9GP0Y`OcB1*U#$pv&rkwqO%uXeg4@)6Eq33q)Y=Ut9q7r zu#E2l@!Z`fqJft)U-cqs<heU<ym9u_)Y{r&DgDx5(^xEmE}25Yl)an{FK4Cw<ujq{ zfB?lE2#GqmM6$3{q}_aR^{kta#MVFa^^8QGn|wP(pYHKV9m;+dQ~G8c&@20C?WVlr zT(khJ*)JtLsARqwan#J@2|C5GUZxX;ZmwyF6BiC`mZ7B7T3B9>TGq&@3n(A~vT?Dz z@MuaLSoA^_iVsO-LY_fcPGp!wC?Yq$IMDdw@c6`$iDzEOl=AHOp~>=O!px!I{6u+d zBFpcA50fU2V}Cnwj~Bi^T{bayrge=y_;c)|cRDH<a<8c+nV-%q&#|#5XU=3gdcOe{ zc7&Phy=q?YX&UN1n4QV7!v~Lin3|UtZzVd$_p06!;y&8%`Ai*IZsNrKnly2rMxtUZ z{RqLRP)*Y=)K^U5Gj5n;&yNNBC_tCeg=k&ErY>gpX6v_o<Kw2Vdk!BNQv{XdE{>@Z z8mtU9>$+*;5`7(DM0&-|@Q~6h&TOL@J*7Toz(zyHMhG(FU!<}(0+bnhae$am2_rWP zU}o$w_4&a%pM@5Uy&X??sky(I&rLnfeEnwixfSHd^lI{%v?JRT0GYwvZD#nIcVT+Z z%^Vs}C(mrQnXyCT&!xZOa!nAR#l}uHwK(x%U4P9rWq19|L}NQL+dbY+$p%aA;%}iz zGur8e;rM-$GP#St4UagXLcPbMiM1`77yl4-Lk-t@XAX>AdFgWLKy8~d!3dw_y|UgL zkA7=1S~}-WX@M&|n~z9wA$EUR<)g8fHlcIn^zx_ScsSjKN1H%aaCxb4SGA$IB|<dZ zH2RK=#b0V$<IY?jzg*g1+mgaZY6s$Pg_-i{EAhj+rOdn<d1<8fR4S(<@mt{1wU5T7 zTpnix_cxSM@9~&K^rN)D-k)I6wNDl%pFyqsnJep){5fJl&#tUbykw!P?o5nMZj2Nz zkKaGh$eqI*wE-d6F&<tUOsT6=(vgk2<~+8mi5_KAe_!Nx?IBrt<jMPNoEPVy5bAj5 z;9AQaJzCr0RQJ+pS}%j$WRteIB1*60gG5ABspEzgLucYYg;6jTvF6+P$Y{H=djmG{ zb;1a(6SFkRmD)1CO23<w=W)^@x~twlYt#blnQHXAG?C_h7w@Crr`$$02L%KAH7zYy zXKi%T#g(vYr($=eQ6GcEnpJeldn{cmpL*JAJx7l&@WX()b(tP8o1QSlwWI0jncOJM z933CKLX6xH^zIHXF+Z5dz8bl6WTUnP@+zLIulDZy%-Fu=v3;d5BkC#*w_kJCoKnbu z_pXgu{0+t}KoZaILJseQ^ZAA_1XAMi1db>|<BOGuKL!5oO$o^A89{n0Qe|8>3H*d| zDnhZ2g*uU=FCg9ID$8LLde157w?(v;es5e3HK6MWU7eC|55;{(jXSBMnTQb*qJm=k zucpaQ)04RDym{Npx0F#oA#)?n)l^a-08de0A%%dc7$-VQ3bPTsU{)A~p@|n>cma?- zc6eeam8}VPQaLj!B8+Z9Ik8E@%<S-lhww_3;k_$1lZj%^adUf@u{z<fJ&LD9JT&K| zVAe^{F5*_4X>Z%;Xm7)lxco%4%TR;ui`YeOe@cA&wvM;jTr>;gyvJ&3-H{esy*Hky zdZ$|H)SaH>OSHkIS?ZE|M^1b?SOh8QL-+hU)!BuWf2|$sqz*Y0kKief-+RE5&Fczq zr%f)pOw*z(x_ExJy)dE9*369khH5nL8QTZCYERs|wy*Ar*Wbl`pE$bjm81JEjPG0c zQ2TEun>6f&uYLd7#<=$$RFY(me1rC3dK?~PPgWmjN7_nnwJTlr54R^(*e3hZ7q`i- zyf}II=rb?yf1K_1A-AYin%<@ug<@*>4BJ+}6nN;+q5E##PiX66g@qU}Y+c*7KHQAo zwk9cM^FG+N?XqnfeMXzZR1-JftI-UJH~?+)m>!`?gtV{zeR`)3YNt-#d+*qs25)8$ zyjvg2>{b=>Z!<e~=>E0Vo|B~LHol0DUoLTsj&Qt==@mTB>NVb7#@nBNRVv<gFTep` z;^g*hNCCFm7aEFbEW@5d0W%l#SCj##ma3OJj#{0IEBLJTmD(HUdDGs2@_|LF>XDa} zxLP}YX<aC$@*f4mq?DIxgXvajL~6nz<CwX3p5G{prJw0ANMh#I#N<Z3Q&dDaF_=-q z%%=HksDsDJY}uK3ELZGFgD&7n;D}0*&xM3?VmEU+Yq6!?EzfbZqu^&kD5tcTz@*ma zHb&>-Z@Mh<&+MakVH~v#bJ09>2MDTT@0;qg+bS%LR`DYV4_X!;iO1u@(8W_JohVBx z8+h}cP1<S+#h(i|7H?i$Ew}=jyjV7^W*du`*BhKtQjRMiGZ2{vhk8^){TW>!^Tq8P zCFb`kg6(jVv-8jrs2}gXJn>v^WI~LVI{_y#(wQ|3gQNF!?5Bfp$(dgReqP_2>DV^t z2Pf>@+Tsk(B#r*1L&{@8WAqwp*M#c;D#;mZyNr<^d;fsg7b8C$(xfnzdt2#F2rMO) zyX~fO-~OO+N`};8ipu)V7Y2U6f*+>6_aG|v#RZ=y(OWL<tp2>@Vz~SuRYX6e%iq^U z!C72f>%jmi&pJ^=y~}t?^=;vUNg*N&hHz2&OsC*;y89G0L}zsOhVDkVt9y1ppd4S< zmmkwyng)XO6Y5)y-U&%WFkv{35CF8$%bB9zBnuI$*W|_{x}ZXyRYlL}a*@aSKw35w zy{T6_Fk@O;a`c{;CDnJ%8a0}E8U0NazH`<$BPC37;TcqPkT2D@q(oEE5!xEPt>%2I zYeY)KR3A(e2!gToPBCnv7u4wIb(vF6!B3~RVT$^kOg>7)A@1s1O`w20=BBJgqm%kN zql;Ag>u#Ag$eW@CeLtm(owv!wPF|70kLdi9LQU_txAk=9db@hNc6B_~v8!V!w=Fl6 z>(A}#*ws16^PY}v9osO8pTtq+w)V$)%C!$XtY6;q4@3Cvo$b%JKhZJBeZ6;<_z{aM zv$Lpz5Mpk=TJIDLM=#^4sLoii9DhgCi;2O~+VV;z`YSfC24O0Ci@1NKRQx1q0wCHe zM-USKxIE7ASHio}s=T<M>JhsL30Yj-`Telyh#+?1GZ)6+`pl(EpGi&)JmfN@1jUfc zF6<%Y26O1b>2s&2FXDRJtZ`6nuHe84t#D4JAy;A&!rP^dYp~Ks^CwPDr>lrPKlpab z3<-^W748UpH6iZ{^4`ir4=&i~<xiX#J$Z6;dfIp7c4fSTpZ9bnL9N}5VN(I4`IAIx z&gLJ@U(}dQrpsAeahl%Q_CR8L9ruOe;!-I5E#JCUg=Y(8MzKtV*7sApNrA4r*{rTT zslmHv-u&BdzpY;0%3o+2rCOpDo#q~ASl}6kcO!qhk%6CO*4Of3VA92>xY4!5i%QH@ zP57+IUHmN+$9B>A0FO!s7GWVcS#Sl@u7C(Xq7U5tuEFs7mf2bF_m$1JJv>|l?C_$0 zcDA^NeMmGr8~rF5>pkz5i#PD&9#L*v^t-y4t<ZPq?hgf@|B@~Xe2#uuchkBQb@>Hd zfLRnWTP5s8u@s5+t#3JNGN{v0v>Mg>+!r`LC_t{FY-zH($~ZypBe{x*Wb_k>g&6%4 z%Dc1$vq8Ly5g`(o(L-wi+_UCqq&^V$OJP)^Z&mG2bE)?%7jIQ?X%{`CMv6~hwo&zt z`D;<sBcS>Pz0+~xR5_0+S8s%71ZZc;`7il-759=Ze_82fbh)g{3hyp;Qw8kddiO1h ztnQ+CGtzTwgdz}_vrs*pk=omlsY|Y^te;fHKc~w-*X8?l`6XTcb1wDmMUJ(_S#x+V z7!bd(_!xTO&Ne$;?KrhlPI`JS;&z{*W!k|mnvg|g`<RM<QkT8D?9-*7%g^ib6c=^< zDp(8$s42CIrxTsk<$~J$rY@h+<$~T-b@#OH#&t0r!bf#yhty*l-djqtOYg)dim+&6 z*mN=EK*xVHtczKv=`f4lS09K1*A{`Gv_*E*jq2`zE{AoICTldLi&!|3oFGSgblIj$ zUY9{#9@FK&Re2xL-4R{>p&ox;7eg-g>z$mLM!%|e2X!Z8&AGSPs=F~=q>~txbUCTZ zab12-efyN|Ueo1G74U}crgd4=<+?6Qx)=&%_I97t<G1KCugjb+pW{*=m@QXueNZmF zhK&LH(?5Npd}|s#zvRWM^HqDXW!Cv(v4{RyDFeP<TtU!ok)#GS{6!W1sxEKqVgaZO zlUvZE9shfk?iD@itT&Ib(NlW2tjAC5GOoviy4=v?o4UNL%eU$>qf1#Anfyi9ba_sf z&*+jMGQXk6zpTr774;u=cTATnx*XNz<GP6ai)M9qLYJ3x`GhW)bP<vlt*L-1J>Jyi z2e@3?;*MWaNx9UgL)~ucT_z2=)b9?7^K8OPAgaPFbbpS;9)FXsgiC#PMq0A1;nq_1 zIUi*gK6NfStR~)2BMi+nRJN+eqAm$8Wp_fT>b)=lWI=IUvtRiNo#@PUw(}32R=E&r z{5O!x!Ry%8z9W~z#SnK~x#w=M-CYN}biWO)>3+NFPD<kLNpHFD*uhodx2&#?$2+*o z^*-E5ecLEUoX^4B?p$yGV8;MyTq}0x2A>~%nDTcH_73(BetTQ|uctrPyR~<qx4*Z; z{(WTN<<!?W)jQ<cGPr&4=}y8n4xSi%WN^peG1BD+&vNY_{P^JE!Jfg#2A>$*MXDWK z9~rzkcy933!Bd0lgRk%<Klt?E-ocLz_TY-?<-y9}rv^JIbCfon;Ok)T=)lf_kM;KT zKF+`1fwR4P2ln;$^gim8<hf#6DxF~&mLAIW?xDTg_%}MxG0@Tb(cYcpe5p4#u(w<N z&F#L~*|8h!b%69w<n~<J7BP0YJZ}o^{aufD?BMH;j(kTacN+Uc?fEY2^)9)0>dy^Q e+b;fc%?)*Q?(WTX_w;t~o9piAWp;Nk3jZG+C=T)f literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67ef28ac46b51c35ef60f0ede00c11dbfe1a3211 GIT binary patch literal 24407 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py new file mode 100644 index 0000000..95d330e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py new file mode 100644 index 0000000..5ee6220 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc2104ba9e00ef4290134adc198bcc99619e3415 GIT binary patch literal 742 zcmYk4%We}f6ozLqX>)7Z0#z5ROeGePXq=X|v<RWnc8O4>A{HYd%bDXzTs*er%Rpwy z+wcxN1nX>B@d~W48&$>Dd^*SaeS9u+F&y@juzu2~pMSNI<ac!LS2q~v;j`BPkU%Pu zD$UcXmA9%a&(Z{1kU<;PU>!Qph2E^2x1pb}!609Ujl2WHybGIo54Q3?Z07@b#Cp3) zz5$PKlF^etA!;(pmRodcmGF)cUTJ0AvJ1TCmMgj3)P_q(N-ql+{T?BXJHZH94hXTn zs;F56r$dN0e05qg6YmD6PYCsHu1v7QO;%AZRvN(zCT$EeB&1M!VfbwBqD<4`3!QN} zYxXXcVaPi!xZ}*CQW<o;2;n4JiI{Dk&7ITsHO4dU=6*UZRE70IQ~VI7eQ+{9ZAMp0 zQUU13`Lc9~N<du3GQm@U3MHN4Q}2|q%{JUg&+VOb%vG~@adU;j>+eF;IYaMP$-h9K zR+XZ|@ub<kysrWsP7aRt15VI$`(ZSUZ799-CX{Q!h!c}Vv;$(_s0ckVYw>73q7xA( zZ+a2&?=XXijesAC*^YL^-|sj~r>2hKni^ax0U;k;89cou<kTL^S2Y|JMAwHCSDwyp zjW{Te&(82ithwIj(z@{W{x>bZzASDVY?<@gDJAUxCaIYOWgZ%eL&{U-!?4DBvFyI7 Z6nMej#&YaVz)sdr`&l~;yA^h1`VV^);ROHy literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5eb53807dbec9e97220a2aa38832586eeea4e5b6 GIT binary patch literal 580 zcmYjNOODhq6m*jA&aX2Fi4`ZH7lZkYn2``d9Doh8vV@-8aguT4pZv+t>^Kg0;3V0y znk%rvo)%~<x%A3<uU@%6c3p$w`9+_8$#R5#C-U!9vG@?LyN<vR%LI}c$z)D)S&$+_ zEN6vS$u(Ka4cW+&l(Hg~tVt~!(#V#ya!a<cZ^hPZ!%9}Mnl-GQD$=p-XSD0?qB7bQ z%OkpXS_D4;mquH^RE*Euajlj!W4ZD$2G#q>@3J&eEe!w-{zhAXr32`-Ia)s5_(*Gj zK~gSa*#ZdO56TTE;)0aa9#2i4dy(EtfMEHlVIFMS3Sir~$EI-XHbIwQlOV-n>jY(l zPrI|^Weh&pC}v}b$QB7!5t0|W*CE<E4X2R@3itZ=oBl6JcBqKve<J%hbtm}q1IHL< z>IXbii$^V3G>WCg`vbtGyHIau_NE6jzk1=v%jsan%kkps3SVQx%{f=jN6qtZM%}*d z58tsHd@x>X;U1PS4~l7v4eh_uiK__%aK)qf=jOOn@1$ly4DZv&T#DjJ{%q4^e*u$b BpWXlf literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3957c99fb2f1fbfe98f1d2cf615615ce41a2370b GIT binary patch literal 1032 zcmah{&1w`u5bmGZ-O0My91H=YhxH=tAv>BFOdteN!CMd%!9i&{(>=*-=Fjfljk`n; z5=b6HkG_LX(pOJ;1y5G@CTqll1yxg3J^fYHSN&{pv5i1}@YN6RDMCM8a4iI!r=a>R z7=Z-NQGsJzkeC!Srr7039>jqRh7E!4AVH5v+?+=NL@n7;FJzeFc%f{{w)={PXr7_? zmLRWDzjX=Ns88(@-`7<>GLmIQT`6Njk&QE*Ri*9LDk}|3M`dCl-n(>-T|&1g!R|JQ z3!0!UQ2hYROLUITaY_Uh<SZ2A0-w^)#GtSEga|5v41Eird}A85dmzu1<VN;*Z=Y+~ zOLDGt?>IAukSV0$J~8lrCICJcSJsJM1tU?61&Ybd!Z8&T$^_H<4vqc6+R3Yg=X!TA zPbGneLdboc-UihjFc<g)U!W6u>Y(u6cfhkW$+ZniUP#+EhnZ%sac!~a6Wf^ifrD0# zkzZdTpl}QmMq{p`w9184Ix1AOKV)o6Z<bHS;&H<2@%lrPZXFC&{wUqt-j3cxbylxs zr8Ydz*FM$d@kTP7Mp~LtZK^8QH(fTCrKnU?^W=yhWaUA`lB%e=8PpToVyu+MjNNlX zx&0wL?f;jP!PTujm^cI<#%0X587nF=%AMa~?Bj^%vlF!hxPIb3QI0vac%4vP@a)2z z?Yj{AK0>S<(RRs5_wKlwFu(097#o;LEj@6b&fq+-yYp`)U!?o@Sj(=G-)(D!suhU( z9XCQcG9v{eD946!FG;z-EY%ZjJ7ZW7ymgk9X=UlFck9k<z@bsL0|w}2t}|`he%n6d e(S27pjPEJjnK8EON@$l_CL!(OZV=#*H0f^);R&q( literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9364e2b61d872ed0d3594a8d999a18cf346bd4c GIT binary patch literal 2884 zcmcImPjA~c6elHHmK`T?nr!_utUynLfTe2F22HV{NZX;sF1{=$0|lXov?EuRRFZbv zpf~5Rud?s3PonEi`wBbtJv!>_K$^U*r9nPQkL2&Y$M=5nv(3#8f%bcF>(#GKLjJ&q zqBUT03|;*M11FruWI_jYVhyZ`J+LWxNw~%B3&L&DnA?M<XwJ!?32z&`32&R`ts@+G z>u~26;<f&SlZa>M+rg<y<Ea)bnq;Zexyz$jq@py*w=x+enhmE(sNp%p9YwQXatvLa zz#zzgax$<u<<<om*xcp~kbun{kWJp=E=Y&Bc?V>RZ}2Wimv8bdkZr!rdmuY}hhGD^ z!FR#Jz1;md8AeH@--i@Hu%X2M9J<1wa0)A}zJ!30--t)^h7$2mI`C+Qzb<@mVisuO z&jRTW)0hjX{E75W$BZ4R!{pJ7KMYwmJGiHZN29Tf?+*_jKlV@jEXwwyMCl-o_upm7 z+XvzJ+*d+RGo7ZfTAs3*NO&s!EC^o*qbM2qOldg{^;8OVH+!GEj7gD6#@c8&#*WbQ zox;7lg?7bH8x|QqyD-s2(+^}$=jbo(dsf~!3)ETOz+*isTd?MDucZr*2#RYM!vo4d z7uwL614~er1^0zH*s}~s-c0qGkXNxB#$wIb_7c+el6$E8cQ|qrjw(YDj9sfj0o@A9 zl@NY_5RU2GDni(SG{*~0LXo#&YaA%W*rlUY28cI|eN|xq>dFn+f*qO^26V}#39^S? z?!Zuknt*FJDo|0kf?9ToC(D;u<=Y6Z>6;1^)O{utu=jQq3i^WfV?(*(i@uB-&3k<@ z3Uo9RMUqw2K#Q?Nj2OEEM-?T|EA~L$8D-z=VzDH_1km#iW0RCmW1M#xdovB<g+^lW zN-QRc*C{dCCFY{s#bFNz%nW%Qhffr=m|;a4mcmL^xXZO%d-Z4ZA*enzEXiZ&Uyx<x z*KmGy$S(=@yuDvUZIMW&lw%^~p}mGv==sg7*YsbgPU3e_Zop7}$>vJFuR&dt>uSry zT)n>pcD=;Kwdk%M3KQ(04hjp#L>m^O{AbQvi*QU*AJzbW8Ll&>bW{Vq7U8XYwaN(3 z6zmT*P;0SXJrvTylRBvNsLzl@MIj*ZJY9mhQIeYl<4OFS$eTFa!r_0D8}i6^(5uJ| z^?k2}{5qWCKO^|pg9$4!V<rBX%boOeEJAHuG`v*CqPhFyf}fw@9)-lZXZOB!pnn7| CGY4`2 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c187b3c8dfa2a612e2080ef28c9781c93ba57c8 GIT binary patch literal 8889 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 QeqYwe59AN!^ZAMY15B>jO8@`> literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b788d9d16b2c31abf03346754371d49d6a51935 GIT binary patch literal 3891 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 PP)bw4hgJHBR?z<oArJ2b literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a5b144390f7b23bb1f881e20303ed50b6d836b6 GIT binary patch literal 19810 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb3b4e658165db54ef6da15df7f0123f4657d3cb GIT binary patch literal 511 zcmY*WO->sz6t+E+5QRdE=&Cn}P;h~wf`qCH_H5eKAY?gXCvx!E*0X1T2(jWI$$|xU z;3VF5)hn>7jZ_Jq^nHH6dOtqh*chTD&-}~fBSz>?HvUVIl%ENHKaoHJYt-NhH>4s> zQ587*h%T#Amdl<fR=DbmQuH2BwI;|fH0u9Nb!b$?k9^{-Zi8g1aTY=x2-PXCtcjZr zlnHFwnmQ!=e9^xcv)#*`It}wG`7IO968xt`0WGn>cW6bHWQ9^2a{hwHsmnI2xv@so zT&sm-AZPL>7QUUtp0?K#MmUy+H}VNV-udO8rrsS7l6D;E)M_EY(+22d&e)MZG~YY% zt!A#<{~D%8vpML!>EZD){Y{;6V`Y5cT90p>xjv}p3+iQPU9eXBw<_zT5f-T9^%b8f zGox)#+V8sCxb<$_JlTi5BT0k^WPLP<LzZq6T9AxEjzInt$Onl8WL&Fl<CK=r&+c6F ay4xFClx#)?+UAGy%y+|OiC42yqXjEaB& literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2827154392b8c0ebb87c6abee73cf9ea1f2fe23f GIT binary patch literal 10577 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 a@l)fcp-Rkg(>`e5G>!2U`;&rUkN!XJA&U(F literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py new file mode 100644 index 0000000..210bb80 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py new file mode 100644 index 0000000..ccc2786 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py new file mode 100644 index 0000000..031332a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from setuptools.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py new file mode 100644 index 0000000..5b49341 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from setuptools.extern.pyparsing import Literal as L # noqa +from setuptools.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..7f5a76c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py new file mode 100644 index 0000000..942387c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py new file mode 100644 index 0000000..83b5ee8 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py new file mode 100644 index 0000000..cf75e1e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py @@ -0,0 +1,5742 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2018 Paul T. McGuire +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars +============================================================================= + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments + + +Getting Started - +----------------- +Visit the classes L{ParserElement} and L{ParseResults} to see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + - construct literal match expressions from L{Literal} and L{CaselessLiteral} classes + - construct character word-group expressions using the L{Word} class + - see how to create repetitive expressions using L{ZeroOrMore} and L{OneOrMore} classes + - use L{'+'<And>}, L{'|'<MatchFirst>}, L{'^'<Or>}, and L{'&'<Each>} operators to combine simple expressions into more complex ones + - associate names with your parsed results using L{ParserElement.setResultsName} + - find some helpful expression short-cuts like L{delimitedList} and L{oneOf} + - find more useful common expressions in the L{pyparsing_common} namespace class +""" + +__version__ = "2.2.1" +__versionTime__ = "18 Sep 2018 00:49 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [frame_summary[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or preloc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + r""" + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens)))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | CharsNotIn(r'\]', exact=1) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted); if the parse action + is passed a tuple or list of functions, this is equivalent to + calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/archive_util.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/archive_util.py new file mode 100644 index 0000000..8143604 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/archive_util.py @@ -0,0 +1,173 @@ +"""Utilities for extracting common archive formats""" + +import zipfile +import tarfile +import os +import shutil +import posixpath +import contextlib +from distutils.errors import DistutilsError + +from pkg_resources import ensure_directory + +__all__ = [ + "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", +] + + +class UnrecognizedFormat(DistutilsError): + """Couldn't recognize the archive type""" + + +def default_filter(src, dst): + """The default progress/filter callback; returns True for all files""" + return dst + + +def unpack_archive(filename, extract_dir, progress_filter=default_filter, + drivers=None): + """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` + + `progress_filter` is a function taking two arguments: a source path + internal to the archive ('/'-separated), and a filesystem path where it + will be extracted. The callback must return the desired extract path + (which may be the same as the one passed in), or else ``None`` to skip + that file or directory. The callback can thus be used to report on the + progress of the extraction, as well as to filter the items extracted or + alter their extraction paths. + + `drivers`, if supplied, must be a non-empty sequence of functions with the + same signature as this function (minus the `drivers` argument), that raise + ``UnrecognizedFormat`` if they do not support extracting the designated + archive type. The `drivers` are tried in sequence until one is found that + does not raise an error, or until all are exhausted (in which case + ``UnrecognizedFormat`` is raised). If you do not supply a sequence of + drivers, the module's ``extraction_drivers`` constant will be used, which + means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that + order. + """ + for driver in drivers or extraction_drivers: + try: + driver(filename, extract_dir, progress_filter) + except UnrecognizedFormat: + continue + else: + return + else: + raise UnrecognizedFormat( + "Not a recognized archive type: %s" % filename + ) + + +def unpack_directory(filename, extract_dir, progress_filter=default_filter): + """"Unpack" a directory, using the same interface as for archives + + Raises ``UnrecognizedFormat`` if `filename` is not a directory + """ + if not os.path.isdir(filename): + raise UnrecognizedFormat("%s is not a directory" % filename) + + paths = { + filename: ('', extract_dir), + } + for base, dirs, files in os.walk(filename): + src, dst = paths[base] + for d in dirs: + paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) + for f in files: + target = os.path.join(dst, f) + target = progress_filter(src + f, target) + if not target: + # skip non-files + continue + ensure_directory(target) + f = os.path.join(base, f) + shutil.copyfile(f, target) + shutil.copystat(f, target) + + +def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): + """Unpack zip `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined + by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + + if not zipfile.is_zipfile(filename): + raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + + with zipfile.ZipFile(filename) as z: + for info in z.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name.split('/'): + continue + + target = os.path.join(extract_dir, *name.split('/')) + target = progress_filter(name, target) + if not target: + continue + if name.endswith('/'): + # directory + ensure_directory(target) + else: + # file + ensure_directory(target) + data = z.read(info.filename) + with open(target, 'wb') as f: + f.write(data) + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) + + +def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined + by ``tarfile.open()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise UnrecognizedFormat( + "%s is not a compressed or uncompressed tar file" % (filename,) + ) + with contextlib.closing(tarobj): + # don't do any chowning! + tarobj.chown = lambda *args: None + for member in tarobj: + name = member.name + # don't extract absolute paths or ones with .. in them + if not name.startswith('/') and '..' not in name.split('/'): + prelim_dst = os.path.join(extract_dir, *name.split('/')) + + # resolve any links and to extract the link targets as normal + # files + while member is not None and (member.islnk() or member.issym()): + linkpath = member.linkname + if member.issym(): + base = posixpath.dirname(member.name) + linkpath = posixpath.join(base, linkpath) + linkpath = posixpath.normpath(linkpath) + member = tarobj._getmember(linkpath) + + if member is not None and (member.isfile() or member.isdir()): + final_dst = progress_filter(name, prelim_dst) + if final_dst: + if final_dst.endswith(os.sep): + final_dst = final_dst[:-1] + try: + # XXX Ugh + tarobj._extract_member(member, final_dst) + except tarfile.ExtractError: + # chown/chmod/mkfifo/mknode/makedev failed + pass + return True + + +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/build_meta.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/build_meta.py new file mode 100644 index 0000000..e40904a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/build_meta.py @@ -0,0 +1,254 @@ +"""A PEP 517 interface to setuptools + +Previously, when a user or a command line tool (let's call it a "frontend") +needed to make a request of setuptools to take a certain action, for +example, generating a list of installation requirements, the frontend would +would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. + +PEP 517 defines a different method of interfacing with setuptools. Rather +than calling "setup.py" directly, the frontend should: + + 1. Set the current directory to the directory with a setup.py file + 2. Import this module into a safe python interpreter (one in which + setuptools can potentially set global variables or crash hard). + 3. Call one of the functions defined in PEP 517. + +What each function does is defined in PEP 517. However, here is a "casual" +definition of the functions (this definition should not be relied on for +bug reports or API stability): + + - `build_wheel`: build a wheel in the folder and return the basename + - `get_requires_for_build_wheel`: get the `setup_requires` to build + - `prepare_metadata_for_build_wheel`: get the `install_requires` + - `build_sdist`: build an sdist in the folder and return the basename + - `get_requires_for_build_sdist`: get the `setup_requires` to build + +Again, this is not a formal definition! Just a "taste" of the module. +""" + +import io +import os +import sys +import tokenize +import shutil +import contextlib + +import setuptools +import distutils +from setuptools.py31compat import TemporaryDirectory + +from pkg_resources import parse_requirements + +__all__ = ['get_requires_for_build_sdist', + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'build_sdist', + '__legacy__', + 'SetupRequirementsError'] + +class SetupRequirementsError(BaseException): + def __init__(self, specifiers): + self.specifiers = specifiers + + +class Distribution(setuptools.dist.Distribution): + def fetch_build_eggs(self, specifiers): + specifier_list = list(map(str, parse_requirements(specifiers))) + + raise SetupRequirementsError(specifier_list) + + @classmethod + @contextlib.contextmanager + def patch(cls): + """ + Replace + distutils.dist.Distribution with this class + for the duration of this context. + """ + orig = distutils.core.Distribution + distutils.core.Distribution = cls + try: + yield + finally: + distutils.core.Distribution = orig + + +def _to_str(s): + """ + Convert a filename to a string (on Python 2, explicitly + a byte string, not Unicode) as distutils checks for the + exact type str. + """ + if sys.version_info[0] == 2 and not isinstance(s, str): + # Assume it's Unicode, as that's what the PEP says + # should be provided. + return s.encode(sys.getfilesystemencoding()) + return s + + +def _get_immediate_subdirectories(a_dir): + return [name for name in os.listdir(a_dir) + if os.path.isdir(os.path.join(a_dir, name))] + + +def _file_with_extension(directory, extension): + matching = ( + f for f in os.listdir(directory) + if f.endswith(extension) + ) + file, = matching + return file + + +def _open_setup_script(setup_script): + if not os.path.exists(setup_script): + # Supply a default setup.py + return io.StringIO(u"from setuptools import setup; setup()") + + return getattr(tokenize, 'open', open)(setup_script) + + +class _BuildMetaBackend(object): + + def _fix_config(self, config_settings): + config_settings = config_settings or {} + config_settings.setdefault('--global-option', []) + return config_settings + + def _get_build_requires(self, config_settings, requirements): + config_settings = self._fix_config(config_settings) + + sys.argv = sys.argv[:1] + ['egg_info'] + \ + config_settings["--global-option"] + try: + with Distribution.patch(): + self.run_setup() + except SetupRequirementsError as e: + requirements += e.specifiers + + return requirements + + def run_setup(self, setup_script='setup.py'): + # Note that we can reuse our build directory between calls + # Correctness comes first, then optimization later + __file__ = setup_script + __name__ = '__main__' + + with _open_setup_script(__file__) as f: + code = f.read().replace(r'\r\n', r'\n') + + exec(compile(code, __file__, 'exec'), locals()) + + def get_requires_for_build_wheel(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=['wheel']) + + def get_requires_for_build_sdist(self, config_settings=None): + config_settings = self._fix_config(config_settings) + return self._get_build_requires(config_settings, requirements=[]) + + def prepare_metadata_for_build_wheel(self, metadata_directory, + config_settings=None): + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', + _to_str(metadata_directory)] + self.run_setup() + + dist_info_directory = metadata_directory + while True: + dist_infos = [f for f in os.listdir(dist_info_directory) + if f.endswith('.dist-info')] + + if (len(dist_infos) == 0 and + len(_get_immediate_subdirectories(dist_info_directory)) == 1): + + dist_info_directory = os.path.join( + dist_info_directory, os.listdir(dist_info_directory)[0]) + continue + + assert len(dist_infos) == 1 + break + + # PEP 517 requires that the .dist-info directory be placed in the + # metadata_directory. To comply, we MUST copy the directory to the root + if dist_info_directory != metadata_directory: + shutil.move( + os.path.join(dist_info_directory, dist_infos[0]), + metadata_directory) + shutil.rmtree(dist_info_directory, ignore_errors=True) + + return dist_infos[0] + + def build_wheel(self, wheel_directory, config_settings=None, + metadata_directory=None): + config_settings = self._fix_config(config_settings) + wheel_directory = os.path.abspath(wheel_directory) + + # Build the wheel in a temporary directory, then copy to the target + with TemporaryDirectory(dir=wheel_directory) as tmp_dist_dir: + sys.argv = (sys.argv[:1] + + ['bdist_wheel', '--dist-dir', tmp_dist_dir] + + config_settings["--global-option"]) + self.run_setup() + + wheel_basename = _file_with_extension(tmp_dist_dir, '.whl') + wheel_path = os.path.join(wheel_directory, wheel_basename) + if os.path.exists(wheel_path): + # os.rename will fail overwriting on non-unix env + os.remove(wheel_path) + os.rename(os.path.join(tmp_dist_dir, wheel_basename), wheel_path) + + return wheel_basename + + def build_sdist(self, sdist_directory, config_settings=None): + config_settings = self._fix_config(config_settings) + sdist_directory = os.path.abspath(sdist_directory) + sys.argv = sys.argv[:1] + ['sdist', '--formats', 'gztar'] + \ + config_settings["--global-option"] + \ + ["--dist-dir", sdist_directory] + self.run_setup() + + return _file_with_extension(sdist_directory, '.tar.gz') + + +class _BuildMetaLegacyBackend(_BuildMetaBackend): + """Compatibility backend for setuptools + + This is a version of setuptools.build_meta that endeavors to maintain backwards + compatibility with pre-PEP 517 modes of invocation. It exists as a temporary + bridge between the old packaging mechanism and the new packaging mechanism, + and will eventually be removed. + """ + def run_setup(self, setup_script='setup.py'): + # In order to maintain compatibility with scripts assuming that + # the setup.py script is in a directory on the PYTHONPATH, inject + # '' into sys.path. (pypa/setuptools#1642) + sys_path = list(sys.path) # Save the original path + + script_dir = os.path.dirname(os.path.abspath(setup_script)) + if script_dir not in sys.path: + sys.path.insert(0, script_dir) + + try: + super(_BuildMetaLegacyBackend, + self).run_setup(setup_script=setup_script) + finally: + # While PEP 517 frontends should be calling each hook in a fresh + # subprocess according to the standard (and thus it should not be + # strictly necessary to restore the old sys.path), we'll restore + # the original path so that the path manipulation does not persist + # within the hook after run_setup is called. + sys.path[:] = sys_path + +# The primary backend +_BACKEND = _BuildMetaBackend() + +get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel +get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist +prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel +build_wheel = _BACKEND.build_wheel +build_sdist = _BACKEND.build_sdist + + +# The legacy backend +__legacy__ = _BuildMetaLegacyBackend() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/cli-32.exe b/backend/venv/venv/lib/python3.7/site-packages/setuptools/cli-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/cli-64.exe b/backend/venv/venv/lib/python3.7/site-packages/setuptools/cli-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 zcmeFad3;nw);Hdr?j}u==7yyqfJg%kqCtqpC80t4LPu^(N8=-ER75n&prFR&UceDB z@phavWskhi=#1m|%%F}lj?UsZGsvQt5J<wlxB%iv+^cPuAew~rzTZ>Todne9_xygp zKi+>{KBRBmT2Gxib?VePr|Op8w9@9V*=$byS(eSV22c7I6u<xdPaBf^ja=8y_RqdM zMy;_&c8r=e|E_9ZWz~H@sk-eRU&U?r-g}?!yZugIm2t1{u6uo<tFQIlbKf0zPV{)P z{Hdx3p3OZsJoLz%^k3!LlXGT?_n*zl!t?Wj+&S0c89qN_PPKRroO6qKy5>w4&mnWJ z$MZk#s+do8oC$GRiOqJ$BTifH-`O?kw07GVTXsfYo9!LM+%035<l~tu!a+MdD4b!l zx#$P~(ob6@QVCi32fWp!3#G~;R#uXJP`*?Q1#MsC+HK=SDD^YfZaV=`{(t{#x7k)o zP=BzhiTa&Obfld17JdjI>U*jm2#J3_n{DpIsylAeZ?oA}or@^cX*&;p@8Yl5zaYqC zqReLd_+ljZfRn*^ItAvsb0S~E#7db_^bvivWg&Uk_wpg@|NZxW0s~rXw%@JA7W#9w znC{QhVoUu#b(VUadc9_T;ft^jG;@np*brtX*3qDS^H;5NPdwDuuEig)w2D?9%(2-D zI|{#yRD9iR8?D95?Ge^qXDz=|8CgU9QI*v>6KammHk?*-@|>EZqYYnO$MQiT*8IwB zjcsG6_)Vxma~#U=Xm-rjtfpi}VFwC1Cur7YyoLi`)=#&Vu0f#zy$X$$g*3L%uW3y8 zmuYONzr5Kox_P?Yrm@-nV3;*)<|dyyN4-Uz-LyUZkNTT;gI4>+ToAv;T(1p4{=!XK zEb1>4F$Xl(sI2a*v18FK`oNW%)lhSElHqI)TC-QUqg#xxw0P7X1TG@+NBu#}xJW$Y z4{GsQ{sQzzi-r6?etCazhNb=jn^N~z-~hqkY$f^}g8yCNU9xZn3QMGGaTEl`MFX9C zG^<s!wrGyln&R1p8$mpEuS^ZJR%JJ%CnC~F_JWC^1fz-owidt!7;Jo($7U15xt3-u zUy3=Y#UB^>k^_1rR8RtYQ(Z&ZG}fxIF8)$B1zR-ss6<%dcHRYkqOqs_HH5(0O@!H7 z(-{Bn=}Th=WLG2XbB!I3m$?Ojp&R@&FvUVkV@K53GMlm?8)Q{d_^}qt<JSQ}bq%^# z85y!6Wu_fu!h<5xXjfL}<24xlQolK<Y}moa%gnBlx{vj6u;wHYVoUM>LZgkr!HyQY z(XX%piOS;*!3)0(v9>){ouv<muoj}vo%}U`p*cDWEvoX_VEsf5bo|t5S$>_)(%i?U zS|zq{MF|F?IUKvFnF@^q@cbE|2r&0wnTB_zh%nk~0w9tZmW7^zXwRVMAE05(%JFqu zi~-E^@F=^jZj0_N+-rF+c@HZ$%}<d0_%!MT$rJu_iQe0gTG&7sJ)p%S{>o5%#{9y) zvDf^><cadi=%<{1=JIB@%@)4_lic$tKm*-W&POiG`_)0B_u0q`nyieVZjA~AiER|o zPeDoHmXg8-5KZA0ypAW5Be*Q@ODI~`V2tOVyU<?T`_lXL(B|^nK`vC{X@3_%QoE@Q zk6W7<;LupaUuJH#Vy-7pi{-r)b%;2kR)X8|hSJskLRLE=U2XP{R2!8YKC`*r{Gk^= zyn%S3<b(-Hsq3jbVRkZH!9lBme{1X;utZF+Nc<Z6vSC-UDO+X6Z~hv#8j%!o?1=<+ zEd4ZGu@z|HN~Y-k_J7-KrED`MRfM(i3<Z%XMtf3Li#p?XS<4C{%=vz}Vh1qx1d4<m z+xgr52n$o*mjyuWV$Osd2|%-S_Zf5)W}5^X1QQf<GI;F`>h&rSL^*gD7~pzOHv=pn zZpOX|VMKkAilc(3scUTLaN!oqd+b0OM&e5aa-zmVIg^N-3ba7uqC91!t)^(Ao-0Z= zBRe=&VB_K>f*4`+Pn0a&i?Yl$8QqaZV>2w}Ro8`hpBI~vsjPOLi(vhXzC8J=&Bped zU6wJL|AUwqsICB*_!{IcXlEQCj!$<ajsQlYi2^( &sjKl@1{;unAiW2w^OujNoW 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/cli.exe b/backend/venv/venv/lib/python3.7/site-packages/setuptools/cli.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__init__.py new file mode 100644 index 0000000..fe619e2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__init__.py @@ -0,0 +1,18 @@ +__all__ = [ + 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', + 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', + 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', + 'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib', + 'dist_info', +] + +from distutils.command.bdist import bdist +import sys + +from setuptools.command import install_scripts + +if 'egg' not in bdist.format_commands: + bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") + bdist.format_commands.append('egg') + +del bdist, sys diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd300c59a859cc79d43535b53fe38849890de7e8 GIT binary patch literal 752 zcmY*W%Wl&^6!jy1BypNhXhRy1y3L|7uZmWx5aI(60#>fj$n_luhp}fgGjW=H4J`Qw zzGSwn_yty6=RsjC-#Pba&V9b=^*R=wAL+@b_l{-#Y@GcWB6y9zTB89AY;eGZ7I@%8 z03o!Y16_!q2M5rH0o;Q_xDOBD2##mN#DXC_WOnH!j@{r9a}yWu6V@ud#6xaOow@%d zkP;pt3SfL?HO$u##@}q)x^}Kz7=5rNkByhIB2}h+1BKFr&SrZkMTu}xFd+0+n{W%o z$^<}b%D6BQP1TANmC`9=CPXbdIXA(c>h1tx#f|YL*QusSsM4Bpp_TDelQZ!Z)##g+ zrb?T^Uh_9xf6u5)7L6{HbcRAIO>bNEvZ$IjNp~R_Pk{i>l<~KY>1+$nu!f|)X|gHu z7tY<9*v8vLcssFWABn`ptP@A#x~%o!-AaGv)#((u)4X7G(l!Ah*efB)u!*$L1yj?E zmt|VPbQ4J)q13o)rIJJJYauk}cW<^y`Z<?ns>x2Ml7s&V<EKK<3cg!%gwZzU_c9i; zsBwUCoys`p45(CbDdU?tAs6brdRfDZjEMT#6P;ho=8`?l&o3|IkFhAk*=~eqx1w4; x&*tm+uC{;SuA-RWA`4B(6xSVIl^hm~zG{Y|j?qMRWOwlM-N+7|$Z2ro`~hkL@Hzkh literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86185d60aed6b856c7685804ff2c76216653bd0b GIT binary patch literal 2420 zcmZuz&2Aev5GJ`lT1#^5rfwWNL9l3kYPFS>HV&EqZILE!+DqLQ4iI3GV6k3O^4hCi znWP+hAzz~O4f+7dv2V~rAET$e_LNufsWV(jaegRpmYgMLhu?fN)cyJSI)V02wEDD| zBji7vOq&gZd(hQyAUNSPC4CxDier|tz7<$zY^8SJ37ozgxcypC1D(yC7bNh0BHZP* z7lhY@JGO#3?(sR$*Li)Lv>LC$DrwPjX){rJsFPIvI?zd;{U~KFL2vb=LCY!|f+sqR z^Q@cn%0_OMggcQEWusDt-6Rz;MQhL)bPM_e=;{uLqsyFblBY{2bVNsF-<7T=BQmDj z<iLFlqnGp*$R6Fd<i_;Ph=7Bv*!X>zYvD(kAIaXZFEZ_SbLpp%7SbO?QYBf>-#PZx zZYqw})gVpuTB~KB(oaw6XQ%YZDZScar7gukmX3K1QwwaBH2#ao1@P`vcLp*!1dE-+ zNOrn;%7s*&zU=Jmh2b4_JNxF4Z^Yr?@avnpd#AT2)33U>@80b^>I{-WJIR!e(zJav z$e!Jb_lk}ZdN|N|o~pCMIPdqPjCZ0miPZYwxU8w&13a6DC^bP4R;M0q(sLl?M=+03 zIc*5)J?QFZ5P}4hlYns=Seykmw*rUTJu2M2+A;|s)_WdzdKAW975}r5=M7*$gEs-- z`O+~C6}L7;H^~5KKr)v)9%^6jM%quZ!+c*TKZkdKdq0=LpBzOMH~IUU^2wGD?sx=b za;50!hoYpixL6JSwP6OJwcv~30OBJ*hC|NyguI&ZX%!|K7&9WTOd5<x$T+Ykv^X+` zZnbRbz?$-Wk|jC;bA<>i%Bs?az*okB+_n;F*D#<Gi?B<60^$mE<$@rzPF-4DtYY@Q zy$^f%Ic$96;fU-pc|%+9w8xYq$8TtdvoU=RAq0=Dt=D+K;^8ktrF}IJane2Z#ZeUN z^w^*{WB%F<AU})xqUAr^6`4OYInZubV7A=q_=^zEw+?SGEv-~!@&bHMBB5GTF5?)} z;0y>WFue+0AvY0(CCX@Vp@QLEyE725R@I<CfUf=p0Y`>Far%lv;sXq7Qv+Ma5H@&P z_&mBistN-Gjjinw8__WvGfEED9z%`WCfdQB0GzYW<exZxLQfbxUD@U2#5(vJ_drQ` z{;mbH+v4tsU4T-9RdSnT*U$p5t&kJOy_YrZ={ciuIQfIEkTC;aEnNp)gHy0<B{V_b zn`5i8(3;ySYX%6RiiHPNQu{w3X;IOByA|h5F@SWR@cJUaQuteWHT6yY088@>s@gE) zrnX&|5(#lieMrwHhsrFI9VpIuRxb2}o{%}@NvusIO9#qVrpqQ2#(tzj<DJAjsX}h= z<w+(nflO7A7^l+1ij5>HYg`_Oa+pEh7%p7Gh39ciZIbBk(4(|q^%t-}-2g#oleti_ zJVO(kVfAw1=g~!KvnF++s;#nOt|AZY+-fyTFAVY9VOZ9~u%Gi`isNP&9t@*&@}?Gs zJdZ)$;6lYRF}F^zI`Ii_BL(+?3a8njD&9ATO2}ElFYG`a7Ev};nEaN=Z+RWX8{(Uh zDFJwP><Wbkhp?$_+0<iA<~g2cu!%8yupyYU+7!S9Z@3lmgq^SxYs55M*<%XSy~070 zeQ7j6ebC(GHfUCj#xa`v+y#xtYe-ojInaEWaBrE6tYxeeKs~pY<~vbZEVkR#s9jya zere;mi*xNZK4)4d&EqI7NipAUPb2;v5bQE|3dxT}u4R`tLM}1zrK|FxjD@@glQZZT zV0_R$gl>R=xWmt#b_RDAzTav!%0=X?`8TmH@Q;KtwI;aq=3-nIM{s{<>nb@~$ICz& zdIl?JR!ri&4l1bLhO{QY#^;L27$5V|Gmg%}SbE=9#QGkSN#S3tCPZ+_^6HBl{{v0; BV8#Fd literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..603a11dd82a7d52535f48b3b5f662ae4fadd73cd GIT binary patch literal 14208 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b127db89c9ff4d24667d0bfb17ede2c1c7e4ac0 GIT binary patch literal 1799 zcma)6PjA~c6elTJR#azgH*CeS0plfWeUP0d4b~Px(ER~+S~j#h87K%@q#e1mq>_@8 zsPd@=+8y@|?Bl+}K8dc|rC%YZJxX?xEgLWze0-)J-}~|R-s3l$n;wGkd$9HV&lW;| zm_O@bgYpEXz6XLMjwPC6f-strfrZich!bwTLEIA7guJ!}gyUzZYrh9;bQBu79t4yp zFf|1s&;WB}tOr)(VPJEcx89&Zi#y<<U2P0`q%)?{X)wYFc@)NvGoe((1<j5H<zf`% zGNTuEbSRF4S(GT6C6p(%(I}BJIf>%&W3Tpbzek_uF%{!6i{cU3BviyYSB=X!m<k%i zoI)HOB{2=)L#mQgD0xQ1K!&*tGQoSbuiYN~TAl=FnksO4H;Q!@NO_m$8sbskH;WYh z%9k%rGofOzIP<4L9E=5r=(Qub8Qe7(N@0L$8pZVKPd}KwOhv;y10=c$xd-q?DuWQN zALwIx5@p9Uk2$~%6Tk{54K-`{aXuZwCprR7h9ZOb#_>94m`u|ki-wVmva`m22u#<* ztQO2~Vd^aqC0aoCml&fAPsqY5k<mGVT#=*7T@%{1s~f-u1K)5-UfGF?#>(WrvS7c9 zD_aXW`VA=;_RdfHsfuPmX@3@|J|xTBq(4>t;e@e=dO!YZ#vg<%o$c;qqle>(lJ`gZ zj~?}Z?x#`euNe1F)A(dBoD_X6vOLX_MCz;R3QPZ@P<rW^av=OonA%i0A|5F=FTVrQ z3nq-Au`z6D38F+3w7^R=$0c4s1#_|_bCOvTd(kqi%q?z}_zwC7x}qeo;<xB69+A4f z-O~CFy#|}oS~%~3Pww17bDOu#iFpfl+ofH$mIR~H0&d--bL>}`6}Psb-lO<3w-*2n zxd!A%2H*~eF+hBNuZCB*?2<t0piS!)n#`>45CkW`l9x6Faf&aVCAkX4&SSd$$~3{; z-+r|!qIoY1RMGtxgFJ>5LxpqpH`Cj77Jy@@#=0YDv43sr|8z&;Y}e<CFPoM6@fCR2 zqeF4ERnr|^Qjy+HWlLZTbjPf_d#m+9U3+Q+s5<u!By^eSgu~Abe>It2;a}DQn+7ig z)2RsAD3YRgAQN~9^dTtglkZKp6kF>IT|-8@Zq>Qk&DD*u$kwc>4xCo-@S>(qZvG=; z)rz3OPb&xL6e{aFstvYPdqw)dgC}yOLvsPnf!A0vKsva64NZOfE>WiX)h#0o6Y66S zX6jEsAnf4|{9Npkj^~mOK<nV*)BmL9sOwZNW2SZ(t31Z03D2d`JB+=|1G)OrW{f8x zV|D-4F`HzV*WfZOH4&!iv?*+N!zQj%?{)3LXNE|46Q%C08oPIas%o#cYU75}OV71t S?pnDA4ZK5>xH{(_T7LoD1N{a7 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f71cdd1d15ea9e6f39d68a0fe13edd73f47c37a GIT binary patch literal 990 zcmZuvOK;Oa5Z;ILP|~1MaY6_p!~q`~(?Ugy5UN0eTQ02xiiB2<*GcXA#qK(V$UV^? z(jNH_{F1$L;xBMw#&JuFI@XLoujldY%)A{8dIaRBfB*9-Bjgu;T#5r=A5=dDBZ;I5 zNhu?gq-??|`9LI-{ESE*@|b<+6DH{aah>1bO~wJ*OW^?aLG?p0A(>D~z`Ik&(+QW3 zY@LybBij()wS%dQv=Jv!7G>Hf3NZm@KtWEZ??CksOhsaHPAgim3wFvYD(P`sJ&>&8 z0u=J`W!xJ!a!?jU5~g8hhAM>gCi0VL8HylJQ$LeKlMhdFbv*P{US{$t?8unnmFG>% zxgHhY%u$|=ay9oNt;=xx+3wcfm8Z*W2TA)$V*3pcNi-e1+^*rRR5UG3lxOzdZ3Glv z&2_A!!(?VV4K2H|@)f$AHb>g>AeBFe>O;Vv$}3c~@J;9~eC5sZM21Rxsq&_=5W9LO zd%2J=0#PispPAY2JXXopY-exJJM@aE*lcKSel4<-=Rv&mbZE-L<awg6!=|!#V>r+b z)dmVJP+f0Qt4+J`wCVEkP0!oz8{lkF@ZANi$NB_-q!kflxo&98&Ur;HC?y|p2^pS$ z0)(R-AHH{;Nnb=-s4|0fnOi4U(OkhQ6U*VurK$tC?$gSw;pZJN>!2Eo5@5^dI$PfT zk8zoeAs)H8E!!0$^V3iW+Y=(qWtkve6XHwhC#yeoE9%_W>fwY`T@*>-fHj&f?e%M# qaDhj-8L$?K9yMJa-C&}SW$mm6i0YL83?{eT*DFqMkgmp38~iV@-T8a~ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee9448231550bc18735dd9e740be93a3e32a6bb0 GIT binary patch literal 2469 zcma)8TaVl{6n30UCYznT^g=;ZL4HBgsn{7>sAwxx6(~YTs2~+o6txQ3*qO~XiBsE| z-C1Q`*uGZkPuS%N{sX@xukgZO;E7{rF1r;E^(fBq$+>(!KIeG8+}Q9Dj6b8R&t6_Y z=r6rk3<rn@@W}6AqKH}<$}Nm6l;gm*GzVu+-U&K}wlg>H23<otnU}8xYZm$j(GGQA zBI+`GA0OKRrq*LL=>7v1(W8OYTzZ&FRjD+SkD02<uZ7?O*mlOp@VZ>E117>UO2t7c zSvVHFDr2p?7#N5L@W}UIVkodE(mn#4VrsucfkPee*J=FSD$QsZXX$P<0VSWn_<q8K zNGT&~j}gj}sLB*s36fp57fn)L38FZm+=wMS%lJWBjPLoz#?2x5HZL=lvqF)Gh>E6~ zjKq{EprnfOa%VS^jDm-f6_ge6l*p-6EH?%KhvcLm^Sn$mc74zXPfQkl1-1&p0Ag!t zXrylq$rqH8oC`*tv#Hd`H2QuEJ1r6p2GUriyZ{XM7B0vQ!gu#WfFQ{ZktK`MWV%9> zGD#9H2#ex9Ey!X;=7?zPSjX$!P<yE)a*tOTg+Rg9S6)dTl_i7-n1FE!;hg$Gs`d<W z3Gs~?NnrCul*3tYP|F}I2v7cBbs0xMJtRL#a1MdWO9gRNLi^QQ8E1Sq%HG1lQsf4S zlPnrbz_|+15(|kaO-)!c(ux7nGLrfTmL|?^QJ>2^h@uT*tkYGGZFtt;`3fFcTL`_j z4pnVEg!i-kr+9{Ec5R<P$(>p=r*<fM?#WxqsvU)uo#10E?<<Gm8ec)j)~}YrwQ~%T zs&nE}yT+&3LPp<F-D7l$XC2V(0FC7Y^g0W@F`Bt`2mH7S8@VpXb(cPVJ1cwmbL~7t z&wiMBwKukAYxUZRS9eb>@B|iWZ*IW{3;xo=-)Ait4c}<EC!nvX7r#G2HQM+0*J}sf zJ=%SRXX|RCcI)+HJVs-b;OF*hOFT9E@gN>OLxJ{e!%$#xwrOl^wl?Zsy-{n<7F~bk z&bG|A?Rve&KwU8W-YW-udrzQ=L3`ME)O6c4lt)QgkUn$?5eZ1IKH;T4b8@|9O-cVl z*&lpF`g8d{$ty@zD1cHhX?j2b<vHiAlIM*qmq+iIg4M~YEkeR;kJH9mRO!*vw*<0K zSRpxAiaa4|T0(<p5!^GS)o&1VSD#m^tW-!-(YSdO3oe^pTEtmJnP$qyZ3|-15jt6g zzAD5zOu;5QR3ZvX4*gAxWz(T-w;B&{E4Kk6gNuzlW~%X1nHC^b#H?|2SvMW%^BEJm z6od^^<LIu{IJ$o{E*OR;*|^X_^xIn$P_W&$rEt+G<f5lTBQ1r#tD5dYSOW+y#DYbN zh2UJJai}BQ0sdgSaU{!<W^H-Ofd^!$yH7B`Cp04Ag0$#rQ@yh-Cs=P=i)p5f+r~BU zq=*eC@Y~qvRvT=yLuj>%(Xd4?S1}YlZMi$=|AE9cSpPd6l_H%0?9n6=Be-lR6LOS` z5j5}cj=WubHld%!VL7?=u}bcY_eFLyxqbKU=*Ll+mOCcWS+;Xn76+fi`$r?GFIB~P zCeM-(raUU>Xm!;M%W1RKE|*bx7x2hmU_#bK%eSsr*uvPeJlyMS!n$2K&Zf25(vEMr zz+bL4ja~TW+n3>+{^^yYr8U>pE4@CtdIrcFARfWp?S<xS!m#nfFz2+&7|^{id{IT2 zJ~dc%!;tbg48;e4*M#!S^uFflv)6|yb*gxq4sNr-53bS0Uy$KEFvArdlT$iaM!Iph zNXO0gN(25ta3M`HH)~6_$?M?KD*8jnhEV^_F^PHxnm%-)@ipG(?bhzYZGfZ)(?zSN GfA)XBcDiQ( literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ad3cb405788f287970fa5d67c67269df6773a2b GIT binary patch literal 9723 zcmaJ{%X1q?dY>170SJN+2=So@1<O_}I3lH8+q-^fwX!5@*Nzr;B&{V+*`9#tAqjBs zP|rXjQNyIlRBZ3T8*h?h%0=duOAfBoRt|efRSr4rC6!9mR3(?K99*f|Kfssd_kBGW zK$N{;bx(IsPd~o?9>4EvUYngQX!!l6dE&$7_ciTzR2l#1%~hlz(lt$JLiaUCJ#|Ot zy5Si7G#wL9!?(H_C#zE*)6aEn$L6x-=eq@`z~ziT(=9s1?yNJ*^{ij&&N*{j&iUo; zG3OYUZNJi;cjmdA_p9CG&T(DaUE*05Fw3H@c}t?Ouj|@9t+!-p-tu-q{*$iJpO<wO z-`9G^ea)K{Gt>v)6*2P(=OoIrqV!mEPKi0^G}4MFJ7+w-QxnIw4f%UfaaMX)JgxJL znBO+P(B*~Q6Zl&9&pKzlXT7tcx^GyTv*Mh_ybEex^m;+ftY#I*#R6t{PArNgJkR|^ z6U*YnV@;g!7WYjj<E?z52OlMK82Gv)&WMxZ)MMTGqh3jzcFu^JSW$JM-_h#Nd`)N4 zsOxclec1Me>+OV8Y4r!Y?nc}9P$~AjM{cX%9iS@fMqFtPgRtLikG!-sE^T@tYQ2s2 zru(od@m1+YI|zqi+YjE9vQI6h-`~U|cdNZFn{t<0g7(g+dVM$C>i5>JCo`=5tl93x z_N^Ote)`7kH*cU@acbnC1(xBTfjp0N9Vu{-g<3}!I!N6JjRW&g+tWwS2_rOwd07({ zo*6u|c;+r^p%rQBh=qpUnL`{dp4mu0#G&5TdiJ=7&_E`;5obkHK5F+ymo{6i+Uh<3 z!s<?KRqXbf-FC}wuh&+GJ>hM%dmbpPT3x^2-yRO+4AwR(PIr#&>(|xpM%gv7i_c@@ z&O7xS2(lZ*_P}q38-3Zu#;?EAxcSyk-1pwNeJ8f)P-F(9#hI4xHD#O~4n#Bba3=Qn zd}1@~4*o%tOX&8^&c%UjKSYm<IFpMTeP4JoxY(5!*E_EJO7L>;hY!U|EqCzn`<KFv zS2jD+|K7&SufBTm?!`fSu-fhgVbk|lcLu#jFSa_Pi-8vo2VuYO2h&B&+->&6#gu>6 z2D|ZT_h}|^u_rg!!fsDvaX}TCrWY(*H%wcnzoKF5B}1M-`%NbsY&E4P<Sc4;W1|<w z_U*g3Zn%wi?xie1tU!rbpol`KNjt)UF>f1<SOfRux0(+<SBAboMGu%VDqF@Ev3=QZ zcGpGo$`#ZCBu&<kwWvftVlxYg=b%12uLxZjk1^MQeyH658{N=8Jo|yU2Zr0zg&Aqv zS@{C3A_Cii9jjD+P`#|J{Udi^%&D0{VV%d3%y)gW_TFKG9BHBhM5?A4m<?H5<+ zME!QN7uMb!zdv73w@%A4k!Zz14OygpxU{E7P@l^z37FW3^!GrY2ZkcY*Yr&T%wo2? zgLvk;`{w<-Z#M3{^$xWeYnS91ygx#oZ}OKny`Hx-kXM)hiW;M{B<{3IHyCbgw0G7n z`~6na53a1G-A9=<>M*jv4gxdCvl!he(ue9BFTk`}RgQJ{$i(s7ktyE5=K-4(V+Fio zA<6S-OAiWVrpQ%1gNMjGjf@El2_F{>i76~7O-p1%7SD{x2^-I>$cqA=IWZ%Oc-n~? z&x<)xM!g`8i3*-GVqR47EG9~LHc`S*tKx(>2^BjhPT_!8BoXPUgJSZn;Z3A<z@G-V zCDL3i)DMhEBc&5@J%YxMG*Vx%CkBQyN3UNa%{<|fpw{lySlVi$ExlIQm%A5;n|d|U z5ViJ3Z56@`Ez<HNiASSuIk}`EF1V?n#-<$h;$_zLDGvs2*mr~eP_{^~Sb^tnI5W^3 z?s!DfEED;WFQED-NXglh^n#wn>5OL6Y1S}HN)9@~91@e`A5p+&L5@R+&d!%04GGiV z?tvsAi_tOB4uLwbA}S$2$Or=^<j~a_m{0RBjb)H;51RWR7iCe(g?1;8x9VAltV8|K z*t3&XtuuobV=o^TqkIHq(V0am3F~tUM__d3WCin;quk(2d~qy-)i^XELluZGS%PdM zw$;v{<@B|${|`UVDfiHm>;1rsb3*RA*znzYB|c6p43p6GVJih0OH!0^VM6P;OkGfS zH-^3sTjIqQ=aY6Q2yV#)&<0^_b^7g|!@@CWwziv_o(m?3jeZbYgJ!se)ine4MPkvR zZ>0%B%S)7f4_Q3p_B>AnE)4W~TzDkgp{L5()=*-&dO=>G&a2ef#PVW0U7t-Vi&o_1 zx_!Y@=8~1fGgC`)W`!5f_LJVlK(^A_5n-2qjEU|b1uMv46!aqg3izua!6@kEjDcst z$m*kKCye!-oZBK1q@RsM7L(cS*C>$Ijv#Ab0jNhDy#a0g6+I(;S=%#1vt#vN3Nw)@ z^nC-R?7jxZv*br%P8j=OJ+Oop+EHd-pV5f<FpfdJ7EucGkr@{D4f#np(<vUzMqt(t zjJ+%|ai?@J7iGipA*4DyhB?hnMSjKo=97N8y)4(OQ4V$_yQop$h_ry!a7sXAe!Gja z5^i(QjtfxV?wz0Cy!qDsktzJu`f*vu2IUWs#W~`sZgU_>-eU9J_g{>2V6|o#O4gb( z%k4OuxX=#R()XY(2v5mZDSM6H+st!x{w22C6TDX@t^$ZlPc+V<CEOi&aef#mZVKXK zSa5HfHA;es<PT}^SCG|h#bcz`<u%H#B6Do|nhXa3K%XQdHa2>(E{<{x?Xry&kXg|b zw}3mKd<-%T#5V=K49=mvqK{5YxF!|3gf&y$M7okBg_)&>f?^g@&H{SMH8v?X+mu_Z z4fIAm!&Hwe?Or=<v!uKIK?q|W$Xgf!7LE{4Aa9~l2k6J+=w68P{~ReGZYA!|;%{_n zvf`)5PS;GjG}WgsVF!~n6H^Z=yk^p;#DZW)?1k+i)d;-MUQo8=HT21l+1WXz-hEgh z6GfP~lRE^maP0?g-_v$}o4oy3LK_`B5u<!$TxJv2LFu3%ps$6stf7s@KEOCLgslgE zFES7Yv;XU`h%_7NVQJqel8Bj@VJ@<em(d%V_fWSqh@0+K!ud}1;5g?C7;iDk9Fi5t zM&w2nB3j|nc8<#^9W0X_fHpVfR#-%u@0>u7liNADMbCp}YM~wvwo<L05|lItX$)3J z1VxE}M2ZmG3!xJvmiQ~<fptfnBaqG8=*6Og@^e(aO4*Zk@|(hC9}W?Lx+|aIbwHRh zs~P%eZF0_ITQTOKDOi<$ED1x%i^y))PbuCjAN@|gh}X{X)|S`WCK*!bGJrG&p}dQC zah0*WLgT4a%a>^Am+5_h4U$WGo;jE0Hipz65$AX4i**0;U8??wGS)&E1u~{anP`<9 zEDR4!YCv8_78l3r1h0ZP+Z+tMo{&GLS5+9(u-)~rc%^ZuOFgFq=_-vt8pJXEP{2zF zSd}<gbVk1;XCU80&&NmsN#WScRG>ECdq7DPA$A3;YE<<qi(pw_;@0XD>f<P}Q_dl- zNo~#VQ31yQ(2%$w!Jd3>f}vU9U|)1{Khd5Q+IC*P!tez(W?ZdfbL;xf3VPUpL{(T3 z1A?O;K)e8k3@|T*5pN6J^OKz=Dx+r!qNGFEEN1YK`xLp)-=UqrPBEFI#I0YUbq=ki zq_xbg|Ay9MXe}qL6>j}+w9ccoLaiZ0l0+H;T4iNuH0q{Yz`hm8$iSHahFp-u>63Q( zXH+HC$c|oIZ1-CJP%w-MoHF<lNOP(stGsH!ZuYKW)LOFdWZ2twN@J&6HOG0yByBHn zW@)6fDnG!4YV>J7ax#(-jI%_Yzm3rxaAt4Y?XP!$vy<gbx5O2$DPJ||7Ux`-Y>W%r z!0Mi9!eW(q*z|{9oZ(Fz<<5Ip;vrH%ZjGiJ`jTNA1ceGl8AgmsWX=c}rO6zvOw`A> z$#jZ@NUzaJuyH$uLaNWoP>O^}Ou%eLM!*|v*iyNUOYi{u5}w;`cOCA3V)B$BoqhoY z$UDA@@sDnA3vIta3J7{AD>rT9o*pb+IxU+_BQKo}5^M-cvH0kF#^`DY@D`d-&1b=! z*o3Qx8Q3k}40^$S$y=}~Hu)KyJbM%cvNt3~WC0*j_~yPs_(p?qZ+*r&1<lw4un*nA z?oQ$pF_`h2y-mf@DTx$E699|n(i2g7S1ClqK$WtS6hx?76GA!pR0GFmtNRqxA(-<o zNJ+%RhHf&z1EjOENM&QRoX$8gCTi}KhGVlv_$DAVO*r96Bygzz0{#?mg5I&<XR!qr z8G^VXyQu?=>c7y#?5EnN`UYZX@SSa<EMbU!3MJ-8KOP4*<j^B8^m&+`=W8S&K`rdp zn&ZG2n%2pOr2t3(3sXznhE$W%VrijlgDWVo4K6U?(57v#F7M-QVs;T=go$|4?8=|x z{l6mxG-g(twzj-5@^%w!`kmIc!RA&{)at1vlBEp@CMb~b8PwsT_8CGzN#uomM!mtS zN|xymQYQNcx6w|DL2M4TH`UrHDkaY$`wtpgiS1~0a>9RL+2c@6-Ht8MZjsw2``vAC zH(;yJxSJ`a%(>a@?aFn`@|4)3!KY<(DdPpbkJ4|El=Nm6^x6|f@#vybIsuVRFf|?J z7@tBOjYBw1O4*o7rOc2P=nuoeFbohwOgF6*D!Hq{`1N;S=?9qNKWUvrI87fNPsdoB z8arJcaT(cc7K<OC@Ts<;#KQgzaT;Q7AU}%H=$~;^hWy6RLMRClz=#1fGr!eHhg6KF zY0MdyFeEtRykcExgiy5|6GK}Ygr1?L1mx;V<CofWq>eFO10aW?REnI``CZ14lS53H ziXrC{BuUxmztEr2rUkVzx-_B3w-9wo1jf9S?u$soWTNrL91mCm4Gc%xSRC(Qn&VBz z!?8s%2`96GKw@}QK#9|TM?)%3hs`9y#d-L-l4H$rZXo+&2yTAnC_^YtnL@a+MGzM- zgshNL>;)WKq1l5tGiU-iDoITIFrtw&|1ETgX+dOiG!uTLRn|wR{~+B`B8}O-MFX5g zCO8Bu3_4!0JQOTUkS<q*MJ<e*GL4amASp*mTWou{*vHY5(THvGC+WK7iSuPW#~WBw z8+eKs|3howO)#1*>Z50lZsMtLZnntS(vLnQ;Bp-)xPW~rgMknkj+;Va6e;Nd$AXd3 z21bTUMvN>>L_*-s$+xKof^ycOj<OwD!diqpeN2crAN+HO(45HZ8*uS52QwlIlLMn7 z5SXLew?$3N@b`$J5H?-FJsSmP@pf)s7i9{{qCAgsRUAiY0VUjuiRDe8Q%0?sgE<BX z<RqS_5G~yT?%@^@4x_cHqlFyZyg1FFKkc9*R&X}+dpSg3PHbEF%2qv5pXxc;6^%<H z;Lhzl&{I`mZa&j9jZux_YVF=;jnr1n?>BMz!U6tsYz@x^EamFx&(xZ}^qOK9QC=`` z@J#JpT<`>5O?bW+dTX)%DAo(3Dll-(b=Uj-5RP1P;JWAQuZ>n~wc4iNUvK(PzPo@b z`(G}V)B;?0bPnBd0RT8x!)?=rS|16<$CaLn`l5>0BkMv<_@md*c|1z(M^E-!8-I}o zfzG?^>$&cQbFx0F;#;i$$wiIO$k<@AqUQ+<s0{?PpX1a8KlN?8?q|_Nap(=dxfx(B zSUjn8;rHPza^v~>XesFg=MP=_+@tkK;7ty1Lb?0e=sXG-DOhW5q1Sm7$OTwKnT#^F zplDXFkDlY6G!KyV^gO~}8{b9Mlkq^ZHCpNzOiW0T4mg^@c<ep;SjO4!8a&-&eYC)R zCQHTcvCR5t?g$SsG~rM`-IlKJBAiQs2Ke50p$m5*!OH7W!QbRwkDMdK3`x#otKEaQ zMp$YR{ZrP4;&pLWaiyd{lXC7XB6^(R&~cn;Z@9vjuhUzH`r~?%V&NqLUgj&{HOgf~ z9Z03|l5l(3BiN7x0^>rWjIcwtW^pdrgOeu-;$w;R4K)hy=?K&#T>ZaD3~!Z#u>{Rm zW}IBWodg*`Le7R!;*!Bgn%W3akMja<BY~@N7pa2K^jy$K)rsz$1k7=9ezRVV?J?gY zZsH;;K19&N#qF*8VA$lSzU%Tm3CFoPG$QX18Q!Ce+&;NQ83BFyK4pYrq@?U2Wwf&? zyP2wfzG)&CgzYh|P;Gm`K5l32)AmU_W6#=o+q7rwth$k+n^gMIa}J3$`*{?|E<uk0 zkWg#^A-D|mUJjQd`KS=hM8!k?j|v6Ua3w^C=9JX^wR`KWYq#IH{eFFxO>Ue^Jmt8Q zoMr-W<tLbju_k-s@*}ElB8xM^TOV%5vjh#A?f_a)ZU*FVa<z{uXsQ<!^+S(tE~$x} zd-B4L@BrD}(=b-*HY!7*VEU8Pj)*b>;O$mxOo%cX)7UAk2tj{s+YXAM_Ax*ojGCDQ z=FPoXu3ORUp$^Pb+C#_$1`CEp89w>bs02``E(A(=mjf|NAf^rSWfDVgHDY~7Zeyaa zO=Ljnr8j~AFbC0M{wIkk;Ul?|bgw3VhAb`+9m3#I8^MZWEf9%sY-l$u#%1MAeop;= zN!fRiTmBWj{erSzQTErA{S9T;C}R=6N~Le1D}jKZgqPY3yiWQviwL&Y3k~|In?@9# zsz0x`MbwrdWrT~IlN05TT#QY8SLRn|))m7E;)~}eAFzgIl|po!e$z^HhUBQz^c$#g z_5UgS9~A2TqdXbXqkmEfSi{Bnw3)S|qk^RjM%TcXiC3SeT^!?>%jA{p@r{dfBKfD5 z8>t3N)razQpeU3PhN75xi_NiOfg(|;LK$Ifxk4F7SsPS3Mj3~a4B^MQt!BViIv-Or zi83?#)ZwM70{`cr6w?)gsKI??N;H(3qXUJyGbkBG(d1AQ6k*Y{tE4zB1fnR|K(}xe Z^vxR3Ecx<ZXn$I<fMfAj%v+`^{XYVjk)Qwo literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f05a9e5c56e037d40650bf16dd40c80788464cf6 GIT binary patch literal 8599 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0ea407ea534aa4866eae860a23903846d727d73 GIT binary patch literal 6480 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 WTFSk!jRqc9sSbzPT>Xvq+W!C%hQz1< literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3e475091962ad456683b73c7cc33129a82400fb GIT binary patch literal 1395 zcmZuxL6h4w6qYO}cASKE%5=K4FymYCVPhzC*fPMBE;C%1y}-#cjK*upS!W#Em6UDk zW=}2uBYWgOaNu|7%89?giT9LEwp&m}($lk~_kHhu%CqS-BGCTG@BjKIBjhh!?3xe8 zQ|S5#20=0+sPJl<QJ7inEm_7W`uy5o4zd9yKN2wz!?#2XC40lNq40htNznfg9V?j| z8RxO6wBc1#wqPk)m{z@tzSpskWz|R#S50irWc=bx$~xAaEUL09a#OWU^fzE2CkeH| zal2gRjR2F??Yuz$u6bZQg|25XNCHSn<_VfH;mv903nu)xBpYl|0=__munxosa7K2t zN7sK+>=4h;d3Y0Y!upY%&ks*?Ex)x?_CM{}#6{bfylSdu9?x*kjgyts@uxsGU)AR8 z*tA{TmX5J*SE`V)QBo!a1@PE#Mn=cbHI_+`HQ_J<T8gO%Apl1ZVEbCu<?lp=u<xIj zX{V}lNO^jmtF&xuA(c*-Dm`6rexx5aU!99D3*MbS`plF^^M$HEFCRa7lKzr*RR@r@ z$?N*?W!Jp;qFD5)mS)wNwypKMX0fe9y3g9Idu8tcbyMYa)l1%XSUG(c;Uf=1`;V_T z|99gJ;z-^RM-^UCcH|PO0&qEdJB(myZ-atvggpT7F6{m5u<vi%2gNveu?yOOu_hZ( z_a(icYqFqg%As$(ODGG>Y&$P}LCipSZ|Io(=6ys2yGJfOGu#Bi--Kqgh&JQ3cL}## zQaFb<4&X+%W}C^HE`0dr!5hMg4o|lAM8Wi<y>|NOT7mu4$r82o@b$$*J3e*1+;d5$ z_U>F7zT+qORejVDxTrA<mZ?>vCeEs5qZnE~#<Rn+Rm<F1uhrJ?a&u;b{8Xcnp~xO# zoW$QI9xuqI`;2nXzM6vXy^5$?;CldF--dzEh=%TWKo7i#_SYB80M$tn+K}@mUrNqx z#QCxns~YVI=g(Jpef4E5q%KtDgk>iyE!9qC3Ll80=>oq42493ijVLTJqIZue^n5n- zLl!dUPXZfoF4}@~^஠We(scJndS|t@Kc>5ROoGyFr<o|`T;Wt|b-(gIR5PUE6 ICUnC71;IdWzW@LL literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..807b192a6a59aa57edd6cbdadf9ad117a449ae6e GIT binary patch literal 64851 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 V)W!#MTvIETIX+mfR1S{r|9`IN@Javx literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..137433cfa9d2dcf58d99467682a77db93f98241c GIT binary patch literal 21697 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 MI+>#5>~Y5b9|>)2DgXcg literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c08178569e522b74d7d63f628602f22f98d9a82 GIT binary patch literal 4027 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a531ad47034303660133df04f6edfeeab759e4a5 GIT binary patch literal 2428 zcmZ`*Uysv95ck@S<NQ0W6u5$D6;zdyN+eK<3Wy@ap;o-yL#e1_6<I#-Cg+@En_VZ| zMThzTQv1?R&^{!O{SN&k``V{|1)lnwO?*&}I@;OU@$Am*{AR{^(CIWSJby(Op8oDz z*59<Ko*J0@80sewZgG}c6Be+E9oUT4cIpHUW+!zgwV-BXE_g5S3|~v@6F>0Rx{aXm zoy9#~e`WEy@WxG1d+7!(Za=nq{y(r_^=$2=`AGXbk>RvV(w!dD_3eBzi82nhnMD(! ziYOKetBq*}c0Y_{yqC;GOea*24dy<EdH^D<fN?9ZIfJ(>aJfBVL5(}yePsn6uW=7^ zo!7aK+2;-3#N6O5-p1VI9r(AQH<L`2QJRKgGzyb!n9uu<R+4U%b^DNBC21F~i@40? zVRx9zZn-DA<YY7wJ!jrtpK%pR-)P3?TW_?>yt{teE%TVcZF*>?yKG}90*YHlRtO58 z7)7U5xrLLkbd^Yle_FBy)z?1{3YpBJQVeF191Qc63#kSZIoKVC;VpGD`+CN|io;^| z<+XBnYc!VW_2JFiw+BBAilo48%zdvO6xs6|@pwK^qMR0Go~P<<HeR7KsQjqH(=QJ7 z=_E_aBubOH2=k&$@=Se57oi(jZ2swqJty^#BjI3+hhZY|1k91OKt^(ViChHFxU*z0 zSZOaPBdsGgb}?#8ci}EA?rvExY^*&*uU`7&#-e#-jax_94M}@MQSF$h)^^^+G);DU zwrs$dA=<AlH*XvRj?_4d$b{33i(!%pUfoom9YG9{xjzrrfzq8~e-uig@~K1~>-NJ$ zl``2yy64%-0%dv7B3m;62C+N^7qqw9qU~I1w}{F;?T+&#Te;?yk%T>6&!=TEEmhBv zlrDiMk}#fd?e9iP(7`4(R-{d*ZdM*vexHL>od&U(hhLMq>@;Q{bbjdsV(;!g#)~qy zj$!cn1I!AqC1X~}#y|=2cb81wF{|2YrS6p8xK2EV&+XrUZFa?IG}ijNIHw6oi`GM+ zPV<(vbSMkPzADT1qO;O9c|kaDaF>&XQzReS=hoVb%_R!VpziIM7^8yfTposUn#~*E zi%C99vQgJWYreUi7l*X`Orb(Sdmrc)6f0mQ1x{{(=vtysj`BS5UZT<@+n1ET(5Ev+ zSV|$}$L6&-0RBqX#es;YrO@6qGx~&p-V~XdN)aBn3GK)5!fZbag#Z<{>Pl~SMuYsj zI6H9l61J!_AQoV~$j-10b^*|~0r5xn{7iLLmF0bG`466islk&95wWbgki39(kG<D! zi>hFqlzpgG#eeaHwYL<Htx~6OF(`Vf3-XHv%u)5PeAK%2t2JgAsO*=(-yrGi#HPKh zH_<1|^qg<O99-t?q4o3=v;s5_6hBj4ZXelOxXivMJv!i-_oF#>fkREQIt!PQ3@b`8 zhQ{me^z3=9uV&d`?ruMMJb29p?@5oEZUP%ws^>|$XF{aCs3=6nC3&c8T<lIqJx4oA z#@gYkMEl-PivI-C)My>z2}<_{wkeWWZj+ruNw$ID{EHKjta7A(H_hWHRrmVq1JD%+ zI!U=>(i82C+JwADggzRTak3&WgIvc@1c7C@Tl4e(Yip<1(ta3H9)_WAhT$aV)0Fsj z7(Sau>H1AQ40#?y+~PvTGBKY8-JU8Ts}3YPuqH1O`JBiVBIL_kIZeJw<0Lg1x`WyT z@tJG8j_3G}-|{=YBk66gts5LwM*k?3iM^>tQ?S73__HSInvyam*m@)Fum4||KP0R0 jnc8eTT9uxV#>o48)BfF66z);w800pYZ?}P4oB7VaSpIZT literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c628ad289467278cc605a54c8438acbb341e739 GIT binary patch literal 4104 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 U?LMgW-a)$<ZjJxd`t+*xU++RD+5i9m literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..768e7390085f2891e192e185a2fcd3ae16c66446 GIT binary patch literal 2307 zcmZuyOOG5i5Vre0uk2>?Bm`v$3TP17Aqf$QKqv}PA`YyOf)vzJWc9Q?v)$=eY|n0X z)RO}ni5tIR_6R=#@k@M#3x6ROsOp*7goR$Y#xB>E%T?c3zTfM$34Fgtm!AIABIFNT ztUm`P_h6_WKybooMsgZbigPQoa@!)5<WA_WG+yX6JAUZHubl;XD{STMu$_0p4keEW zcewkCa96mgb7+SSw;q#$_ZN6418VH7oa_v2(|wRAEtAnyCuL!}-$i=&TcIN!>Bww~ zLQSP$Jdq;Sr96o7pVyxalY21K#~=g=DJP-DX=rnc+ph>5*aQ%|yv=<cyrK|r3qt6a zjigXI$}*;6nN(WMzIagfi&ExM)?cdnD~nJ1RW?=qs5t10$%G}vxa{xCsH%iqS*n=A z@%Z5{#`HA|bsmH!DP34KIl?5;nlPIaIN#cNIB<+p%48xvFf&_8k?17Kl9^y-g?UiM zElMUT$djW)HvWak4p_c^Ijm%|7ilrvi{x-zW?V=$%;j*DGImGZE<WGmpT(@&yZNae z-<hN`yD`3f_wMlfVU<+ZS9iMpqAK=p#p!IQgq~KqEHm}?G%oWzD){h3lD4Y@89)$S z7z)8cXqV2ep0xV!U5*okS8!o833?3^4kbgBHOR8&kfxd}pnRCHnxszZ%A49t{Y9`$ zV&P3d&swn8miIB4VBbOexuv_cmG<;0lrT09Es&cqP9HjRyRoyu&e2;n0)rgdbGOmD zp!GoOagY0;^=q1*nFqBmf8_z#(DW><TzxJ*|ICuV)$W9XHdtIZBA^e_i#S`nQ=^~O zi>t76skZCZ;@u;1WIZ5HPtDs9@8!DvGa%&opHF~K0D{(zM7)?_4J*?dO_PkTA!*v; zg@~s*8f5~uIFN+xLv8`MVTUD($!P(r$-`N@I?%giu?_Zv_so?yHQinna$7{|0HE7I z-uNr6>HbUI0e|dx3y(YIq`zW`^daCSVr{TCK{?gqBoj(PD<S6GL})fniU!Ag?Mosf z!seEvNC}C+kv+6;bVZblu!A|+10-Vy@WD-_wG6wD8*)C8i54<E^CT&Fxv$<<8e1JG zxq;4{k$}W(tuDY+C1Mt5ky55TmSxVWNJe=WV2F{NsIV0&wksl_kLm8?39GyhIubji zu|yJjB4KgPjf2?;y^+FI*wkg^&l~M8bx@C0ag5ivlg4iT6%T8uyA;SBc>%;G40RI( zp<7m)2K1EWQO|N<ZqZHJh2Jj4;ZX<vJleKBD}bHzbav(><**o3#|<aJBVGV$_6Uah z5d_f8LYmFp+?sooXnWysyM~UGx<@vwR}@PD>_-+5fTXQOyY?FzdWQ&el6KTfpqPIM z)YQG&=T2>3Acxkx1yBdlHMXtA#u0$Lc3~eVauN2S^LYSwe|DoOBy`gL8({YlK7C#G z^{!aA)BbU@ZwNB5j2rLfB{#izDy1kio92;vHoNrA641bb{x!93+u-Y(GIT%r8`!lo z*p#Q?{_;Z<AEB^77zf*U*jc9$4m4J&j8nneW1O^13V9LjJnZuYH$ImK$Tx{ug~km^ z<2Gf6*s@ZIL3@ds&XOq%QEh^_EHuOmjv;&z`pE>I7{T8}V>}J`5E=~NMuv`0BIOF4 zcMC@Inh<N#+H9}^NI}E^J_0(syuQYYrQ2`Ad1pZ7HE=NSO~9J47&C3gAfRa`VBTfy z`83KfU|9K#@iJzt>GKUvC5G@;SlGg4gJOKSkoOATgn&9$-~=Bu-C@u*Eu;**=$UFV z9=?CPK5j}U!j@a;8J#ZM48G~|G6>VFo=un(s+`IgdJXoIWf#F}{9kA$_;Pu_udu@^ Oq(hf(L9PPpto;wqe}akt literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f3505ff1e9f04f667c36923b851ea9a70d352b1 GIT binary patch literal 4640 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 CcgKYQ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f3b030c692e08c236734083b6b0c1f7fb41efe3 GIT binary patch literal 797 zcmZ8f&2H2%5VoCUH?&&`ao|vK$dQ%kx<IS`2qAtB6_-5}q@o~Xh1eSsIkvHrEnW3S zAEZ6<4m?S&oOlIJjI+B{g{2vP9((5dX5=?pTN?=0uWbACLxRw6e^{>&z$-Af2aY3- zC8}|XvByM`Iv@z6I!q&sP7n`xc!hW<qAL6mq#-Bo(Kz}8nP`l=K<Z+e`@?zx*|PW} z00O0$qm+oC3acoMIOgOEr2`&7k+6%cC`#7|o8wiw-@Wj+U~U)OV*3(ZgTxz<*Wij= z2baj>GY|_mAg76{!41LaBSfHTFzsSd6s%M;z4&zY`gHnkdUBkcu9!+yB&AEZFjnMQ zBlwe~bs}lbO9fsht&uw8NvS{<?2o@Tjd916nhR4-v@NKi{aZR754%m<DwgZI&J^!L zZOg(2pt%bm-o=?xx>dQbek5J!rNG2OC*<rWvYQb6drpll=OBa5GfQV$a$y~<E&Wn4 zcIfui!JO~q%*>zdHnYQ`vhwL{|LBN*pr$lCUSuZa&Ud5EpXb$rI?=SI(OSB@a3zqg zhdnVDb_nb-m>YpZn2-&8pM<b4Mz_zPi77N0Gp4dyFxG7_R%_l$k4KDsYcsjLu>&Zw zY<<WW*EwT7L*L{b=gInK5di1EVT@zaN5+Hh9*4isHl=j^#M15C^JLY+WUZ|mt|EQz YlHL#WKdvr*u@wB$|Er#GgdYU|0OtbA5C8xG literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0f67d5e160e578e8908029bdebd82286989ed0e GIT binary patch literal 2546 zcmZ`*OLH4V5T4nWRu3nR<2);*wjeHBB$h%TkWeO-BBnTDpr8n-a4oWCB(J<L&x{;< zOS<4t#eoa|Kss{a%z@%paGEP8{z6W4k1RhzvRl*B+cVSC-Sc(Nempl<A@Ka!zP_n^ zLjJ*z+2a877@GV62qTQfB%v)zk+)(iv0Jv`?bu1&mTPz?_F5i{J8`L1g5Hh&q}(c- zF)ywp)mD{~PYEkA|2bhkuO8a18gsrP_42>43#n6G>tyL37b?u#Y8$@oIO{>TxE@J0 zP*E&D&sCJAp9qnO4IG!zK6IrgS(3C<)<HG1#|GvxH2EPAPFj?amc?kxW>(8#HglNU zvs-SDfYBZ+Jttta&&tsItir0$mst&ro70}iR9o@l`Z|xf;z1TOE&>KNiD(PV%2HX} zW3L^%6YOxFM`<tE2vYuxOBHmZn9I6dcu8Azwm;G|DQ<wvii=bRDhrG_SP^`85DCue zFtv>Pt+GhKY*s7*!#gSy2f?##E_k4}`B{sCw&1YL#l2z4PO*{>k}a@1>rU09L1%ox zjd6B|Lcs9B-h%c7n!F5zks%4E6ru^d#Rx=*Zq#k<8k@C`DnqbNJE#i|$B{hl{zk-k zQ1D{V%tf>Z!EEleMYC%nDVvFCZuP_PfxMr7u*cr(g!$gRyQ=%3*B9|S-TMz8HotD> zQN9|bQnllFbw5v^z1!&*P07_DS6LRz(`;vohUWCx8u@`<h|)+!?KmoUm>CGktLT&m zgisIO;@Z*d|Ia)V4@i`0JbngdNcs?s9bYUc%IG2ek%9zb0+L%Gu~2d_uWXba!dPfM zCFu=^C}*c4zMv3bN?@Li^S&dg^(|2@>Qr98bZCiv#OQOg%h+e$gsu~#1tjA#rqRU0 z<iZ5nD8Bq`0Kk$t??l~$AWH$JB1kfT#)^r@s^ocFK;&8d2wum4Tj7mfBUo+}QNE0; zmK(g+Tdo(k&Zs<rk3sJYEycCfRXph+!Tq;*&`yIWRlLW=ao`X{F0`+pnZWnJh0Xa9 zRb)uVbOLVuYVATLFd(U00vBi(^DD1g+G^a@G&f^YG7rNqDr+%74SdTV-A28*#v{e; zqjT&=>6!Cxti@TU9m_|+%+|f2ceJ~Oh=o0Cu-=e*MO2Z;8Yt#~Xd4{Tm2cYdfSb~z zE0Hu<OgmhlW4ea6roB)d<XnQ~c^oNy3E&wHQpUj+&St=?Q*jP8V?La?qvu~X_zf60 z!6LLmE$Z17>O((I&*5ubwTdgRarHRv2ybjAf&T^ufCIIBf_2<tc1#mG0)GDw1n4^1 z{C#8rXOEo;RPifhXk8&7p~~%h;}VScLu&#+9@)%g9stuuK#uI8JuXiG%FtJ^SJiQi zmDJo2fDJ2b9D&v682QP%Mn?AjI<DMY``#KkBiGFKhc1E{W}TP6nEmEKLd9R|!gv8W zN_Ig$zBuEblHHq6XW-X905*)$ZYHp1VbSTu*_NhnABW-$1aH731HnavV4se`$q60O zu5}uQwze{<9lVOP-{UG#QNjTz7h$!g-IoqfTmtd?&}Klqd2~8rkiH6g#pNYt?tv9~ zl#p1Emt;{jx6JgTzNo9PK0K;uA^`mcoVs?pbQ|-+w4HGACeC;Zh<5r}lo~)o3C@Jl zCBfltm0aM>s2vO!T(CTyV!Xt}K?r+kH<DPsJ-LlHE?j<z5}a#qkj7EEQ}?Fm4Nynv zsDx<OlmtzcSOWP=k<m7&ZGv3lB1Ch|s?i0y2srksZ!H)^*Psa3V5F#=#BHNq(SB$g z3qxHA!z5#am;+x6!`(qUMwj8M6oxG808?dLcA#kBovdpE@O74T`urAL6TF?y1mXhN zB5oqVQ#)m|NlYv;q67rXf?NRNQ^#^F%cP=X`L4fU#^L|q9G->wJ!v4FRxfj38{stG z^Cy!y{=Ud*eKF^C7u2^doLpuNzK_2G)6!Bokqb;_v+JwO)&ANvK94X7Bo-M6D7+YC H2)X?q#MP-# literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc69a074226f79d4f99605c77083f7cef9ca26d7 GIT binary patch literal 941 zcmYjP&2AGh5cba|S=v;f0urDeR-%_2nk_%2tyCcd2yPWpkt(gItnJzx9QH4^leW?3 z)II@E&>ndQp2Sy9yaFf2=>}qHX2&zL-^_fTw`*%F2+q&=$;o$u&@Xpc91n~)AbJxN zM;vD;#}Up+L@@e@IN|gPaVp3qjVSkyP_OkHGEtA%Rl%iUNm-<FU{}k^$g*Iku@;F- zSR5#LTVMkWfg;RNL^uX85_udTuTa$DEdXv?U&j*xKzjQ02&^C}^E@v2RwfG(+!oM* zDT6pjWhSP(E<MoWs>-C`%L!VTan(=KK~SooG+%`REZ67!#{@Ucb>Qpd9f+<#)o6%j zSfUv@|5W24eveK*%xFzH{zg<VT0ehP<7-mW8+=V~5JWe>keLV4nzic|Cy=#Ww`+3k z)l{MzQhNtzw0(?5>&M8n03BkWJC_s#*)TIbRPF_)-DcFljoR~VmrHGwJRLhy?cFBI z8V>B;fiTU5ahVv~l1Aj(uE5}2r13a2$`NmUM^q8#!gjd2U}{|SI@Z%7OReWh0Oi6M zSq!wLNzN^W3YKb>SUQQbA4uH?ls{)-rQ{?wBAmo3Ov{W5rNdl>r$ff}^iHum;V%<b zO`dO?bZ;<J*|T(Ke?R;jR<hcXg*I`PZJk%e*^6X24d<_8$}-c-W;0{B*nxg^VJS3x z2RhK}pb&0jk93KT3E99tenh6-f60(|=r)KkH!Wj!g|WQk<ILGz#zx~fYa$)Sc$t8E zl?$CHIbU4$5DLtvT~ZI6&%KWm-3H}D2OgRG4trko`2Q&VrvE;;fW$fdiY@?_KpmsX SAzT08w!_zMAGLe0d-N}4@dh^l literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2ee309b00a9e5f417a1b2b4c287c5a26b901077 GIT binary patch literal 6799 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 C*VP^X literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4946dba5a4c944dd097b7721adc22b4307b9ccb GIT binary patch literal 4539 zcmaJ_OLH5?5#HGs79dE`k|NuQ<=V)hB`5^xM;zHzwqiYOr}Cf^%M~SvRLdo104}-M zg=ZF|xCN%{$cNnQpCBIdAMy)w$|;Ab$|)z`a`q`-&n`fLRsz<{&g^ve_Vjdr-NW0< z%PkAPzs28w_^%6=^>3QYel7;@qp7daaf`Fm8nGT@G`3TF<n$afc2alb^*l3nQ@dwl z-A(<TkEfS5MnNwyYkt}swR$a#8$94m-Ws~SCH@?5^TwB~*XHN>3J)+^{>b9zc=Jn( zH%05Q(_6uOmA5c&i51Mxard6px$q6NvN}w+`+0UCWD$+yVi$8K&4+kgyql<EQY5MR zcw8iT_JNeS+^XpZ$#5J?B_!sJJNal7XIw8q5Ei0Ak_x>fcv3{w8@-ep5z$Vpg!Yvv zFxOt1_v5tBNDcgKG!N|#n%YG-g~j%5+2-~=8ao)T7uFtoVw>J6+&%AvardNJ_psi> ziqCzFZu7?YE)R~Gp=}hf*OXnd9<vj6&njTMsrA_YGviCJM7#XrBT<CKt_Vr>EFOt4 zADB6x*<d|1+OCJgG~bES^)Q#=Sjg@KHVCU-wpt;6+xtnzx5Lpy72yu#WJcB%!+m8v zyi)OF1OZow`-)+cOW1MQglQ(@js9S${fe+$o~vM9yTqcsajud_nr&#Syzr;ZH8nn3 zAS-V?brjb+VR1ATbCs?dU9PT&SF2B81YNF@;Hz7mmbP=HUGfF(?&V3Q8$6L@6WyGD zLkE#L<tWmwS!#(#W4HjxkaUo`^}9Ho2;(yyTf1Zw?eM(#t0iB;`nQwKu}lu)LTnzy za&wTUTu8M!lAAkwQS`QYE4y*Pf6|Y}2XDMq4Bj5@$@KNXTkpKH`RV338F!OR6>*w& zAC0raH~V|#rm<U*=c#&n*smOuUcuou#z(S&Z?B-Ki|8ybU@i-o&(7NcJI^jMn|;`K zXa&D!-HbnOz)K733FB;Po!HDO>?h8Nb?i)?C+^f5!mF6|=$}*e#5=L>S`YvJz&>`5 zy{X6T{Xl*SPM<qdP@W*-!PA(!#PQj6i~}0010&siil$l7Jep3uTIv{5{o}^8VWj@U zaCqSGA=fo>TQnp6Aa}{g{g3&!|CHR>w?8-hn1R0m3BVt4wW~Sl`Pt|9q2Ybnx6gxW z-&6Z*rmh#uh{xt*`>WOC06Z(xfOc~qsP<dy6YKYQBC1;PA7Hc(fC6D$N619Rgd`@) z!Xgiote;M}2)A)SMUoBGb{#|Wd6+10^Q2FFu{@%<oX--W$aA;1w-9C9+u;GZoLUd} z#gX9Q&XEbMQy(xgLUPxQFuZk!EgXqBQ=}9ZsVIbrevuW46rmD^b=}B2+yz7|>XZT` z6sW2_kPHNVe>cvCPy-595;?XDsc|urw_)VnnlaMW=3Du$Hipl9q2enqe<ETIqn)*_ z%tzsx+A1&KrHv3lt$+B(HT5tYRO{vCTikGG;&71w>aVHt(wuuuZLFy|+bi?;Vl*y} zDw(qn%w)fKud)RM5id!Uw0p>H-Is|`YE5Z&*f}R1gqilZ*qIC^!M{HDNql(6B$D5l z45M9%jcP9`#0bEYWP@C<NHNL}L{xuRFYU(abP{tupDfpuRRYqD>Z!DY<I-+E7Mb=A zp_1q{budGJ9n20B;3tnFImw8&P`XinQC=fe{aUJLJWsQM!M3Wq3<4RT`yrZo8=V!j z0XA&_O~6)I+isz6nVAdVY1wVee4?;v-nK8{jSu=h@y>o^uJ_T@8|Z}9W86Z$z<Lh1 zxx?L|({s7U{h{6Ss7m<KLKT5*hi9Y8b&_zceD~IlDrDS8jzUTf`)RCj#_-iTTySXQ zsUv~che@$pJDG`G)p5$@Ds^=0{LY5uYbriKsxx`s966;^1;cg^6NLCYbx;;FVjyLS z^2J=nq`dJg8U2Zr2*l9jCl#K_bTd)S+1b4(-=q!JQqLj|goM|)7{rsbcn^nMCEL!K z{VXUpFHopZq1<){O<h9AQI<qik7K|Xg&Tm6ZFL-78)#ktk@odOu7ekKldD8})?@Vf zBtv|}X;O-)Hs%BRo{!FgJNT@8xq2Vb$!&a>e6BC)N+qb#_W*;Tb&T}2XUP|ks8|8F zp>hbYZ|ym9y?$rU-?`k{Z_3;B9u!DYpk(UPn$D@{3U3N2+}(HOUg2|^p{$y+2jGby z0rv2>WE)?X%hXYs^9@<D-263_NNOzl$pE;XrPRR{P3SM2TeaU#L;e(e+K<PGT5eLg zyg@R_o~T+yCTY7JTT-;?xksooQK?r4Nw#3&81#zD5)1W!kFccHLg={^s0c=z`F8oz z({?{AVyhESQAF7VMNun?Mme9PG;T-HXOlRsR~k{o^FF;c9#J2$KDUF~1sP~|=JFjV zBX3eidOg({T%j2L6`G=221Sfx<L7&U6L<?~F~5QQ0(6UL0h|C{7_4xGx92|(q`<Sm z8$*V%xnTe`0^Z_Fcs6m%SjMx(S8$}~B;9(-SME{F*O1Xo6RLGj0U$Q9S-y@i3*)R_ zp)@d$J4%jmmIEnfHS{c;gIef&n)S<<>Io&1MPWcJz(@`1pv}wWN`aabi!E?;4L)OC zl^4u#R^C^{2v@&K6Pn5Lg=!dHn`B@`?F<|<O!DX0^E|r9hY5^LbiIlJl~X8^5G6A# zKm<5uj5xs9o1uemFxVWiZq$2|uS0~U`ae4TSce%`K70D)8(*L)bM-V?!vMpJ;Kq*r zA0{kleS1M`#5nM4KTt0d9?(d>TDXJ}h-YgL+T+bljC^$y?|~DzK2dx-Tjkn9EO!CE z=0+G^$DQDM*zHz!E`M}}Y<@K42;FXFc*Hrmcjf%#x5hLkwB;{pO2_a&EJFeF7qq!$ zE+U_<vhw-bGH0W9;WX)PU{3Qo1_hxa?b}8}k<S^oPiX8VETQ-QV~0-K?EhQV)hvSI zl<y53$+_aXA;mb2`=U~Q0~F6zUOOl=zQVF1DHbrtWiQyqf9X)MxYb#bKf{uIpSoMr z(Glt;E>vG8Ch{uV(Kh5=>P~UwW12n-OvsBAHOgrK6B}@1Fb{VlyKM)JpaG2uxI65_ z&Z=HH&E@p(0dwDz-@|fM%dMU+<1&~_RUO@PAn5%7=P((Yd)kJ0R0x@E;2yg{wVbM| zKML2HLQ>At08HHUqNu`qV_@SRr1i75ql0%V=)Fn4ZuZm$hEwT9yTPB+y3qRZ>ec@O DEb`E` literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0033e5e9a92640fe11aee891a23bdd2d4053667 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64f9de9c0acc22721f7269703204e630eb931052 GIT binary patch literal 5205 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cea3e8c7b24544317333fe36e46b9d75b64e6606 GIT binary patch literal 6150 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 W(q6?6%b-w$ka6k{+C0%s*ZyBdtCJM~ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/alias.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/alias.py new file mode 100644 index 0000000..4532b1c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/alias.py @@ -0,0 +1,80 @@ +from distutils.errors import DistutilsOptionError + +from setuptools.extern.six.moves import map + +from setuptools.command.setopt import edit_config, option_base, config_file + + +def shquote(arg): + """Quote an argument for later parsing by shlex.split()""" + for c in '"', "'", "\\", "#": + if c in arg: + return repr(arg) + if arg.split() != [arg]: + return repr(arg) + return arg + + +class alias(option_base): + """Define a shortcut that invokes one or more commands""" + + description = "define a shortcut to invoke one or more commands" + command_consumes_arguments = True + + user_options = [ + ('remove', 'r', 'remove (unset) the alias'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.args = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.remove and len(self.args) != 1: + raise DistutilsOptionError( + "Must specify exactly one argument (the alias name) when " + "using --remove" + ) + + def run(self): + aliases = self.distribution.get_option_dict('aliases') + + if not self.args: + print("Command Aliases") + print("---------------") + for alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + + elif len(self.args) == 1: + alias, = self.args + if self.remove: + command = None + elif alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + else: + print("No alias definition found for %r" % alias) + return + else: + alias = self.args[0] + command = ' '.join(map(shquote, self.args[1:])) + + edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) + + +def format_alias(name, aliases): + source, command = aliases[name] + if source == config_file('global'): + source = '--global-config ' + elif source == config_file('user'): + source = '--user-config ' + elif source == config_file('local'): + source = '' + else: + source = '--filename=%r' % source + return source + name + ' ' + command diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py new file mode 100644 index 0000000..9f8df91 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py @@ -0,0 +1,502 @@ +"""setuptools.command.bdist_egg + +Build .egg distributions""" + +from distutils.errors import DistutilsSetupError +from distutils.dir_util import remove_tree, mkpath +from distutils import log +from types import CodeType +import sys +import os +import re +import textwrap +import marshal + +from setuptools.extern import six + +from pkg_resources import get_build_platform, Distribution, ensure_directory +from pkg_resources import EntryPoint +from setuptools.extension import Library +from setuptools import Command + +try: + # Python 2.7 or >=3.2 + from sysconfig import get_path, get_python_version + + def _get_purelib(): + return get_path("purelib") +except ImportError: + from distutils.sysconfig import get_python_lib, get_python_version + + def _get_purelib(): + return get_python_lib(False) + + +def strip_module(filename): + if '.' in filename: + filename = os.path.splitext(filename)[0] + if filename.endswith('module'): + filename = filename[:-6] + return filename + + +def sorted_walk(dir): + """Do os.walk in a reproducible way, + independent of indeterministic filesystem readdir order + """ + for base, dirs, files in os.walk(dir): + dirs.sort() + files.sort() + yield base, dirs, files + + +def write_stub(resource, pyfile): + _stub_template = textwrap.dedent(""" + def __bootstrap__(): + global __bootstrap__, __loader__, __file__ + import sys, pkg_resources, imp + __file__ = pkg_resources.resource_filename(__name__, %r) + __loader__ = None; del __bootstrap__, __loader__ + imp.load_dynamic(__name__,__file__) + __bootstrap__() + """).lstrip() + with open(pyfile, 'w') as f: + f.write(_stub_template % resource) + + +class bdist_egg(Command): + description = "create an \"egg\" distribution" + + user_options = [ + ('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', "platform name to embed in generated filenames " + "(default: %s)" % get_build_platform()), + ('exclude-source-files', None, + "remove all .py files from the generated egg"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ] + + boolean_options = [ + 'keep-temp', 'skip-build', 'exclude-source-files' + ] + + def initialize_options(self): + self.bdist_dir = None + self.plat_name = None + self.keep_temp = 0 + self.dist_dir = None + self.skip_build = 0 + self.egg_output = None + self.exclude_source_files = None + + def finalize_options(self): + ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") + self.egg_info = ei_cmd.egg_info + + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'egg') + + if self.plat_name is None: + self.plat_name = get_build_platform() + + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + if self.egg_output is None: + + # Compute filename of the output egg + basename = Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, + get_python_version(), + self.distribution.has_ext_modules() and self.plat_name + ).egg_name() + + self.egg_output = os.path.join(self.dist_dir, basename + '.egg') + + def do_install_data(self): + # Hack for packages that install data to install's --install-lib + self.get_finalized_command('install').install_lib = self.bdist_dir + + site_packages = os.path.normcase(os.path.realpath(_get_purelib())) + old, self.distribution.data_files = self.distribution.data_files, [] + + for item in old: + if isinstance(item, tuple) and len(item) == 2: + if os.path.isabs(item[0]): + realpath = os.path.realpath(item[0]) + normalized = os.path.normcase(realpath) + if normalized == site_packages or normalized.startswith( + site_packages + os.sep + ): + item = realpath[len(site_packages) + 1:], item[1] + # XXX else: raise ??? + self.distribution.data_files.append(item) + + try: + log.info("installing package data to %s", self.bdist_dir) + self.call_command('install_data', force=0, root=None) + finally: + self.distribution.data_files = old + + def get_outputs(self): + return [self.egg_output] + + def call_command(self, cmdname, **kw): + """Invoke reinitialized command `cmdname` with keyword args""" + for dirname in INSTALL_DIRECTORY_ATTRS: + kw.setdefault(dirname, self.bdist_dir) + kw.setdefault('skip_build', self.skip_build) + kw.setdefault('dry_run', self.dry_run) + cmd = self.reinitialize_command(cmdname, **kw) + self.run_command(cmdname) + return cmd + + def run(self): + # Generate metadata first + self.run_command("egg_info") + # We run install_lib before install_data, because some data hacks + # pull their data path from the install_lib command. + log.info("installing library code to %s", self.bdist_dir) + instcmd = self.get_finalized_command('install') + old_root = instcmd.root + instcmd.root = None + if self.distribution.has_c_libraries() and not self.skip_build: + self.run_command('build_clib') + cmd = self.call_command('install_lib', warn_dir=0) + instcmd.root = old_root + + all_outputs, ext_outputs = self.get_ext_outputs() + self.stubs = [] + to_compile = [] + for (p, ext_name) in enumerate(ext_outputs): + filename, ext = os.path.splitext(ext_name) + pyfile = os.path.join(self.bdist_dir, strip_module(filename) + + '.py') + self.stubs.append(pyfile) + log.info("creating stub loader for %s", ext_name) + if not self.dry_run: + write_stub(os.path.basename(ext_name), pyfile) + to_compile.append(pyfile) + ext_outputs[p] = ext_name.replace(os.sep, '/') + + if to_compile: + cmd.byte_compile(to_compile) + if self.distribution.data_files: + self.do_install_data() + + # Make the EGG-INFO directory + archive_root = self.bdist_dir + egg_info = os.path.join(archive_root, 'EGG-INFO') + self.mkpath(egg_info) + if self.distribution.scripts: + script_dir = os.path.join(egg_info, 'scripts') + log.info("installing scripts to %s", script_dir) + self.call_command('install_scripts', install_dir=script_dir, + no_ep=1) + + self.copy_metadata_to(egg_info) + native_libs = os.path.join(egg_info, "native_libs.txt") + if all_outputs: + log.info("writing %s", native_libs) + if not self.dry_run: + ensure_directory(native_libs) + libs_file = open(native_libs, 'wt') + libs_file.write('\n'.join(all_outputs)) + libs_file.write('\n') + libs_file.close() + elif os.path.isfile(native_libs): + log.info("removing %s", native_libs) + if not self.dry_run: + os.unlink(native_libs) + + write_safety_flag( + os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() + ) + + if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): + log.warn( + "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + if self.exclude_source_files: + self.zap_pyfiles() + + # Make the archive + make_zipfile(self.egg_output, archive_root, verbose=self.verbose, + dry_run=self.dry_run, mode=self.gen_header()) + if not self.keep_temp: + remove_tree(self.bdist_dir, dry_run=self.dry_run) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_egg', get_python_version(), self.egg_output)) + + def zap_pyfiles(self): + log.info("Removing .py files from temporary directory") + for base, dirs, files in walk_egg(self.bdist_dir): + for name in files: + path = os.path.join(base, name) + + if name.endswith('.py'): + log.debug("Deleting %s", path) + os.unlink(path) + + if base.endswith('__pycache__'): + path_old = path + + pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc' + m = re.match(pattern, name) + path_new = os.path.join( + base, os.pardir, m.group('name') + '.pyc') + log.info( + "Renaming file from [%s] to [%s]" + % (path_old, path_new)) + try: + os.remove(path_new) + except OSError: + pass + os.rename(path_old, path_new) + + def zip_safe(self): + safe = getattr(self.distribution, 'zip_safe', None) + if safe is not None: + return safe + log.warn("zip_safe flag not set; analyzing archive contents...") + return analyze_egg(self.bdist_dir, self.stubs) + + def gen_header(self): + epm = EntryPoint.parse_map(self.distribution.entry_points or '') + ep = epm.get('setuptools.installation', {}).get('eggsecutable') + if ep is None: + return 'w' # not an eggsecutable, do it the usual way. + + if not ep.attrs or ep.extras: + raise DistutilsSetupError( + "eggsecutable entry point (%r) cannot have 'extras' " + "or refer to a module" % (ep,) + ) + + pyver = sys.version[:3] + pkg = ep.module_name + full = '.'.join(ep.attrs) + base = ep.attrs[0] + basename = os.path.basename(self.egg_output) + + header = ( + "#!/bin/sh\n" + 'if [ `basename $0` = "%(basename)s" ]\n' + 'then exec python%(pyver)s -c "' + "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " + "from %(pkg)s import %(base)s; sys.exit(%(full)s())" + '" "$@"\n' + 'else\n' + ' echo $0 is not the correct name for this egg file.\n' + ' echo Please rename it back to %(basename)s and try again.\n' + ' exec false\n' + 'fi\n' + ) % locals() + + if not self.dry_run: + mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) + f = open(self.egg_output, 'w') + f.write(header) + f.close() + return 'a' + + def copy_metadata_to(self, target_dir): + "Copy metadata (egg info) to the target_dir" + # normalize the path (so that a forward-slash in egg_info will + # match using startswith below) + norm_egg_info = os.path.normpath(self.egg_info) + prefix = os.path.join(norm_egg_info, '') + for path in self.ei_cmd.filelist.files: + if path.startswith(prefix): + target = os.path.join(target_dir, path[len(prefix):]) + ensure_directory(target) + self.copy_file(path, target) + + def get_ext_outputs(self): + """Get a list of relative paths to C extensions in the output distro""" + + all_outputs = [] + ext_outputs = [] + + paths = {self.bdist_dir: ''} + for base, dirs, files in sorted_walk(self.bdist_dir): + for filename in files: + if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: + all_outputs.append(paths[base] + filename) + for filename in dirs: + paths[os.path.join(base, filename)] = (paths[base] + + filename + '/') + + if self.distribution.has_ext_modules(): + build_cmd = self.get_finalized_command('build_ext') + for ext in build_cmd.extensions: + if isinstance(ext, Library): + continue + fullname = build_cmd.get_ext_fullname(ext.name) + filename = build_cmd.get_ext_filename(fullname) + if not os.path.basename(filename).startswith('dl-'): + if os.path.exists(os.path.join(self.bdist_dir, filename)): + ext_outputs.append(filename) + + return all_outputs, ext_outputs + + +NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) + + +def walk_egg(egg_dir): + """Walk an unpacked egg's contents, skipping the metadata directory""" + walker = sorted_walk(egg_dir) + base, dirs, files = next(walker) + if 'EGG-INFO' in dirs: + dirs.remove('EGG-INFO') + yield base, dirs, files + for bdf in walker: + yield bdf + + +def analyze_egg(egg_dir, stubs): + # check for existing flag in EGG-INFO + for flag, fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): + return flag + if not can_scan(): + return False + safe = True + for base, dirs, files in walk_egg(egg_dir): + for name in files: + if name.endswith('.py') or name.endswith('.pyw'): + continue + elif name.endswith('.pyc') or name.endswith('.pyo'): + # always scan, even if we already know we're not safe + safe = scan_module(egg_dir, base, name, stubs) and safe + return safe + + +def write_safety_flag(egg_dir, safe): + # Write or remove zip safety flag file(s) + for flag, fn in safety_flags.items(): + fn = os.path.join(egg_dir, fn) + if os.path.exists(fn): + if safe is None or bool(safe) != flag: + os.unlink(fn) + elif safe is not None and bool(safe) == flag: + f = open(fn, 'wt') + f.write('\n') + f.close() + + +safety_flags = { + True: 'zip-safe', + False: 'not-zip-safe', +} + + +def scan_module(egg_dir, base, name, stubs): + """Check whether module possibly uses unsafe-for-zipfile stuff""" + + filename = os.path.join(base, name) + if filename[:-1] in stubs: + return True # Extension module + pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') + module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] + if six.PY2: + skip = 8 # skip magic & date + elif sys.version_info < (3, 7): + skip = 12 # skip magic & date & file size + else: + skip = 16 # skip magic & reserved? & date & file size + f = open(filename, 'rb') + f.read(skip) + code = marshal.load(f) + f.close() + safe = True + symbols = dict.fromkeys(iter_symbols(code)) + for bad in ['__file__', '__path__']: + if bad in symbols: + log.warn("%s: module references %s", module, bad) + safe = False + if 'inspect' in symbols: + for bad in [ + 'getsource', 'getabsfile', 'getsourcefile', 'getfile' + 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', + 'getinnerframes', 'getouterframes', 'stack', 'trace' + ]: + if bad in symbols: + log.warn("%s: module MAY be using inspect.%s", module, bad) + safe = False + return safe + + +def iter_symbols(code): + """Yield names and strings used by `code` and its nested code objects""" + for name in code.co_names: + yield name + for const in code.co_consts: + if isinstance(const, six.string_types): + yield const + elif isinstance(const, CodeType): + for name in iter_symbols(const): + yield name + + +def can_scan(): + if not sys.platform.startswith('java') and sys.platform != 'cli': + # CPython, PyPy, etc. + return True + log.warn("Unable to analyze compiled code on this platform.") + log.warn("Please ask the author to include a 'zip_safe'" + " setting (either True or False) in the package's setup.py") + + +# Attribute names of options for commands that might need to be convinced to +# install to the egg build directory + +INSTALL_DIRECTORY_ATTRS = [ + 'install_lib', 'install_dir', 'install_data', 'install_base' +] + + +def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, + mode='w'): + """Create a zip file from all the files under 'base_dir'. The output + zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" + Python module (if available) or the InfoZIP "zip" utility (if installed + and found on the default search path). If neither tool is available, + raises DistutilsExecError. Returns the name of the output zip file. + """ + import zipfile + + mkpath(os.path.dirname(zip_filename), dry_run=dry_run) + log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) + + def visit(z, dirname, names): + for name in names: + path = os.path.normpath(os.path.join(dirname, name)) + if os.path.isfile(path): + p = path[len(base_dir) + 1:] + if not dry_run: + z.write(path, p) + log.debug("adding '%s'", p) + + compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED + if not dry_run: + z = zipfile.ZipFile(zip_filename, mode, compression=compression) + for dirname, dirs, files in sorted_walk(base_dir): + visit(z, dirname, files) + z.close() + else: + for dirname, dirs, files in sorted_walk(base_dir): + visit(None, dirname, files) + return zip_filename diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py new file mode 100644 index 0000000..7073092 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py @@ -0,0 +1,43 @@ +import distutils.command.bdist_rpm as orig + + +class bdist_rpm(orig.bdist_rpm): + """ + Override the default bdist_rpm behavior to do the following: + + 1. Run egg_info to ensure the name and version are properly calculated. + 2. Always run 'install' using --single-version-externally-managed to + disable eggs in RPM distributions. + 3. Replace dash with underscore in the version numbers for better RPM + compatibility. + """ + + def run(self): + # ensure distro name is up-to-date + self.run_command('egg_info') + + orig.bdist_rpm.run(self) + + def _make_spec_file(self): + version = self.distribution.get_version() + rpmversion = version.replace('-', '_') + spec = orig.bdist_rpm._make_spec_file(self) + line23 = '%define version ' + version + line24 = '%define version ' + rpmversion + spec = [ + line.replace( + "Source0: %{name}-%{version}.tar", + "Source0: %{name}-%{unmangled_version}.tar" + ).replace( + "setup.py install ", + "setup.py install --single-version-externally-managed " + ).replace( + "%setup", + "%setup -n %{name}-%{unmangled_version}" + ).replace(line23, line24) + for line in spec + ] + insert_loc = spec.index(line24) + 1 + unmangled_version = "%define unmangled_version " + version + spec.insert(insert_loc, unmangled_version) + return spec diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py new file mode 100644 index 0000000..073de97 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py @@ -0,0 +1,21 @@ +import distutils.command.bdist_wininst as orig + + +class bdist_wininst(orig.bdist_wininst): + def reinitialize_command(self, command, reinit_subcommands=0): + """ + Supplement reinitialize_command to work around + http://bugs.python.org/issue20819 + """ + cmd = self.distribution.reinitialize_command( + command, reinit_subcommands) + if command in ('install', 'install_lib'): + cmd.install_lib = None + return cmd + + def run(self): + self._is_running = True + try: + orig.bdist_wininst.run(self) + finally: + self._is_running = False diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py new file mode 100644 index 0000000..09caff6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_clib.py @@ -0,0 +1,98 @@ +import distutils.command.build_clib as orig +from distutils.errors import DistutilsSetupError +from distutils import log +from setuptools.dep_util import newer_pairwise_group + + +class build_clib(orig.build_clib): + """ + Override the default build_clib behaviour to do the following: + + 1. Implement a rudimentary timestamp-based dependency system + so 'compile()' doesn't run every time. + 2. Add more keys to the 'build_info' dictionary: + * obj_deps - specify dependencies for each object compiled. + this should be a dictionary mapping a key + with the source filename to a list of + dependencies. Use an empty string for global + dependencies. + * cflags - specify a list of additional flags to pass to + the compiler. + """ + + def build_libraries(self, libraries): + for (lib_name, build_info) in libraries: + sources = build_info.get('sources') + if sources is None or not isinstance(sources, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'sources' must be present and must be " + "a list of source filenames" % lib_name) + sources = list(sources) + + log.info("building '%s' library", lib_name) + + # Make sure everything is the correct type. + # obj_deps should be a dictionary of keys as sources + # and a list/tuple of files that are its dependencies. + obj_deps = build_info.get('obj_deps', dict()) + if not isinstance(obj_deps, dict): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + dependencies = [] + + # Get the global dependencies that are specified by the '' key. + # These will go into every source's dependency list. + global_deps = obj_deps.get('', list()) + if not isinstance(global_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + + # Build the list to be used by newer_pairwise_group + # each source will be auto-added to its dependencies. + for source in sources: + src_deps = [source] + src_deps.extend(global_deps) + extra_deps = obj_deps.get(source, list()) + if not isinstance(extra_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + src_deps.extend(extra_deps) + dependencies.append(src_deps) + + expected_objects = self.compiler.object_filenames( + sources, + output_dir=self.build_temp + ) + + if newer_pairwise_group(dependencies, expected_objects) != ([], []): + # First, compile the source code to object files in the library + # directory. (This should probably change to putting object + # files in a temporary build directory.) + macros = build_info.get('macros') + include_dirs = build_info.get('include_dirs') + cflags = build_info.get('cflags') + objects = self.compiler.compile( + sources, + output_dir=self.build_temp, + macros=macros, + include_dirs=include_dirs, + extra_postargs=cflags, + debug=self.debug + ) + + # Now "link" the object files together into a static library. + # (On Unix at least, this isn't really linking -- it just + # builds an archive. Whatever.) + self.compiler.create_static_lib( + expected_objects, + lib_name, + output_dir=self.build_clib, + debug=self.debug + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py new file mode 100644 index 0000000..60a8a32 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_ext.py @@ -0,0 +1,321 @@ +import os +import sys +import itertools +import imp +from distutils.command.build_ext import build_ext as _du_build_ext +from distutils.file_util import copy_file +from distutils.ccompiler import new_compiler +from distutils.sysconfig import customize_compiler, get_config_var +from distutils.errors import DistutilsError +from distutils import log + +from setuptools.extension import Library +from setuptools.extern import six + +try: + # Attempt to use Cython for building extensions, if available + from Cython.Distutils.build_ext import build_ext as _build_ext + # Additionally, assert that the compiler module will load + # also. Ref #1229. + __import__('Cython.Compiler.Main') +except ImportError: + _build_ext = _du_build_ext + +# make sure _config_vars is initialized +get_config_var("LDSHARED") +from distutils.sysconfig import _config_vars as _CONFIG_VARS + + +def _customize_compiler_for_shlib(compiler): + if sys.platform == "darwin": + # building .dylib requires additional compiler flags on OSX; here we + # temporarily substitute the pyconfig.h variables so that distutils' + # 'customize_compiler' uses them before we build the shared libraries. + tmp = _CONFIG_VARS.copy() + try: + # XXX Help! I don't have any idea whether these are right... + _CONFIG_VARS['LDSHARED'] = ( + "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") + _CONFIG_VARS['CCSHARED'] = " -dynamiclib" + _CONFIG_VARS['SO'] = ".dylib" + customize_compiler(compiler) + finally: + _CONFIG_VARS.clear() + _CONFIG_VARS.update(tmp) + else: + customize_compiler(compiler) + + +have_rtld = False +use_stubs = False +libtype = 'shared' + +if sys.platform == "darwin": + use_stubs = True +elif os.name != 'nt': + try: + import dl + use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') + except ImportError: + pass + +if_dl = lambda s: s if have_rtld else '' + + +def get_abi3_suffix(): + """Return the file extension for an abi3-compliant Extension()""" + for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): + if '.abi3' in suffix: # Unix + return suffix + elif suffix == '.pyd': # Windows + return suffix + + +class build_ext(_build_ext): + def run(self): + """Build extensions in build directory, then copy if --inplace""" + old_inplace, self.inplace = self.inplace, 0 + _build_ext.run(self) + self.inplace = old_inplace + if old_inplace: + self.copy_extensions_to_source() + + def copy_extensions_to_source(self): + build_py = self.get_finalized_command('build_py') + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + filename = self.get_ext_filename(fullname) + modpath = fullname.split('.') + package = '.'.join(modpath[:-1]) + package_dir = build_py.get_package_dir(package) + dest_filename = os.path.join(package_dir, + os.path.basename(filename)) + src_filename = os.path.join(self.build_lib, filename) + + # Always copy, even if source is older than destination, to ensure + # that the right extensions for the current Python/platform are + # used. + copy_file( + src_filename, dest_filename, verbose=self.verbose, + dry_run=self.dry_run + ) + if ext._needs_stub: + self.write_stub(package_dir or os.curdir, ext, True) + + def get_ext_filename(self, fullname): + filename = _build_ext.get_ext_filename(self, fullname) + if fullname in self.ext_map: + ext = self.ext_map[fullname] + use_abi3 = ( + six.PY3 + and getattr(ext, 'py_limited_api') + and get_abi3_suffix() + ) + if use_abi3: + so_ext = get_config_var('EXT_SUFFIX') + filename = filename[:-len(so_ext)] + filename = filename + get_abi3_suffix() + if isinstance(ext, Library): + fn, ext = os.path.splitext(filename) + return self.shlib_compiler.library_filename(fn, libtype) + elif use_stubs and ext._links_to_dynamic: + d, fn = os.path.split(filename) + return os.path.join(d, 'dl-' + fn) + return filename + + def initialize_options(self): + _build_ext.initialize_options(self) + self.shlib_compiler = None + self.shlibs = [] + self.ext_map = {} + + def finalize_options(self): + _build_ext.finalize_options(self) + self.extensions = self.extensions or [] + self.check_extensions_list(self.extensions) + self.shlibs = [ext for ext in self.extensions + if isinstance(ext, Library)] + if self.shlibs: + self.setup_shlib_compiler() + for ext in self.extensions: + ext._full_name = self.get_ext_fullname(ext.name) + for ext in self.extensions: + fullname = ext._full_name + self.ext_map[fullname] = ext + + # distutils 3.1 will also ask for module names + # XXX what to do with conflicts? + self.ext_map[fullname.split('.')[-1]] = ext + + ltd = self.shlibs and self.links_to_dynamic(ext) or False + ns = ltd and use_stubs and not isinstance(ext, Library) + ext._links_to_dynamic = ltd + ext._needs_stub = ns + filename = ext._file_name = self.get_ext_filename(fullname) + libdir = os.path.dirname(os.path.join(self.build_lib, filename)) + if ltd and libdir not in ext.library_dirs: + ext.library_dirs.append(libdir) + if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: + ext.runtime_library_dirs.append(os.curdir) + + def setup_shlib_compiler(self): + compiler = self.shlib_compiler = new_compiler( + compiler=self.compiler, dry_run=self.dry_run, force=self.force + ) + _customize_compiler_for_shlib(compiler) + + if self.include_dirs is not None: + compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name, value) in self.define: + compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + compiler.undefine_macro(macro) + if self.libraries is not None: + compiler.set_libraries(self.libraries) + if self.library_dirs is not None: + compiler.set_library_dirs(self.library_dirs) + if self.rpath is not None: + compiler.set_runtime_library_dirs(self.rpath) + if self.link_objects is not None: + compiler.set_link_objects(self.link_objects) + + # hack so distutils' build_extension() builds a library instead + compiler.link_shared_object = link_shared_object.__get__(compiler) + + def get_export_symbols(self, ext): + if isinstance(ext, Library): + return ext.export_symbols + return _build_ext.get_export_symbols(self, ext) + + def build_extension(self, ext): + ext._convert_pyx_sources_to_lang() + _compiler = self.compiler + try: + if isinstance(ext, Library): + self.compiler = self.shlib_compiler + _build_ext.build_extension(self, ext) + if ext._needs_stub: + cmd = self.get_finalized_command('build_py').build_lib + self.write_stub(cmd, ext) + finally: + self.compiler = _compiler + + def links_to_dynamic(self, ext): + """Return true if 'ext' links to a dynamic lib in the same package""" + # XXX this should check to ensure the lib is actually being built + # XXX as dynamic, and not just using a locally-found version or a + # XXX static-compiled version + libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) + pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) + return any(pkg + libname in libnames for libname in ext.libraries) + + def get_outputs(self): + return _build_ext.get_outputs(self) + self.__get_stubs_outputs() + + def __get_stubs_outputs(self): + # assemble the base name for each extension that needs a stub + ns_ext_bases = ( + os.path.join(self.build_lib, *ext._full_name.split('.')) + for ext in self.extensions + if ext._needs_stub + ) + # pair each base with the extension + pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) + return list(base + fnext for base, fnext in pairs) + + def __get_output_extensions(self): + yield '.py' + yield '.pyc' + if self.get_finalized_command('build_py').optimize: + yield '.pyo' + + def write_stub(self, output_dir, ext, compile=False): + log.info("writing stub loader for %s to %s", ext._full_name, + output_dir) + stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + + '.py') + if compile and os.path.exists(stub_file): + raise DistutilsError(stub_file + " already exists! Please delete.") + if not self.dry_run: + f = open(stub_file, 'w') + f.write( + '\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __file__, __loader__", + " import sys, os, pkg_resources, imp" + if_dl(", dl"), + " __file__ = pkg_resources.resource_filename" + "(__name__,%r)" + % os.path.basename(ext._file_name), + " del __bootstrap__", + " if '__loader__' in globals():", + " del __loader__", + if_dl(" old_flags = sys.getdlopenflags()"), + " old_dir = os.getcwd()", + " try:", + " os.chdir(os.path.dirname(__file__))", + if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), + " imp.load_dynamic(__name__,__file__)", + " finally:", + if_dl(" sys.setdlopenflags(old_flags)"), + " os.chdir(old_dir)", + "__bootstrap__()", + "" # terminal \n + ]) + ) + f.close() + if compile: + from distutils.util import byte_compile + + byte_compile([stub_file], optimize=0, + force=True, dry_run=self.dry_run) + optimize = self.get_finalized_command('install_lib').optimize + if optimize > 0: + byte_compile([stub_file], optimize=optimize, + force=True, dry_run=self.dry_run) + if os.path.exists(stub_file) and not self.dry_run: + os.unlink(stub_file) + + +if use_stubs or os.name == 'nt': + # Build shared libraries + # + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + self.link( + self.SHARED_LIBRARY, objects, output_libname, + output_dir, libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, extra_preargs, extra_postargs, + build_temp, target_lang + ) +else: + # Build static libraries everywhere else + libtype = 'static' + + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + # XXX we need to either disallow these attrs on Library instances, + # or warn/abort here if set, or something... + # libraries=None, library_dirs=None, runtime_library_dirs=None, + # export_symbols=None, extra_preargs=None, extra_postargs=None, + # build_temp=None + + assert output_dir is None # distutils build_ext doesn't pass this + output_dir, filename = os.path.split(output_libname) + basename, ext = os.path.splitext(filename) + if self.library_filename("x").startswith('lib'): + # strip 'lib' prefix; this is kludgy if some platform uses + # a different prefix + basename = basename[3:] + + self.create_static_lib( + objects, basename, output_dir, debug, target_lang + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_py.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_py.py new file mode 100644 index 0000000..b0314fd --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/build_py.py @@ -0,0 +1,270 @@ +from glob import glob +from distutils.util import convert_path +import distutils.command.build_py as orig +import os +import fnmatch +import textwrap +import io +import distutils.errors +import itertools + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter, filterfalse + +try: + from setuptools.lib2to3_ex import Mixin2to3 +except ImportError: + + class Mixin2to3: + def run_2to3(self, files, doctests=True): + "do nothing" + + +class build_py(orig.build_py, Mixin2to3): + """Enhanced 'build_py' command that includes data files with packages + + The data files are specified via a 'package_data' argument to 'setup()'. + See 'setuptools.dist.Distribution' for more details. + + Also, this version of the 'build_py' command allows you to specify both + 'py_modules' and 'packages' in the same setup operation. + """ + + def finalize_options(self): + orig.build_py.finalize_options(self) + self.package_data = self.distribution.package_data + self.exclude_package_data = (self.distribution.exclude_package_data or + {}) + if 'data_files' in self.__dict__: + del self.__dict__['data_files'] + self.__updated_files = [] + self.__doctests_2to3 = [] + + def run(self): + """Build modules, packages, and copy data files to build directory""" + if not self.py_modules and not self.packages: + return + + if self.py_modules: + self.build_modules() + + if self.packages: + self.build_packages() + self.build_package_data() + + self.run_2to3(self.__updated_files, False) + self.run_2to3(self.__updated_files, True) + self.run_2to3(self.__doctests_2to3, True) + + # Only compile actual .py files, using our base class' idea of what our + # output files are. + self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) + + def __getattr__(self, attr): + "lazily compute data files" + if attr == 'data_files': + self.data_files = self._get_data_files() + return self.data_files + return orig.build_py.__getattr__(self, attr) + + def build_module(self, module, module_file, package): + if six.PY2 and isinstance(package, six.string_types): + # avoid errors on Python 2 when unicode is passed (#190) + package = package.split('.') + outfile, copied = orig.build_py.build_module(self, module, module_file, + package) + if copied: + self.__updated_files.append(outfile) + return outfile, copied + + def _get_data_files(self): + """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" + self.analyze_manifest() + return list(map(self._get_pkg_data_files, self.packages or ())) + + def _get_pkg_data_files(self, package): + # Locate package source directory + src_dir = self.get_package_dir(package) + + # Compute package build directory + build_dir = os.path.join(*([self.build_lib] + package.split('.'))) + + # Strip directory from globbed filenames + filenames = [ + os.path.relpath(file, src_dir) + for file in self.find_data_files(package, src_dir) + ] + return package, src_dir, build_dir, filenames + + def find_data_files(self, package, src_dir): + """Return filenames for package's data files in 'src_dir'""" + patterns = self._get_platform_patterns( + self.package_data, + package, + src_dir, + ) + globs_expanded = map(glob, patterns) + # flatten the expanded globs into an iterable of matches + globs_matches = itertools.chain.from_iterable(globs_expanded) + glob_files = filter(os.path.isfile, globs_matches) + files = itertools.chain( + self.manifest_files.get(package, []), + glob_files, + ) + return self.exclude_data_files(package, src_dir, files) + + def build_package_data(self): + """Copy data files into build directory""" + for package, src_dir, build_dir, filenames in self.data_files: + for filename in filenames: + target = os.path.join(build_dir, filename) + self.mkpath(os.path.dirname(target)) + srcfile = os.path.join(src_dir, filename) + outf, copied = self.copy_file(srcfile, target) + srcfile = os.path.abspath(srcfile) + if (copied and + srcfile in self.distribution.convert_2to3_doctests): + self.__doctests_2to3.append(outf) + + def analyze_manifest(self): + self.manifest_files = mf = {} + if not self.distribution.include_package_data: + return + src_dirs = {} + for package in self.packages or (): + # Locate package source directory + src_dirs[assert_relative(self.get_package_dir(package))] = package + + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + for path in ei_cmd.filelist.files: + d, f = os.path.split(assert_relative(path)) + prev = None + oldf = f + while d and d != prev and d not in src_dirs: + prev = d + d, df = os.path.split(d) + f = os.path.join(df, f) + if d in src_dirs: + if path.endswith('.py') and f == oldf: + continue # it's a module, not data + mf.setdefault(src_dirs[d], []).append(path) + + def get_data_files(self): + pass # Lazily compute data files in _get_data_files() function. + + def check_package(self, package, package_dir): + """Check namespace packages' __init__ for declare_namespace""" + try: + return self.packages_checked[package] + except KeyError: + pass + + init_py = orig.build_py.check_package(self, package, package_dir) + self.packages_checked[package] = init_py + + if not init_py or not self.distribution.namespace_packages: + return init_py + + for pkg in self.distribution.namespace_packages: + if pkg == package or pkg.startswith(package + '.'): + break + else: + return init_py + + with io.open(init_py, 'rb') as f: + contents = f.read() + if b'declare_namespace' not in contents: + raise distutils.errors.DistutilsError( + "Namespace package problem: %s is a namespace package, but " + "its\n__init__.py does not call declare_namespace()! Please " + 'fix it.\n(See the setuptools manual under ' + '"Namespace Packages" for details.)\n"' % (package,) + ) + return init_py + + def initialize_options(self): + self.packages_checked = {} + orig.build_py.initialize_options(self) + + def get_package_dir(self, package): + res = orig.build_py.get_package_dir(self, package) + if self.distribution.src_root is not None: + return os.path.join(self.distribution.src_root, res) + return res + + def exclude_data_files(self, package, src_dir, files): + """Filter filenames for package's data files in 'src_dir'""" + files = list(files) + patterns = self._get_platform_patterns( + self.exclude_package_data, + package, + src_dir, + ) + match_groups = ( + fnmatch.filter(files, pattern) + for pattern in patterns + ) + # flatten the groups of matches into an iterable of matches + matches = itertools.chain.from_iterable(match_groups) + bad = set(matches) + keepers = ( + fn + for fn in files + if fn not in bad + ) + # ditch dupes + return list(_unique_everseen(keepers)) + + @staticmethod + def _get_platform_patterns(spec, package, src_dir): + """ + yield platform-specific path patterns (suitable for glob + or fn_match) from a glob-based spec (such as + self.package_data or self.exclude_package_data) + matching package in src_dir. + """ + raw_patterns = itertools.chain( + spec.get('', []), + spec.get(package, []), + ) + return ( + # Each pattern has to be converted to a platform-specific path + os.path.join(src_dir, convert_path(pattern)) + for pattern in raw_patterns + ) + + +# from Python docs +def _unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def assert_relative(path): + if not os.path.isabs(path): + return path + from distutils.errors import DistutilsSetupError + + msg = textwrap.dedent(""" + Error: setup script specifies an absolute path: + + %s + + setup() arguments must *always* be /-separated paths relative to the + setup.py directory, *never* absolute paths. + """).lstrip() % path + raise DistutilsSetupError(msg) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/develop.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/develop.py new file mode 100644 index 0000000..009e4f9 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/develop.py @@ -0,0 +1,221 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsError, DistutilsOptionError +import os +import glob +import io + +from setuptools.extern import six + +import pkg_resources +from setuptools.command.easy_install import easy_install +from setuptools import namespaces +import setuptools + +__metaclass__ = type + + +class develop(namespaces.DevelopInstaller, easy_install): + """Set up package for development""" + + description = "install package in 'development mode'" + + user_options = easy_install.user_options + [ + ("uninstall", "u", "Uninstall this source package"), + ("egg-path=", None, "Set the path to be used in the .egg-link file"), + ] + + boolean_options = easy_install.boolean_options + ['uninstall'] + + command_consumes_arguments = False # override base + + def run(self): + if self.uninstall: + self.multi_version = True + self.uninstall_link() + self.uninstall_namespaces() + else: + self.install_for_development() + self.warn_deprecated_options() + + def initialize_options(self): + self.uninstall = None + self.egg_path = None + easy_install.initialize_options(self) + self.setup_path = None + self.always_copy_from = '.' # always copy eggs installed in curdir + + def finalize_options(self): + ei = self.get_finalized_command("egg_info") + if ei.broken_egg_info: + template = "Please rename %r to %r before using 'develop'" + args = ei.egg_info, ei.broken_egg_info + raise DistutilsError(template % args) + self.args = [ei.egg_name] + + easy_install.finalize_options(self) + self.expand_basedirs() + self.expand_dirs() + # pick up setup-dir .egg files only: no .egg-info + self.package_index.scan(glob.glob('*.egg')) + + egg_link_fn = ei.egg_name + '.egg-link' + self.egg_link = os.path.join(self.install_dir, egg_link_fn) + self.egg_base = ei.egg_base + if self.egg_path is None: + self.egg_path = os.path.abspath(ei.egg_base) + + target = pkg_resources.normalize_path(self.egg_base) + egg_path = pkg_resources.normalize_path( + os.path.join(self.install_dir, self.egg_path)) + if egg_path != target: + raise DistutilsOptionError( + "--egg-path must be a relative path from the install" + " directory to " + target + ) + + # Make a distribution for the package's source + self.dist = pkg_resources.Distribution( + target, + pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)), + project_name=ei.egg_name + ) + + self.setup_path = self._resolve_setup_path( + self.egg_base, + self.install_dir, + self.egg_path, + ) + + @staticmethod + def _resolve_setup_path(egg_base, install_dir, egg_path): + """ + Generate a path from egg_base back to '.' where the + setup script resides and ensure that path points to the + setup path from $install_dir/$egg_path. + """ + path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') + if path_to_setup != os.curdir: + path_to_setup = '../' * (path_to_setup.count('/') + 1) + resolved = pkg_resources.normalize_path( + os.path.join(install_dir, egg_path, path_to_setup) + ) + if resolved != pkg_resources.normalize_path(os.curdir): + raise DistutilsOptionError( + "Can't get a consistent path to setup script from" + " installation directory", resolved, + pkg_resources.normalize_path(os.curdir)) + return path_to_setup + + def install_for_development(self): + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = pkg_resources.normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + + # Fixup egg-link and easy-install.pth + ei_cmd = self.get_finalized_command("egg_info") + self.egg_path = build_path + self.dist.location = build_path + # XXX + self.dist._provider = pkg_resources.PathMetadata( + build_path, ei_cmd.egg_info) + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + self.install_site_py() # ensure that target dir is site-safe + if setuptools.bootstrap_install_from: + self.easy_install(setuptools.bootstrap_install_from) + setuptools.bootstrap_install_from = None + + self.install_namespaces() + + # create an .egg-link in the installation dir, pointing to our egg + log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) + if not self.dry_run: + with open(self.egg_link, "w") as f: + f.write(self.egg_path + "\n" + self.setup_path) + # postprocess the installed distro, fixing up .pth, installing scripts, + # and handling requirements + self.process_distribution(None, self.dist, not self.no_deps) + + def uninstall_link(self): + if os.path.exists(self.egg_link): + log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) + egg_link_file = open(self.egg_link) + contents = [line.rstrip() for line in egg_link_file] + egg_link_file.close() + if contents not in ([self.egg_path], + [self.egg_path, self.setup_path]): + log.warn("Link points to %s: uninstall aborted", contents) + return + if not self.dry_run: + os.unlink(self.egg_link) + if not self.dry_run: + self.update_pth(self.dist) # remove any .pth link to us + if self.distribution.scripts: + # XXX should also check for entry point scripts! + log.warn("Note: you must uninstall or replace scripts manually!") + + def install_egg_scripts(self, dist): + if dist is not self.dist: + # Installing a dependency, so fall back to normal behavior + return easy_install.install_egg_scripts(self, dist) + + # create wrapper scripts in the script dir, pointing to dist.scripts + + # new-style... + self.install_wrapper_scripts(dist) + + # ...and old-style + for script_name in self.distribution.scripts or []: + script_path = os.path.abspath(convert_path(script_name)) + script_name = os.path.basename(script_path) + with io.open(script_path) as strm: + script_text = strm.read() + self.install_script(dist, script_name, script_text, script_path) + + def install_wrapper_scripts(self, dist): + dist = VersionlessRequirement(dist) + return easy_install.install_wrapper_scripts(self, dist) + + +class VersionlessRequirement: + """ + Adapt a pkg_resources.Distribution to simply return the project + name as the 'requirement' so that scripts will work across + multiple versions. + + >>> from pkg_resources import Distribution + >>> dist = Distribution(project_name='foo', version='1.0') + >>> str(dist.as_requirement()) + 'foo==1.0' + >>> adapted_dist = VersionlessRequirement(dist) + >>> str(adapted_dist.as_requirement()) + 'foo' + """ + + def __init__(self, dist): + self.__dist = dist + + def __getattr__(self, name): + return getattr(self.__dist, name) + + def as_requirement(self): + return self.project_name diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py new file mode 100644 index 0000000..c45258f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/dist_info.py @@ -0,0 +1,36 @@ +""" +Create a dist_info directory +As defined in the wheel specification +""" + +import os + +from distutils.core import Command +from distutils import log + + +class dist_info(Command): + + description = 'create a .dist-info directory' + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ] + + def initialize_options(self): + self.egg_base = None + + def finalize_options(self): + pass + + def run(self): + egg_info = self.get_finalized_command('egg_info') + egg_info.egg_base = self.egg_base + egg_info.finalize_options() + egg_info.run() + dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' + log.info("creating '{}'".format(os.path.abspath(dist_info_dir))) + + bdist_wheel = self.get_finalized_command('bdist_wheel') + bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py new file mode 100644 index 0000000..06c9827 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/easy_install.py @@ -0,0 +1,2342 @@ +#!/usr/bin/env python +""" +Easy Install +------------ + +A tool for doing automatic download/extract/build of distutils-based Python +packages. For detailed documentation, see the accompanying EasyInstall.txt +file, or visit the `EasyInstall home page`__. + +__ https://setuptools.readthedocs.io/en/latest/easy_install.html + +""" + +from glob import glob +from distutils.util import get_platform +from distutils.util import convert_path, subst_vars +from distutils.errors import ( + DistutilsArgError, DistutilsOptionError, + DistutilsError, DistutilsPlatformError, +) +from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS +from distutils import log, dir_util +from distutils.command.build_scripts import first_line_re +from distutils.spawn import find_executable +import sys +import os +import zipimport +import shutil +import tempfile +import zipfile +import re +import stat +import random +import textwrap +import warnings +import site +import struct +import contextlib +import subprocess +import shlex +import io + + +from sysconfig import get_config_vars, get_path + +from setuptools import SetuptoolsDeprecationWarning + +from setuptools.extern import six +from setuptools.extern.six.moves import configparser, map + +from setuptools import Command +from setuptools.sandbox import run_setup +from setuptools.py27compat import rmtree_safe +from setuptools.command import setopt +from setuptools.archive_util import unpack_archive +from setuptools.package_index import ( + PackageIndex, parse_requirement_arg, URL_SCHEME, +) +from setuptools.command import bdist_egg, egg_info +from setuptools.wheel import Wheel +from pkg_resources import ( + yield_lines, normalize_path, resource_string, ensure_directory, + get_distribution, find_distributions, Environment, Requirement, + Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, + VersionConflict, DEVELOP_DIST, +) +import pkg_resources.py31compat + +__metaclass__ = type + +# Turn on PEP440Warnings +warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) + +__all__ = [ + 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', + 'main', 'get_exe_prefixes', +] + + +def is_64bit(): + return struct.calcsize("P") == 8 + + +def samefile(p1, p2): + """ + Determine if two paths reference the same file. + + Augments os.path.samefile to work on Windows and + suppresses errors if the path doesn't exist. + """ + both_exist = os.path.exists(p1) and os.path.exists(p2) + use_samefile = hasattr(os.path, 'samefile') and both_exist + if use_samefile: + return os.path.samefile(p1, p2) + norm_p1 = os.path.normpath(os.path.normcase(p1)) + norm_p2 = os.path.normpath(os.path.normcase(p2)) + return norm_p1 == norm_p2 + + +if six.PY2: + + def _to_bytes(s): + return s + + def isascii(s): + try: + six.text_type(s, 'ascii') + return True + except UnicodeError: + return False +else: + + def _to_bytes(s): + return s.encode('utf8') + + def isascii(s): + try: + s.encode('ascii') + return True + except UnicodeError: + return False + + +_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') + + +class easy_install(Command): + """Manage a download/build/install process""" + description = "Find/get/install Python packages" + command_consumes_arguments = True + + user_options = [ + ('prefix=', None, "installation prefix"), + ("zip-ok", "z", "install package as a zipfile"), + ("multi-version", "m", "make apps have to require() a version"), + ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), + ("install-dir=", "d", "install package to DIR"), + ("script-dir=", "s", "install scripts to DIR"), + ("exclude-scripts", "x", "Don't install scripts"), + ("always-copy", "a", "Copy all needed packages to install dir"), + ("index-url=", "i", "base URL of Python Package Index"), + ("find-links=", "f", "additional URL(s) to search for packages"), + ("build-directory=", "b", + "download/extract/build in DIR; keep the results"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('record=', None, + "filename in which to record list of installed files"), + ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), + ('site-dirs=', 'S', "list of directories where .pth files work"), + ('editable', 'e', "Install specified packages in editable form"), + ('no-deps', 'N', "don't install dependencies"), + ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), + ('local-snapshots-ok', 'l', + "allow building eggs from local checkouts"), + ('version', None, "print version information and exit"), + ('no-find-links', None, + "Don't load find-links defined in packages being installed") + ] + boolean_options = [ + 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', + 'editable', + 'no-deps', 'local-snapshots-ok', 'version' + ] + + if site.ENABLE_USER_SITE: + help_msg = "install in user site-package '%s'" % site.USER_SITE + user_options.append(('user', None, help_msg)) + boolean_options.append('user') + + negative_opt = {'always-unzip': 'zip-ok'} + create_index = PackageIndex + + def initialize_options(self): + # the --user option seems to be an opt-in one, + # so the default should be False. + self.user = 0 + self.zip_ok = self.local_snapshots_ok = None + self.install_dir = self.script_dir = self.exclude_scripts = None + self.index_url = None + self.find_links = None + self.build_directory = None + self.args = None + self.optimize = self.record = None + self.upgrade = self.always_copy = self.multi_version = None + self.editable = self.no_deps = self.allow_hosts = None + self.root = self.prefix = self.no_report = None + self.version = None + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib + self.install_scripts = None + self.install_data = None + self.install_base = None + self.install_platbase = None + if site.ENABLE_USER_SITE: + self.install_userbase = site.USER_BASE + self.install_usersite = site.USER_SITE + else: + self.install_userbase = None + self.install_usersite = None + self.no_find_links = None + + # Options not specifiable via command line + self.package_index = None + self.pth_file = self.always_copy_from = None + self.site_dirs = None + self.installed_projects = {} + self.sitepy_installed = False + # Always read easy_install options, even if we are subclassed, or have + # an independent instance created. This ensures that defaults will + # always come from the standard configuration file(s)' "easy_install" + # section, even if this is a "develop" or "install" command, or some + # other embedding. + self._dry_run = None + self.verbose = self.distribution.verbose + self.distribution._set_command_options( + self, self.distribution.get_option_dict('easy_install') + ) + + def delete_blockers(self, blockers): + extant_blockers = ( + filename for filename in blockers + if os.path.exists(filename) or os.path.islink(filename) + ) + list(map(self._delete_path, extant_blockers)) + + def _delete_path(self, path): + log.info("Deleting %s", path) + if self.dry_run: + return + + is_tree = os.path.isdir(path) and not os.path.islink(path) + remover = rmtree if is_tree else os.unlink + remover(path) + + @staticmethod + def _render_version(): + """ + Render the Setuptools version and installation details, then exit. + """ + ver = sys.version[:3] + dist = get_distribution('setuptools') + tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' + print(tmpl.format(**locals())) + raise SystemExit() + + def finalize_options(self): + self.version and self._render_version() + + py_version = sys.version.split()[0] + prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') + + self.config_vars = { + 'dist_name': self.distribution.get_name(), + 'dist_version': self.distribution.get_version(), + 'dist_fullname': self.distribution.get_fullname(), + 'py_version': py_version, + 'py_version_short': py_version[0:3], + 'py_version_nodot': py_version[0] + py_version[2], + 'sys_prefix': prefix, + 'prefix': prefix, + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + # Only python 3.2+ has abiflags + 'abiflags': getattr(sys, 'abiflags', ''), + } + + if site.ENABLE_USER_SITE: + self.config_vars['userbase'] = self.install_userbase + self.config_vars['usersite'] = self.install_usersite + + self._fix_install_dir_for_user_site() + + self.expand_basedirs() + self.expand_dirs() + + self._expand( + 'install_dir', 'script_dir', 'build_directory', + 'site_dirs', + ) + # If a non-default installation directory was specified, default the + # script directory to match it. + if self.script_dir is None: + self.script_dir = self.install_dir + + if self.no_find_links is None: + self.no_find_links = False + + # Let install_dir get set by install_lib command, which in turn + # gets its info from the install command, and takes into account + # --prefix and --home and all that other crud. + self.set_undefined_options( + 'install_lib', ('install_dir', 'install_dir') + ) + # Likewise, set default script_dir from 'install_scripts.install_dir' + self.set_undefined_options( + 'install_scripts', ('install_dir', 'script_dir') + ) + + if self.user and self.install_purelib: + self.install_dir = self.install_purelib + self.script_dir = self.install_scripts + # default --record from the install command + self.set_undefined_options('install', ('record', 'record')) + # Should this be moved to the if statement below? It's not used + # elsewhere + normpath = map(normalize_path, sys.path) + self.all_site_dirs = get_site_dirs() + if self.site_dirs is not None: + site_dirs = [ + os.path.expanduser(s.strip()) for s in + self.site_dirs.split(',') + ] + for d in site_dirs: + if not os.path.isdir(d): + log.warn("%s (in --site-dirs) does not exist", d) + elif normalize_path(d) not in normpath: + raise DistutilsOptionError( + d + " (in --site-dirs) is not on sys.path" + ) + else: + self.all_site_dirs.append(normalize_path(d)) + if not self.editable: + self.check_site_dir() + self.index_url = self.index_url or "https://pypi.org/simple/" + self.shadow_path = self.all_site_dirs[:] + for path_item in self.install_dir, normalize_path(self.script_dir): + if path_item not in self.shadow_path: + self.shadow_path.insert(0, path_item) + + if self.allow_hosts is not None: + hosts = [s.strip() for s in self.allow_hosts.split(',')] + else: + hosts = ['*'] + if self.package_index is None: + self.package_index = self.create_index( + self.index_url, search_path=self.shadow_path, hosts=hosts, + ) + self.local_index = Environment(self.shadow_path + sys.path) + + if self.find_links is not None: + if isinstance(self.find_links, six.string_types): + self.find_links = self.find_links.split() + else: + self.find_links = [] + if self.local_snapshots_ok: + self.package_index.scan_egg_links(self.shadow_path + sys.path) + if not self.no_find_links: + self.package_index.add_find_links(self.find_links) + self.set_undefined_options('install_lib', ('optimize', 'optimize')) + if not isinstance(self.optimize, int): + try: + self.optimize = int(self.optimize) + if not (0 <= self.optimize <= 2): + raise ValueError + except ValueError: + raise DistutilsOptionError("--optimize must be 0, 1, or 2") + + if self.editable and not self.build_directory: + raise DistutilsArgError( + "Must specify a build directory (-b) when using --editable" + ) + if not self.args: + raise DistutilsArgError( + "No urls, filenames, or requirements specified (see --help)") + + self.outputs = [] + + def _fix_install_dir_for_user_site(self): + """ + Fix the install_dir if "--user" was used. + """ + if not self.user or not site.ENABLE_USER_SITE: + return + + self.create_home_path() + if self.install_userbase is None: + msg = "User base directory is not specified" + raise DistutilsPlatformError(msg) + self.install_base = self.install_platbase = self.install_userbase + scheme_name = os.name.replace('posix', 'unix') + '_user' + self.select_scheme(scheme_name) + + def _expand_attrs(self, attrs): + for attr in attrs: + val = getattr(self, attr) + if val is not None: + if os.name == 'posix' or os.name == 'nt': + val = os.path.expanduser(val) + val = subst_vars(val, self.config_vars) + setattr(self, attr, val) + + def expand_basedirs(self): + """Calls `os.path.expanduser` on install_base, install_platbase and + root.""" + self._expand_attrs(['install_base', 'install_platbase', 'root']) + + def expand_dirs(self): + """Calls `os.path.expanduser` on install dirs.""" + dirs = [ + 'install_purelib', + 'install_platlib', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data', + ] + self._expand_attrs(dirs) + + def run(self): + if self.verbose != self.distribution.verbose: + log.set_verbosity(self.verbose) + try: + for spec in self.args: + self.easy_install(spec, not self.no_deps) + if self.record: + outputs = self.outputs + if self.root: # strip any package prefix + root_len = len(self.root) + for counter in range(len(outputs)): + outputs[counter] = outputs[counter][root_len:] + from distutils import file_util + + self.execute( + file_util.write_file, (self.record, outputs), + "writing list of installed files to '%s'" % + self.record + ) + self.warn_deprecated_options() + finally: + log.set_verbosity(self.distribution.verbose) + + def pseudo_tempname(self): + """Return a pseudo-tempname base in the install directory. + This code is intentionally naive; if a malicious party can write to + the target directory you're already in deep doodoo. + """ + try: + pid = os.getpid() + except Exception: + pid = random.randint(0, sys.maxsize) + return os.path.join(self.install_dir, "test-easy-install-%s" % pid) + + def warn_deprecated_options(self): + pass + + def check_site_dir(self): + """Verify that self.install_dir is .pth-capable dir, if needed""" + + instdir = normalize_path(self.install_dir) + pth_file = os.path.join(instdir, 'easy-install.pth') + + # Is it a configured, PYTHONPATH, implicit, or explicit site dir? + is_site_dir = instdir in self.all_site_dirs + + if not is_site_dir and not self.multi_version: + # No? Then directly test whether it does .pth file processing + is_site_dir = self.check_pth_processing() + else: + # make sure we can write to target dir + testfile = self.pseudo_tempname() + '.write-test' + test_exists = os.path.exists(testfile) + try: + if test_exists: + os.unlink(testfile) + open(testfile, 'w').close() + os.unlink(testfile) + except (OSError, IOError): + self.cant_write_to_target() + + if not is_site_dir and not self.multi_version: + # Can't install non-multi to non-site dir + raise DistutilsError(self.no_default_version_msg()) + + if is_site_dir: + if self.pth_file is None: + self.pth_file = PthDistributions(pth_file, self.all_site_dirs) + else: + self.pth_file = None + + if instdir not in map(normalize_path, _pythonpath()): + # only PYTHONPATH dirs need a site.py, so pretend it's there + self.sitepy_installed = True + elif self.multi_version and not os.path.exists(pth_file): + self.sitepy_installed = True # don't need site.py in this case + self.pth_file = None # and don't create a .pth file + self.install_dir = instdir + + __cant_write_msg = textwrap.dedent(""" + can't create or remove files in install directory + + The following error occurred while trying to add or remove files in the + installation directory: + + %s + + The installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + """).lstrip() + + __not_exists_id = textwrap.dedent(""" + This directory does not currently exist. Please create it and try again, or + choose a different installation directory (using the -d or --install-dir + option). + """).lstrip() + + __access_msg = textwrap.dedent(""" + Perhaps your account does not have write access to this directory? If the + installation directory is a system-owned directory, you may need to sign in + as the administrator or "root" account. If you do not have administrative + access to this machine, you may wish to choose a different installation + directory, preferably one that is listed in your PYTHONPATH environment + variable. + + For information on other options, you may wish to consult the + documentation at: + + https://setuptools.readthedocs.io/en/latest/easy_install.html + + Please make the appropriate changes for your system and try again. + """).lstrip() + + def cant_write_to_target(self): + msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) + + if not os.path.exists(self.install_dir): + msg += '\n' + self.__not_exists_id + else: + msg += '\n' + self.__access_msg + raise DistutilsError(msg) + + def check_pth_processing(self): + """Empirically verify whether .pth files are supported in inst. dir""" + instdir = self.install_dir + log.info("Checking .pth file support in %s", instdir) + pth_file = self.pseudo_tempname() + ".pth" + ok_file = pth_file + '.ok' + ok_exists = os.path.exists(ok_file) + tmpl = _one_liner(""" + import os + f = open({ok_file!r}, 'w') + f.write('OK') + f.close() + """) + '\n' + try: + if ok_exists: + os.unlink(ok_file) + dirname = os.path.dirname(ok_file) + pkg_resources.py31compat.makedirs(dirname, exist_ok=True) + f = open(pth_file, 'w') + except (OSError, IOError): + self.cant_write_to_target() + else: + try: + f.write(tmpl.format(**locals())) + f.close() + f = None + executable = sys.executable + if os.name == 'nt': + dirname, basename = os.path.split(executable) + alt = os.path.join(dirname, 'pythonw.exe') + use_alt = ( + basename.lower() == 'python.exe' and + os.path.exists(alt) + ) + if use_alt: + # use pythonw.exe to avoid opening a console window + executable = alt + + from distutils.spawn import spawn + + spawn([executable, '-E', '-c', 'pass'], 0) + + if os.path.exists(ok_file): + log.info( + "TEST PASSED: %s appears to support .pth files", + instdir + ) + return True + finally: + if f: + f.close() + if os.path.exists(ok_file): + os.unlink(ok_file) + if os.path.exists(pth_file): + os.unlink(pth_file) + if not self.multi_version: + log.warn("TEST FAILED: %s does NOT support .pth files", instdir) + return False + + def install_egg_scripts(self, dist): + """Write all the scripts for `dist`, unless scripts are excluded""" + if not self.exclude_scripts and dist.metadata_isdir('scripts'): + for script_name in dist.metadata_listdir('scripts'): + if dist.metadata_isdir('scripts/' + script_name): + # The "script" is a directory, likely a Python 3 + # __pycache__ directory, so skip it. + continue + self.install_script( + dist, script_name, + dist.get_metadata('scripts/' + script_name) + ) + self.install_wrapper_scripts(dist) + + def add_output(self, path): + if os.path.isdir(path): + for base, dirs, files in os.walk(path): + for filename in files: + self.outputs.append(os.path.join(base, filename)) + else: + self.outputs.append(path) + + def not_editable(self, spec): + if self.editable: + raise DistutilsArgError( + "Invalid argument %r: you can't use filenames or URLs " + "with --editable (except via the --find-links option)." + % (spec,) + ) + + def check_editable(self, spec): + if not self.editable: + return + + if os.path.exists(os.path.join(self.build_directory, spec.key)): + raise DistutilsArgError( + "%r already exists in %s; can't do a checkout there" % + (spec.key, self.build_directory) + ) + + @contextlib.contextmanager + def _tmpdir(self): + tmpdir = tempfile.mkdtemp(prefix=u"easy_install-") + try: + # cast to str as workaround for #709 and #710 and #712 + yield str(tmpdir) + finally: + os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) + + def easy_install(self, spec, deps=False): + if not self.editable: + self.install_site_py() + + with self._tmpdir() as tmpdir: + if not isinstance(spec, Requirement): + if URL_SCHEME(spec): + # It's a url, download it to tmpdir and process + self.not_editable(spec) + dl = self.package_index.download(spec, tmpdir) + return self.install_item(None, dl, tmpdir, deps, True) + + elif os.path.exists(spec): + # Existing file or directory, just process it directly + self.not_editable(spec) + return self.install_item(None, spec, tmpdir, deps, True) + else: + spec = parse_requirement_arg(spec) + + self.check_editable(spec) + dist = self.package_index.fetch_distribution( + spec, tmpdir, self.upgrade, self.editable, + not self.always_copy, self.local_index + ) + if dist is None: + msg = "Could not find suitable distribution for %r" % spec + if self.always_copy: + msg += " (--always-copy skips system and development eggs)" + raise DistutilsError(msg) + elif dist.precedence == DEVELOP_DIST: + # .egg-info dists don't need installing, just process deps + self.process_distribution(spec, dist, deps, "Using") + return dist + else: + return self.install_item(spec, dist.location, tmpdir, deps) + + def install_item(self, spec, download, tmpdir, deps, install_needed=False): + + # Installation is also needed if file in tmpdir or is not an egg + install_needed = install_needed or self.always_copy + install_needed = install_needed or os.path.dirname(download) == tmpdir + install_needed = install_needed or not download.endswith('.egg') + install_needed = install_needed or ( + self.always_copy_from is not None and + os.path.dirname(normalize_path(download)) == + normalize_path(self.always_copy_from) + ) + + if spec and not install_needed: + # at this point, we know it's a local .egg, we just don't know if + # it's already installed. + for dist in self.local_index[spec.project_name]: + if dist.location == download: + break + else: + install_needed = True # it's not in the local index + + log.info("Processing %s", os.path.basename(download)) + + if install_needed: + dists = self.install_eggs(spec, download, tmpdir) + for dist in dists: + self.process_distribution(spec, dist, deps) + else: + dists = [self.egg_distribution(download)] + self.process_distribution(spec, dists[0], deps, "Using") + + if spec is not None: + for dist in dists: + if dist in spec: + return dist + + def select_scheme(self, name): + """Sets the install directories by applying the install schemes.""" + # it's the caller's problem if they supply a bad name! + scheme = INSTALL_SCHEMES[name] + for key in SCHEME_KEYS: + attrname = 'install_' + key + if getattr(self, attrname) is None: + setattr(self, attrname, scheme[key]) + + def process_distribution(self, requirement, dist, deps=True, *info): + self.update_pth(dist) + self.package_index.add(dist) + if dist in self.local_index[dist.key]: + self.local_index.remove(dist) + self.local_index.add(dist) + self.install_egg_scripts(dist) + self.installed_projects[dist.key] = dist + log.info(self.installation_report(requirement, dist, *info)) + if (dist.has_metadata('dependency_links.txt') and + not self.no_find_links): + self.package_index.add_find_links( + dist.get_metadata_lines('dependency_links.txt') + ) + if not deps and not self.always_copy: + return + elif requirement is not None and dist.key != requirement.key: + log.warn("Skipping dependencies for %s", dist) + return # XXX this is not the distribution we were looking for + elif requirement is None or dist not in requirement: + # if we wound up with a different version, resolve what we've got + distreq = dist.as_requirement() + requirement = Requirement(str(distreq)) + log.info("Processing dependencies for %s", requirement) + try: + distros = WorkingSet([]).resolve( + [requirement], self.local_index, self.easy_install + ) + except DistributionNotFound as e: + raise DistutilsError(str(e)) + except VersionConflict as e: + raise DistutilsError(e.report()) + if self.always_copy or self.always_copy_from: + # Force all the relevant distros to be copied or activated + for dist in distros: + if dist.key not in self.installed_projects: + self.easy_install(dist.as_requirement()) + log.info("Finished processing dependencies for %s", requirement) + + def should_unzip(self, dist): + if self.zip_ok is not None: + return not self.zip_ok + if dist.has_metadata('not-zip-safe'): + return True + if not dist.has_metadata('zip-safe'): + return True + return False + + def maybe_move(self, spec, dist_filename, setup_base): + dst = os.path.join(self.build_directory, spec.key) + if os.path.exists(dst): + msg = ( + "%r already exists in %s; build directory %s will not be kept" + ) + log.warn(msg, spec.key, self.build_directory, setup_base) + return setup_base + if os.path.isdir(dist_filename): + setup_base = dist_filename + else: + if os.path.dirname(dist_filename) == setup_base: + os.unlink(dist_filename) # get it out of the tmp dir + contents = os.listdir(setup_base) + if len(contents) == 1: + dist_filename = os.path.join(setup_base, contents[0]) + if os.path.isdir(dist_filename): + # if the only thing there is a directory, move it instead + setup_base = dist_filename + ensure_directory(dst) + shutil.move(setup_base, dst) + return dst + + def install_wrapper_scripts(self, dist): + if self.exclude_scripts: + return + for args in ScriptWriter.best().get_args(dist): + self.write_script(*args) + + def install_script(self, dist, script_name, script_text, dev_path=None): + """Generate a legacy script wrapper and install it""" + spec = str(dist.as_requirement()) + is_script = is_python_script(script_text, script_name) + + if is_script: + body = self._load_template(dev_path) % locals() + script_text = ScriptWriter.get_header(script_text) + body + self.write_script(script_name, _to_bytes(script_text), 'b') + + @staticmethod + def _load_template(dev_path): + """ + There are a couple of template scripts in the package. This + function loads one of them and prepares it for use. + """ + # See https://github.com/pypa/setuptools/issues/134 for info + # on script file naming and downstream issues with SVR4 + name = 'script.tmpl' + if dev_path: + name = name.replace('.tmpl', ' (dev).tmpl') + + raw_bytes = resource_string('setuptools', name) + return raw_bytes.decode('utf-8') + + def write_script(self, script_name, contents, mode="t", blockers=()): + """Write an executable file to the scripts directory""" + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir, x) for x in blockers] + ) + log.info("Installing %s script to %s", script_name, self.script_dir) + target = os.path.join(self.script_dir, script_name) + self.add_output(target) + + if self.dry_run: + return + + mask = current_umask() + ensure_directory(target) + if os.path.exists(target): + os.unlink(target) + with open(target, "w" + mode) as f: + f.write(contents) + chmod(target, 0o777 - mask) + + def install_eggs(self, spec, dist_filename, tmpdir): + # .egg dirs or files are already built, so just return them + if dist_filename.lower().endswith('.egg'): + return [self.install_egg(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.exe'): + return [self.install_exe(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.whl'): + return [self.install_wheel(dist_filename, tmpdir)] + + # Anything else, try to extract and build + setup_base = tmpdir + if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): + unpack_archive(dist_filename, tmpdir, self.unpack_progress) + elif os.path.isdir(dist_filename): + setup_base = os.path.abspath(dist_filename) + + if (setup_base.startswith(tmpdir) # something we downloaded + and self.build_directory and spec is not None): + setup_base = self.maybe_move(spec, dist_filename, setup_base) + + # Find the setup.py file + setup_script = os.path.join(setup_base, 'setup.py') + + if not os.path.exists(setup_script): + setups = glob(os.path.join(setup_base, '*', 'setup.py')) + if not setups: + raise DistutilsError( + "Couldn't find a setup script in %s" % + os.path.abspath(dist_filename) + ) + if len(setups) > 1: + raise DistutilsError( + "Multiple setup scripts in %s" % + os.path.abspath(dist_filename) + ) + setup_script = setups[0] + + # Now run it, and return the result + if self.editable: + log.info(self.report_editable(spec, setup_script)) + return [] + else: + return self.build_and_install(setup_script, setup_base) + + def egg_distribution(self, egg_path): + if os.path.isdir(egg_path): + metadata = PathMetadata(egg_path, os.path.join(egg_path, + 'EGG-INFO')) + else: + metadata = EggMetadata(zipimport.zipimporter(egg_path)) + return Distribution.from_filename(egg_path, metadata=metadata) + + def install_egg(self, egg_path, tmpdir): + destination = os.path.join( + self.install_dir, + os.path.basename(egg_path), + ) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + + dist = self.egg_distribution(egg_path) + if not samefile(egg_path, destination): + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + new_dist_is_zipped = False + if os.path.isdir(egg_path): + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copytree, "Copying" + elif self.should_unzip(dist): + self.mkpath(destination) + f, m = self.unpack_and_compile, "Extracting" + else: + new_dist_is_zipped = True + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copy2, "Copying" + self.execute( + f, + (egg_path, destination), + (m + " %s to %s") % ( + os.path.basename(egg_path), + os.path.dirname(destination) + ), + ) + update_dist_caches( + destination, + fix_zipimporter_caches=new_dist_is_zipped, + ) + except Exception: + update_dist_caches(destination, fix_zipimporter_caches=False) + raise + + self.add_output(destination) + return self.egg_distribution(destination) + + def install_exe(self, dist_filename, tmpdir): + # See if it's valid, get data + cfg = extract_wininst_cfg(dist_filename) + if cfg is None: + raise DistutilsError( + "%s is not a valid distutils Windows .exe" % dist_filename + ) + # Create a dummy distribution object until we build the real distro + dist = Distribution( + None, + project_name=cfg.get('metadata', 'name'), + version=cfg.get('metadata', 'version'), platform=get_platform(), + ) + + # Convert the .exe to an unpacked egg + egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') + dist.location = egg_path + egg_tmp = egg_path + '.tmp' + _egg_info = os.path.join(egg_tmp, 'EGG-INFO') + pkg_inf = os.path.join(_egg_info, 'PKG-INFO') + ensure_directory(pkg_inf) # make sure EGG-INFO dir exists + dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX + self.exe_to_egg(dist_filename, egg_tmp) + + # Write EGG-INFO/PKG-INFO + if not os.path.exists(pkg_inf): + f = open(pkg_inf, 'w') + f.write('Metadata-Version: 1.0\n') + for k, v in cfg.items('metadata'): + if k != 'target_version': + f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) + f.close() + script_dir = os.path.join(_egg_info, 'scripts') + # delete entry-point scripts to avoid duping + self.delete_blockers([ + os.path.join(script_dir, args[0]) + for args in ScriptWriter.get_args(dist) + ]) + # Build .egg file from tmpdir + bdist_egg.make_zipfile( + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, + ) + # install the .egg + return self.install_egg(egg_path, tmpdir) + + def exe_to_egg(self, dist_filename, egg_tmp): + """Extract a bdist_wininst to the directories an egg would use""" + # Check for .pth file and set up prefix translations + prefixes = get_exe_prefixes(dist_filename) + to_compile = [] + native_libs = [] + top_level = {} + + def process(src, dst): + s = src.lower() + for old, new in prefixes: + if s.startswith(old): + src = new + src[len(old):] + parts = src.split('/') + dst = os.path.join(egg_tmp, *parts) + dl = dst.lower() + if dl.endswith('.pyd') or dl.endswith('.dll'): + parts[-1] = bdist_egg.strip_module(parts[-1]) + top_level[os.path.splitext(parts[0])[0]] = 1 + native_libs.append(src) + elif dl.endswith('.py') and old != 'SCRIPTS/': + top_level[os.path.splitext(parts[0])[0]] = 1 + to_compile.append(dst) + return dst + if not src.endswith('.pth'): + log.warn("WARNING: can't process %s", src) + return None + + # extract, tracking .pyd/.dll->native_libs and .py -> to_compile + unpack_archive(dist_filename, egg_tmp, process) + stubs = [] + for res in native_libs: + if res.lower().endswith('.pyd'): # create stubs for .pyd's + parts = res.split('/') + resource = parts[-1] + parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' + pyfile = os.path.join(egg_tmp, *parts) + to_compile.append(pyfile) + stubs.append(pyfile) + bdist_egg.write_stub(resource, pyfile) + self.byte_compile(to_compile) # compile .py's + bdist_egg.write_safety_flag( + os.path.join(egg_tmp, 'EGG-INFO'), + bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag + + for name in 'top_level', 'native_libs': + if locals()[name]: + txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') + if not os.path.exists(txt): + f = open(txt, 'w') + f.write('\n'.join(locals()[name]) + '\n') + f.close() + + def install_wheel(self, wheel_path, tmpdir): + wheel = Wheel(wheel_path) + assert wheel.is_compatible() + destination = os.path.join(self.install_dir, wheel.egg_name()) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + self.execute( + wheel.install_as_egg, + (destination,), + ("Installing %s to %s") % ( + os.path.basename(wheel_path), + os.path.dirname(destination) + ), + ) + finally: + update_dist_caches(destination, fix_zipimporter_caches=False) + self.add_output(destination) + return self.egg_distribution(destination) + + __mv_warning = textwrap.dedent(""" + Because this distribution was installed --multi-version, before you can + import modules from this package in an application, you will need to + 'import pkg_resources' and then use a 'require()' call similar to one of + these examples, in order to select the desired version: + + pkg_resources.require("%(name)s") # latest installed version + pkg_resources.require("%(name)s==%(version)s") # this exact version + pkg_resources.require("%(name)s>=%(version)s") # this version or higher + """).lstrip() + + __id_warning = textwrap.dedent(""" + Note also that the installation directory must be on sys.path at runtime for + this to work. (e.g. by being the application's script directory, by being on + PYTHONPATH, or by being added to sys.path by your code.) + """) + + def installation_report(self, req, dist, what="Installed"): + """Helpful installation message for display to package users""" + msg = "\n%(what)s %(eggloc)s%(extras)s" + if self.multi_version and not self.no_report: + msg += '\n' + self.__mv_warning + if self.install_dir not in map(normalize_path, sys.path): + msg += '\n' + self.__id_warning + + eggloc = dist.location + name = dist.project_name + version = dist.version + extras = '' # TODO: self.report_extras(req, dist) + return msg % locals() + + __editable_msg = textwrap.dedent(""" + Extracted editable version of %(spec)s to %(dirname)s + + If it uses setuptools in its setup script, you can activate it in + "development" mode by going to that directory and running:: + + %(python)s setup.py develop + + See the setuptools documentation for the "develop" command for more info. + """).lstrip() + + def report_editable(self, spec, setup_script): + dirname = os.path.dirname(setup_script) + python = sys.executable + return '\n' + self.__editable_msg % locals() + + def run_setup(self, setup_script, setup_base, args): + sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) + sys.modules.setdefault('distutils.command.egg_info', egg_info) + + args = list(args) + if self.verbose > 2: + v = 'v' * (self.verbose - 1) + args.insert(0, '-' + v) + elif self.verbose < 2: + args.insert(0, '-q') + if self.dry_run: + args.insert(0, '-n') + log.info( + "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) + ) + try: + run_setup(setup_script, args) + except SystemExit as v: + raise DistutilsError("Setup script exited with %s" % (v.args[0],)) + + def build_and_install(self, setup_script, setup_base): + args = ['bdist_egg', '--dist-dir'] + + dist_dir = tempfile.mkdtemp( + prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) + ) + try: + self._set_fetcher_options(os.path.dirname(setup_script)) + args.append(dist_dir) + + self.run_setup(setup_script, setup_base, args) + all_eggs = Environment([dist_dir]) + eggs = [] + for key in all_eggs: + for dist in all_eggs[key]: + eggs.append(self.install_egg(dist.location, setup_base)) + if not eggs and not self.dry_run: + log.warn("No eggs found in %s (setup script problem?)", + dist_dir) + return eggs + finally: + rmtree(dist_dir) + log.set_verbosity(self.verbose) # restore our log verbosity + + def _set_fetcher_options(self, base): + """ + When easy_install is about to run bdist_egg on a source dist, that + source dist might have 'setup_requires' directives, requiring + additional fetching. Ensure the fetcher options given to easy_install + are available to that command as well. + """ + # find the fetch options from easy_install and write them out + # to the setup.cfg file. + ei_opts = self.distribution.get_option_dict('easy_install').copy() + fetch_directives = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts', + ) + fetch_options = {} + for key, val in ei_opts.items(): + if key not in fetch_directives: + continue + fetch_options[key.replace('_', '-')] = val[1] + # create a settings dictionary suitable for `edit_config` + settings = dict(easy_install=fetch_options) + cfg_filename = os.path.join(base, 'setup.cfg') + setopt.edit_config(cfg_filename, settings) + + def update_pth(self, dist): + if self.pth_file is None: + return + + for d in self.pth_file[dist.key]: # drop old entries + if self.multi_version or d.location != dist.location: + log.info("Removing %s from easy-install.pth file", d) + self.pth_file.remove(d) + if d.location in self.shadow_path: + self.shadow_path.remove(d.location) + + if not self.multi_version: + if dist.location in self.pth_file.paths: + log.info( + "%s is already the active version in easy-install.pth", + dist, + ) + else: + log.info("Adding %s to easy-install.pth file", dist) + self.pth_file.add(dist) # add new entry + if dist.location not in self.shadow_path: + self.shadow_path.append(dist.location) + + if not self.dry_run: + + self.pth_file.save() + + if dist.key == 'setuptools': + # Ensure that setuptools itself never becomes unavailable! + # XXX should this check for latest version? + filename = os.path.join(self.install_dir, 'setuptools.pth') + if os.path.islink(filename): + os.unlink(filename) + f = open(filename, 'wt') + f.write(self.pth_file.make_relative(dist.location) + '\n') + f.close() + + def unpack_progress(self, src, dst): + # Progress filter for unpacking + log.debug("Unpacking %s to %s", src, dst) + return dst # only unpack-and-compile skips files for dry run + + def unpack_and_compile(self, egg_path, destination): + to_compile = [] + to_chmod = [] + + def pf(src, dst): + if dst.endswith('.py') and not src.startswith('EGG-INFO/'): + to_compile.append(dst) + elif dst.endswith('.dll') or dst.endswith('.so'): + to_chmod.append(dst) + self.unpack_progress(src, dst) + return not self.dry_run and dst or None + + unpack_archive(egg_path, destination, pf) + self.byte_compile(to_compile) + if not self.dry_run: + for f in to_chmod: + mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 + chmod(f, mode) + + def byte_compile(self, to_compile): + if sys.dont_write_bytecode: + return + + from distutils.util import byte_compile + + try: + # try to make the byte compile messages quieter + log.set_verbosity(self.verbose - 1) + + byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) + if self.optimize: + byte_compile( + to_compile, optimize=self.optimize, force=1, + dry_run=self.dry_run, + ) + finally: + log.set_verbosity(self.verbose) # restore original verbosity + + __no_default_msg = textwrap.dedent(""" + bad install directory or PYTHONPATH + + You are attempting to install a package to a directory that is not + on PYTHONPATH and which Python does not read ".pth" files from. The + installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + + and your PYTHONPATH environment variable currently contains: + + %r + + Here are some of your options for correcting the problem: + + * You can choose a different installation directory, i.e., one that is + on PYTHONPATH or supports .pth files + + * You can add the installation directory to the PYTHONPATH environment + variable. (It must then also be on PYTHONPATH whenever you run + Python and want to use the package(s) you are installing.) + + * You can set up the installation directory to support ".pth" files by + using one of the approaches described here: + + https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations + + + Please make the appropriate changes for your system and try again.""").lstrip() + + def no_default_version_msg(self): + template = self.__no_default_msg + return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) + + def install_site_py(self): + """Make sure there's a site.py in the target dir, if needed""" + + if self.sitepy_installed: + return # already did it, or don't need to + + sitepy = os.path.join(self.install_dir, "site.py") + source = resource_string("setuptools", "site-patch.py") + source = source.decode('utf-8') + current = "" + + if os.path.exists(sitepy): + log.debug("Checking existing site.py in %s", self.install_dir) + with io.open(sitepy) as strm: + current = strm.read() + + if not current.startswith('def __boot():'): + raise DistutilsError( + "%s is not a setuptools-generated site.py; please" + " remove it." % sitepy + ) + + if current != source: + log.info("Creating %s", sitepy) + if not self.dry_run: + ensure_directory(sitepy) + with io.open(sitepy, 'w', encoding='utf-8') as strm: + strm.write(source) + self.byte_compile([sitepy]) + + self.sitepy_installed = True + + def create_home_path(self): + """Create directories under ~.""" + if not self.user: + return + home = convert_path(os.path.expanduser("~")) + for name, path in six.iteritems(self.config_vars): + if path.startswith(home) and not os.path.isdir(path): + self.debug_print("os.makedirs('%s', 0o700)" % path) + os.makedirs(path, 0o700) + + INSTALL_SCHEMES = dict( + posix=dict( + install_dir='$base/lib/python$py_version_short/site-packages', + script_dir='$base/bin', + ), + ) + + DEFAULT_SCHEME = dict( + install_dir='$base/Lib/site-packages', + script_dir='$base/Scripts', + ) + + def _expand(self, *attrs): + config_vars = self.get_finalized_command('install').config_vars + + if self.prefix: + # Set default install_dir/scripts from --prefix + config_vars = config_vars.copy() + config_vars['base'] = self.prefix + scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) + for attr, val in scheme.items(): + if getattr(self, attr, None) is None: + setattr(self, attr, val) + + from distutils.util import subst_vars + + for attr in attrs: + val = getattr(self, attr) + if val is not None: + val = subst_vars(val, config_vars) + if os.name == 'posix': + val = os.path.expanduser(val) + setattr(self, attr, val) + + +def _pythonpath(): + items = os.environ.get('PYTHONPATH', '').split(os.pathsep) + return filter(None, items) + + +def get_site_dirs(): + """ + Return a list of 'site' dirs + """ + + sitedirs = [] + + # start with PYTHONPATH + sitedirs.extend(_pythonpath()) + + prefixes = [sys.prefix] + if sys.exec_prefix != sys.prefix: + prefixes.append(sys.exec_prefix) + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos'): + sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) + elif os.sep == '/': + sitedirs.extend([ + os.path.join( + prefix, + "lib", + "python" + sys.version[:3], + "site-packages", + ), + os.path.join(prefix, "lib", "site-python"), + ]) + else: + sitedirs.extend([ + prefix, + os.path.join(prefix, "lib", "site-packages"), + ]) + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + home_sp = os.path.join( + home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages', + ) + sitedirs.append(home_sp) + lib_paths = get_path('purelib'), get_path('platlib') + for site_lib in lib_paths: + if site_lib not in sitedirs: + sitedirs.append(site_lib) + + if site.ENABLE_USER_SITE: + sitedirs.append(site.USER_SITE) + + try: + sitedirs.extend(site.getsitepackages()) + except AttributeError: + pass + + sitedirs = list(map(normalize_path, sitedirs)) + + return sitedirs + + +def expand_paths(inputs): + """Yield sys.path directories that might contain "old-style" packages""" + + seen = {} + + for dirname in inputs: + dirname = normalize_path(dirname) + if dirname in seen: + continue + + seen[dirname] = 1 + if not os.path.isdir(dirname): + continue + + files = os.listdir(dirname) + yield dirname, files + + for name in files: + if not name.endswith('.pth'): + # We only care about the .pth files + continue + if name in ('easy-install.pth', 'setuptools.pth'): + # Ignore .pth files that we control + continue + + # Read the .pth file + f = open(os.path.join(dirname, name)) + lines = list(yield_lines(f)) + f.close() + + # Yield existing non-dupe, non-import directory lines from it + for line in lines: + if not line.startswith("import"): + line = normalize_path(line.rstrip()) + if line not in seen: + seen[line] = 1 + if not os.path.isdir(line): + continue + yield line, os.listdir(line) + + +def extract_wininst_cfg(dist_filename): + """Extract configuration data from a bdist_wininst .exe + + Returns a configparser.RawConfigParser, or None + """ + f = open(dist_filename, 'rb') + try: + endrec = zipfile._EndRecData(f) + if endrec is None: + return None + + prepended = (endrec[9] - endrec[5]) - endrec[6] + if prepended < 12: # no wininst data here + return None + f.seek(prepended - 12) + + tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) + if tag not in (0x1234567A, 0x1234567B): + return None # not a valid tag + + f.seek(prepended - (12 + cfglen)) + init = {'version': '', 'target_version': ''} + cfg = configparser.RawConfigParser(init) + try: + part = f.read(cfglen) + # Read up to the first null byte. + config = part.split(b'\0', 1)[0] + # Now the config is in bytes, but for RawConfigParser, it should + # be text, so decode it. + config = config.decode(sys.getfilesystemencoding()) + cfg.readfp(six.StringIO(config)) + except configparser.Error: + return None + if not cfg.has_section('metadata') or not cfg.has_section('Setup'): + return None + return cfg + + finally: + f.close() + + +def get_exe_prefixes(exe_filename): + """Get exe->egg path translations for a given .exe file""" + + prefixes = [ + ('PURELIB/', ''), + ('PLATLIB/pywin32_system32', ''), + ('PLATLIB/', ''), + ('SCRIPTS/', 'EGG-INFO/scripts/'), + ('DATA/lib/site-packages', ''), + ] + z = zipfile.ZipFile(exe_filename) + try: + for info in z.infolist(): + name = info.filename + parts = name.split('/') + if len(parts) == 3 and parts[2] == 'PKG-INFO': + if parts[1].endswith('.egg-info'): + prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) + break + if len(parts) != 2 or not name.endswith('.pth'): + continue + if name.endswith('-nspkg.pth'): + continue + if parts[0].upper() in ('PURELIB', 'PLATLIB'): + contents = z.read(name) + if six.PY3: + contents = contents.decode() + for pth in yield_lines(contents): + pth = pth.strip().replace('\\', '/') + if not pth.startswith('import'): + prefixes.append((('%s/%s/' % (parts[0], pth)), '')) + finally: + z.close() + prefixes = [(x.lower(), y) for x, y in prefixes] + prefixes.sort() + prefixes.reverse() + return prefixes + + +class PthDistributions(Environment): + """A .pth file with Distribution paths in it""" + + dirty = False + + def __init__(self, filename, sitedirs=()): + self.filename = filename + self.sitedirs = list(map(normalize_path, sitedirs)) + self.basedir = normalize_path(os.path.dirname(self.filename)) + self._load() + Environment.__init__(self, [], None, None) + for path in yield_lines(self.paths): + list(map(self.add, find_distributions(path, True))) + + def _load(self): + self.paths = [] + saw_import = False + seen = dict.fromkeys(self.sitedirs) + if os.path.isfile(self.filename): + f = open(self.filename, 'rt') + for line in f: + if line.startswith('import'): + saw_import = True + continue + path = line.rstrip() + self.paths.append(path) + if not path.strip() or path.strip().startswith('#'): + continue + # skip non-existent paths, in case somebody deleted a package + # manually, and duplicate paths as well + path = self.paths[-1] = normalize_path( + os.path.join(self.basedir, path) + ) + if not os.path.exists(path) or path in seen: + self.paths.pop() # skip it + self.dirty = True # we cleaned up, so we're dirty now :) + continue + seen[path] = 1 + f.close() + + if self.paths and not saw_import: + self.dirty = True # ensure anything we touch has import wrappers + while self.paths and not self.paths[-1].strip(): + self.paths.pop() + + def save(self): + """Write changed .pth file back to disk""" + if not self.dirty: + return + + rel_paths = list(map(self.make_relative, self.paths)) + if rel_paths: + log.debug("Saving %s", self.filename) + lines = self._wrap_lines(rel_paths) + data = '\n'.join(lines) + '\n' + + if os.path.islink(self.filename): + os.unlink(self.filename) + with open(self.filename, 'wt') as f: + f.write(data) + + elif os.path.exists(self.filename): + log.debug("Deleting empty %s", self.filename) + os.unlink(self.filename) + + self.dirty = False + + @staticmethod + def _wrap_lines(lines): + return lines + + def add(self, dist): + """Add `dist` to the distribution map""" + new_path = ( + dist.location not in self.paths and ( + dist.location not in self.sitedirs or + # account for '.' being in PYTHONPATH + dist.location == os.getcwd() + ) + ) + if new_path: + self.paths.append(dist.location) + self.dirty = True + Environment.add(self, dist) + + def remove(self, dist): + """Remove `dist` from the distribution map""" + while dist.location in self.paths: + self.paths.remove(dist.location) + self.dirty = True + Environment.remove(self, dist) + + def make_relative(self, path): + npath, last = os.path.split(normalize_path(path)) + baselen = len(self.basedir) + parts = [last] + sep = os.altsep == '/' and '/' or os.sep + while len(npath) >= baselen: + if npath == self.basedir: + parts.append(os.curdir) + parts.reverse() + return sep.join(parts) + npath, last = os.path.split(npath) + parts.append(last) + else: + return path + + +class RewritePthDistributions(PthDistributions): + @classmethod + def _wrap_lines(cls, lines): + yield cls.prelude + for line in lines: + yield line + yield cls.postlude + + prelude = _one_liner(""" + import sys + sys.__plen = len(sys.path) + """) + postlude = _one_liner(""" + import sys + new = sys.path[sys.__plen:] + del sys.path[sys.__plen:] + p = getattr(sys, '__egginsert', 0) + sys.path[p:p] = new + sys.__egginsert = p + len(new) + """) + + +if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': + PthDistributions = RewritePthDistributions + + +def _first_line_re(): + """ + Return a regular expression based on first_line_re suitable for matching + strings. + """ + if isinstance(first_line_re.pattern, str): + return first_line_re + + # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. + return re.compile(first_line_re.pattern.decode()) + + +def auto_chmod(func, arg, exc): + if func in [os.unlink, os.remove] and os.name == 'nt': + chmod(arg, stat.S_IWRITE) + return func(arg) + et, ev, _ = sys.exc_info() + six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) + + +def update_dist_caches(dist_path, fix_zipimporter_caches): + """ + Fix any globally cached `dist_path` related data + + `dist_path` should be a path of a newly installed egg distribution (zipped + or unzipped). + + sys.path_importer_cache contains finder objects that have been cached when + importing data from the original distribution. Any such finders need to be + cleared since the replacement distribution might be packaged differently, + e.g. a zipped egg distribution might get replaced with an unzipped egg + folder or vice versa. Having the old finders cached may then cause Python + to attempt loading modules from the replacement distribution using an + incorrect loader. + + zipimport.zipimporter objects are Python loaders charged with importing + data packaged inside zip archives. If stale loaders referencing the + original distribution, are left behind, they can fail to load modules from + the replacement distribution. E.g. if an old zipimport.zipimporter instance + is used to load data from a new zipped egg archive, it may cause the + operation to attempt to locate the requested data in the wrong location - + one indicated by the original distribution's zip archive directory + information. Such an operation may then fail outright, e.g. report having + read a 'bad local file header', or even worse, it may fail silently & + return invalid data. + + zipimport._zip_directory_cache contains cached zip archive directory + information for all existing zipimport.zipimporter instances and all such + instances connected to the same archive share the same cached directory + information. + + If asked, and the underlying Python implementation allows it, we can fix + all existing zipimport.zipimporter instances instead of having to track + them down and remove them one by one, by updating their shared cached zip + archive directory information. This, of course, assumes that the + replacement distribution is packaged as a zipped egg. + + If not asked to fix existing zipimport.zipimporter instances, we still do + our best to clear any remaining zipimport.zipimporter related cached data + that might somehow later get used when attempting to load data from the new + distribution and thus cause such load operations to fail. Note that when + tracking down such remaining stale data, we can not catch every conceivable + usage from here, and we clear only those that we know of and have found to + cause problems if left alive. Any remaining caches should be updated by + whomever is in charge of maintaining them, i.e. they should be ready to + handle us replacing their zip archives with new distributions at runtime. + + """ + # There are several other known sources of stale zipimport.zipimporter + # instances that we do not clear here, but might if ever given a reason to + # do so: + # * Global setuptools pkg_resources.working_set (a.k.a. 'master working + # set') may contain distributions which may in turn contain their + # zipimport.zipimporter loaders. + # * Several zipimport.zipimporter loaders held by local variables further + # up the function call stack when running the setuptools installation. + # * Already loaded modules may have their __loader__ attribute set to the + # exact loader instance used when importing them. Python 3.4 docs state + # that this information is intended mostly for introspection and so is + # not expected to cause us problems. + normalized_path = normalize_path(dist_path) + _uncache(normalized_path, sys.path_importer_cache) + if fix_zipimporter_caches: + _replace_zip_directory_cache_data(normalized_path) + else: + # Here, even though we do not want to fix existing and now stale + # zipimporter cache information, we still want to remove it. Related to + # Python's zip archive directory information cache, we clear each of + # its stale entries in two phases: + # 1. Clear the entry so attempting to access zip archive information + # via any existing stale zipimport.zipimporter instances fails. + # 2. Remove the entry from the cache so any newly constructed + # zipimport.zipimporter instances do not end up using old stale + # zip archive directory information. + # This whole stale data removal step does not seem strictly necessary, + # but has been left in because it was done before we started replacing + # the zip archive directory information cache content if possible, and + # there are no relevant unit tests that we can depend on to tell us if + # this is really needed. + _remove_and_clear_zip_directory_cache_data(normalized_path) + + +def _collect_zipimporter_cache_entries(normalized_path, cache): + """ + Return zipimporter cache entry keys related to a given normalized path. + + Alternative path spellings (e.g. those using different character case or + those using alternative path separators) related to the same path are + included. Any sub-path entries are included as well, i.e. those + corresponding to zip archives embedded in other zip archives. + + """ + result = [] + prefix_len = len(normalized_path) + for p in cache: + np = normalize_path(p) + if (np.startswith(normalized_path) and + np[prefix_len:prefix_len + 1] in (os.sep, '')): + result.append(p) + return result + + +def _update_zipimporter_cache(normalized_path, cache, updater=None): + """ + Update zipimporter cache data for a given normalized path. + + Any sub-path entries are processed as well, i.e. those corresponding to zip + archives embedded in other zip archives. + + Given updater is a callable taking a cache entry key and the original entry + (after already removing the entry from the cache), and expected to update + the entry and possibly return a new one to be inserted in its place. + Returning None indicates that the entry should not be replaced with a new + one. If no updater is given, the cache entries are simply removed without + any additional processing, the same as if the updater simply returned None. + + """ + for p in _collect_zipimporter_cache_entries(normalized_path, cache): + # N.B. pypy's custom zipimport._zip_directory_cache implementation does + # not support the complete dict interface: + # * Does not support item assignment, thus not allowing this function + # to be used only for removing existing cache entries. + # * Does not support the dict.pop() method, forcing us to use the + # get/del patterns instead. For more detailed information see the + # following links: + # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 + # http://bit.ly/2h9itJX + old_entry = cache[p] + del cache[p] + new_entry = updater and updater(p, old_entry) + if new_entry is not None: + cache[p] = new_entry + + +def _uncache(normalized_path, cache): + _update_zipimporter_cache(normalized_path, cache) + + +def _remove_and_clear_zip_directory_cache_data(normalized_path): + def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): + old_entry.clear() + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=clear_and_remove_cached_zip_archive_directory_data) + + +# PyPy Python implementation does not allow directly writing to the +# zipimport._zip_directory_cache and so prevents us from attempting to correct +# its content. The best we can do there is clear the problematic cache content +# and have PyPy repopulate it as needed. The downside is that if there are any +# stale zipimport.zipimporter instances laying around, attempting to use them +# will fail due to not having its zip archive directory information available +# instead of being automatically corrected to use the new correct zip archive +# directory information. +if '__pypy__' in sys.builtin_module_names: + _replace_zip_directory_cache_data = \ + _remove_and_clear_zip_directory_cache_data +else: + + def _replace_zip_directory_cache_data(normalized_path): + def replace_cached_zip_archive_directory_data(path, old_entry): + # N.B. In theory, we could load the zip directory information just + # once for all updated path spellings, and then copy it locally and + # update its contained path strings to contain the correct + # spelling, but that seems like a way too invasive move (this cache + # structure is not officially documented anywhere and could in + # theory change with new Python releases) for no significant + # benefit. + old_entry.clear() + zipimport.zipimporter(path) + old_entry.update(zipimport._zip_directory_cache[path]) + return old_entry + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=replace_cached_zip_archive_directory_data) + + +def is_python(text, filename='<string>'): + "Is this string a valid Python script?" + try: + compile(text, filename, 'exec') + except (SyntaxError, TypeError): + return False + else: + return True + + +def is_sh(executable): + """Determine if the specified executable is a .sh (contains a #! line)""" + try: + with io.open(executable, encoding='latin-1') as fp: + magic = fp.read(2) + except (OSError, IOError): + return executable + return magic == '#!' + + +def nt_quote_arg(arg): + """Quote a command line argument according to Windows parsing rules""" + return subprocess.list2cmdline([arg]) + + +def is_python_script(script_text, filename): + """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. + """ + if filename.endswith('.py') or filename.endswith('.pyw'): + return True # extension says it's Python + if is_python(script_text, filename): + return True # it's syntactically valid Python + if script_text.startswith('#!'): + # It begins with a '#!' line, so check if 'python' is in it somewhere + return 'python' in script_text.splitlines()[0].lower() + + return False # Not any Python I can recognize + + +try: + from os import chmod as _chmod +except ImportError: + # Jython compatibility + def _chmod(*args): + pass + + +def chmod(path, mode): + log.debug("changing mode of %s to %o", path, mode) + try: + _chmod(path, mode) + except os.error as e: + log.debug("chmod failed: %s", e) + + +class CommandSpec(list): + """ + A command spec for a #! header, specified as a list of arguments akin to + those passed to Popen. + """ + + options = [] + split_args = dict() + + @classmethod + def best(cls): + """ + Choose the best CommandSpec class based on environmental conditions. + """ + return cls + + @classmethod + def _sys_executable(cls): + _default = os.path.normpath(sys.executable) + return os.environ.get('__PYVENV_LAUNCHER__', _default) + + @classmethod + def from_param(cls, param): + """ + Construct a CommandSpec from a parameter to build_scripts, which may + be None. + """ + if isinstance(param, cls): + return param + if isinstance(param, list): + return cls(param) + if param is None: + return cls.from_environment() + # otherwise, assume it's a string. + return cls.from_string(param) + + @classmethod + def from_environment(cls): + return cls([cls._sys_executable()]) + + @classmethod + def from_string(cls, string): + """ + Construct a command spec from a simple string representing a command + line parseable by shlex.split. + """ + items = shlex.split(string, **cls.split_args) + return cls(items) + + def install_options(self, script_text): + self.options = shlex.split(self._extract_options(script_text)) + cmdline = subprocess.list2cmdline(self) + if not isascii(cmdline): + self.options[:0] = ['-x'] + + @staticmethod + def _extract_options(orig_script): + """ + Extract any options from the first line of the script. + """ + first = (orig_script + '\n').splitlines()[0] + match = _first_line_re().match(first) + options = match.group(1) or '' if match else '' + return options.strip() + + def as_header(self): + return self._render(self + list(self.options)) + + @staticmethod + def _strip_quotes(item): + _QUOTES = '"\'' + for q in _QUOTES: + if item.startswith(q) and item.endswith(q): + return item[1:-1] + return item + + @staticmethod + def _render(items): + cmdline = subprocess.list2cmdline( + CommandSpec._strip_quotes(item.strip()) for item in items) + return '#!' + cmdline + '\n' + + +# For pbr compat; will be removed in a future version. +sys_executable = CommandSpec._sys_executable() + + +class WindowsCommandSpec(CommandSpec): + split_args = dict(posix=False) + + +class ScriptWriter: + """ + Encapsulates behavior around writing entry point scripts for console and + gui apps. + """ + + template = textwrap.dedent(r""" + # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r + __requires__ = %(spec)r + import re + import sys + from pkg_resources import load_entry_point + + if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point(%(spec)r, %(group)r, %(name)r)() + ) + """).lstrip() + + command_spec_class = CommandSpec + + @classmethod + def get_script_args(cls, dist, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_args", EasyInstallDeprecationWarning) + writer = (WindowsScriptWriter if wininst else ScriptWriter).best() + header = cls.get_script_header("", executable, wininst) + return writer.get_args(dist, header) + + @classmethod + def get_script_header(cls, script_text, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_header", EasyInstallDeprecationWarning, stacklevel=2) + if wininst: + executable = "python.exe" + return cls.get_header(script_text, executable) + + @classmethod + def get_args(cls, dist, header=None): + """ + Yield write_script() argument tuples for a distribution's + console_scripts and gui_scripts entry points. + """ + if header is None: + header = cls.get_header() + spec = str(dist.as_requirement()) + for type_ in 'console', 'gui': + group = type_ + '_scripts' + for name, ep in dist.get_entry_map(group).items(): + cls._ensure_safe_name(name) + script_text = cls.template % locals() + args = cls._get_script_args(type_, name, header, script_text) + for res in args: + yield res + + @staticmethod + def _ensure_safe_name(name): + """ + Prevent paths in *_scripts entry point names. + """ + has_path_sep = re.search(r'[\\/]', name) + if has_path_sep: + raise ValueError("Path separators not allowed in script names") + + @classmethod + def get_writer(cls, force_windows): + # for backward compatibility + warnings.warn("Use best", EasyInstallDeprecationWarning) + return WindowsScriptWriter.best() if force_windows else cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter for this environment. + """ + if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): + return WindowsScriptWriter.best() + else: + return cls + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + # Simply write the stub with no extension. + yield (name, header + script_text) + + @classmethod + def get_header(cls, script_text="", executable=None): + """Create a #! line, getting options (if any) from script_text""" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + +class WindowsScriptWriter(ScriptWriter): + command_spec_class = WindowsCommandSpec + + @classmethod + def get_writer(cls): + # for backward compatibility + warnings.warn("Use best", EasyInstallDeprecationWarning) + return cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter suitable for Windows + """ + writer_lookup = dict( + executable=WindowsExecutableLauncherWriter, + natural=cls, + ) + # for compatibility, use the executable launcher by default + launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') + return writer_lookup[launcher] + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + "For Windows, add a .py extension" + ext = dict(console='.pya', gui='.pyw')[type_] + if ext not in os.environ['PATHEXT'].lower().split(';'): + msg = ( + "{ext} not listed in PATHEXT; scripts will not be " + "recognized as executables." + ).format(**locals()) + warnings.warn(msg, UserWarning) + old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] + old.remove(ext) + header = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield name + ext, header + script_text, 't', blockers + + @classmethod + def _adjust_header(cls, type_, orig_header): + """ + Make sure 'pythonw' is used for gui and and 'python' is used for + console (regardless of what sys.executable is). + """ + pattern = 'pythonw.exe' + repl = 'python.exe' + if type_ == 'gui': + pattern, repl = repl, pattern + pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) + new_header = pattern_ob.sub(string=orig_header, repl=repl) + return new_header if cls._use_header(new_header) else orig_header + + @staticmethod + def _use_header(new_header): + """ + Should _adjust_header use the replaced header? + + On non-windows systems, always use. On + Windows systems, only use the replaced header if it resolves + to an executable on the system. + """ + clean_header = new_header[2:-1].strip('"') + return sys.platform != 'win32' or find_executable(clean_header) + + +class WindowsExecutableLauncherWriter(WindowsScriptWriter): + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + """ + For Windows, add a .py extension and an .exe launcher + """ + if type_ == 'gui': + launcher_type = 'gui' + ext = '-script.pyw' + old = ['.pyw'] + else: + launcher_type = 'cli' + ext = '-script.py' + old = ['.py', '.pyc', '.pyo'] + hdr = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield (name + ext, hdr + script_text, 't', blockers) + yield ( + name + '.exe', get_win_launcher(launcher_type), + 'b' # write in binary mode + ) + if not is_64bit(): + # install a manifest for the launcher to prevent Windows + # from detecting it as an installer (which it will for + # launchers like easy_install.exe). Consider only + # adding a manifest for launchers detected as installers. + # See Distribute #143 for details. + m_name = name + '.exe.manifest' + yield (m_name, load_launcher_manifest(name), 't') + + +# for backward-compatibility +get_script_args = ScriptWriter.get_script_args +get_script_header = ScriptWriter.get_script_header + + +def get_win_launcher(type): + """ + Load the Windows launcher (executable) suitable for launching a script. + + `type` should be either 'cli' or 'gui' + + Returns the executable as a byte string. + """ + launcher_fn = '%s.exe' % type + if is_64bit(): + launcher_fn = launcher_fn.replace(".", "-64.") + else: + launcher_fn = launcher_fn.replace(".", "-32.") + return resource_string('setuptools', launcher_fn) + + +def load_launcher_manifest(name): + manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') + if six.PY2: + return manifest % vars() + else: + return manifest.decode('utf-8') % vars() + + +def rmtree(path, ignore_errors=False, onerror=auto_chmod): + return shutil.rmtree(path, ignore_errors, onerror) + + +def current_umask(): + tmp = os.umask(0o022) + os.umask(tmp) + return tmp + + +def bootstrap(): + # This function is called when setuptools*.egg is run using /bin/sh + import setuptools + + argv0 = os.path.dirname(setuptools.__path__[0]) + sys.argv[0] = argv0 + sys.argv.append(argv0) + main() + + +def main(argv=None, **kw): + from setuptools import setup + from setuptools.dist import Distribution + + class DistributionWithoutHelpCommands(Distribution): + common_usage = "" + + def _show_help(self, *args, **kw): + with _patch_usage(): + Distribution._show_help(self, *args, **kw) + + if argv is None: + argv = sys.argv[1:] + + with _patch_usage(): + setup( + script_args=['-q', 'easy_install', '-v'] + argv, + script_name=sys.argv[0] or 'easy_install', + distclass=DistributionWithoutHelpCommands, + **kw + ) + + +@contextlib.contextmanager +def _patch_usage(): + import distutils.core + USAGE = textwrap.dedent(""" + usage: %(script)s [options] requirement_or_url ... + or: %(script)s --help + """).lstrip() + + def gen_usage(script_name): + return USAGE % dict( + script=os.path.basename(script_name), + ) + + saved = distutils.core.gen_usage + distutils.core.gen_usage = gen_usage + try: + yield + finally: + distutils.core.gen_usage = saved + +class EasyInstallDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in EasyInstall in SetupTools. Not ignored by default, unlike DeprecationWarning.""" + diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py new file mode 100644 index 0000000..5d8f451 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/egg_info.py @@ -0,0 +1,717 @@ +"""setuptools.command.egg_info + +Create a distribution's .egg-info directory and contents""" + +from distutils.filelist import FileList as _FileList +from distutils.errors import DistutilsInternalError +from distutils.util import convert_path +from distutils import log +import distutils.errors +import distutils.filelist +import os +import re +import sys +import io +import warnings +import time +import collections + +from setuptools.extern import six +from setuptools.extern.six.moves import map + +from setuptools import Command +from setuptools.command.sdist import sdist +from setuptools.command.sdist import walk_revctrl +from setuptools.command.setopt import edit_config +from setuptools.command import bdist_egg +from pkg_resources import ( + parse_requirements, safe_name, parse_version, + safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) +import setuptools.unicode_utils as unicode_utils +from setuptools.glob import glob + +from setuptools.extern import packaging +from setuptools import SetuptoolsDeprecationWarning + +def translate_pattern(glob): + """ + Translate a file path glob like '*.txt' in to a regular expression. + This differs from fnmatch.translate which allows wildcards to match + directory separators. It also knows about '**/' which matches any number of + directories. + """ + pat = '' + + # This will split on '/' within [character classes]. This is deliberate. + chunks = glob.split(os.path.sep) + + sep = re.escape(os.sep) + valid_char = '[^%s]' % (sep,) + + for c, chunk in enumerate(chunks): + last_chunk = c == len(chunks) - 1 + + # Chunks that are a literal ** are globstars. They match anything. + if chunk == '**': + if last_chunk: + # Match anything if this is the last component + pat += '.*' + else: + # Match '(name/)*' + pat += '(?:%s+%s)*' % (valid_char, sep) + continue # Break here as the whole path component has been handled + + # Find any special characters in the remainder + i = 0 + chunk_len = len(chunk) + while i < chunk_len: + char = chunk[i] + if char == '*': + # Match any number of name characters + pat += valid_char + '*' + elif char == '?': + # Match a name character + pat += valid_char + elif char == '[': + # Character class + inner_i = i + 1 + # Skip initial !/] chars + if inner_i < chunk_len and chunk[inner_i] == '!': + inner_i = inner_i + 1 + if inner_i < chunk_len and chunk[inner_i] == ']': + inner_i = inner_i + 1 + + # Loop till the closing ] is found + while inner_i < chunk_len and chunk[inner_i] != ']': + inner_i = inner_i + 1 + + if inner_i >= chunk_len: + # Got to the end of the string without finding a closing ] + # Do not treat this as a matching group, but as a literal [ + pat += re.escape(char) + else: + # Grab the insides of the [brackets] + inner = chunk[i + 1:inner_i] + char_class = '' + + # Class negation + if inner[0] == '!': + char_class = '^' + inner = inner[1:] + + char_class += re.escape(inner) + pat += '[%s]' % (char_class,) + + # Skip to the end ] + i = inner_i + else: + pat += re.escape(char) + i += 1 + + # Join each chunk with the dir separator + if not last_chunk: + pat += sep + + pat += r'\Z' + return re.compile(pat, flags=re.MULTILINE|re.DOTALL) + + +class InfoCommon: + tag_build = None + tag_date = None + + @property + def name(self): + return safe_name(self.distribution.get_name()) + + def tagged_version(self): + version = self.distribution.get_version() + # egg_info may be called more than once for a distribution, + # in which case the version string already contains all tags. + if self.vtags and version.endswith(self.vtags): + return safe_version(version) + return safe_version(version + self.vtags) + + def tags(self): + version = '' + if self.tag_build: + version += self.tag_build + if self.tag_date: + version += time.strftime("-%Y%m%d") + return version + vtags = property(tags) + + +class egg_info(InfoCommon, Command): + description = "create a distribution's .egg-info directory" + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), + ('tag-build=', 'b', "Specify explicit tag to add to version number"), + ('no-date', 'D', "Don't include date stamp [default]"), + ] + + boolean_options = ['tag-date'] + negative_opt = { + 'no-date': 'tag-date', + } + + def initialize_options(self): + self.egg_base = None + self.egg_name = None + self.egg_info = None + self.egg_version = None + self.broken_egg_info = False + + #################################### + # allow the 'tag_svn_revision' to be detected and + # set, supporting sdists built on older Setuptools. + @property + def tag_svn_revision(self): + pass + + @tag_svn_revision.setter + def tag_svn_revision(self, value): + pass + #################################### + + def save_version_info(self, filename): + """ + Materialize the value of date into the + build tag. Install build keys in a deterministic order + to avoid arbitrary reordering on subsequent builds. + """ + egg_info = collections.OrderedDict() + # follow the order these keys would have been added + # when PYTHONHASHSEED=0 + egg_info['tag_build'] = self.tags() + egg_info['tag_date'] = 0 + edit_config(filename, dict(egg_info=egg_info)) + + def finalize_options(self): + # Note: we need to capture the current value returned + # by `self.tagged_version()`, so we can later update + # `self.distribution.metadata.version` without + # repercussions. + self.egg_name = self.name + self.egg_version = self.tagged_version() + parsed_version = parse_version(self.egg_version) + + try: + is_version = isinstance(parsed_version, packaging.version.Version) + spec = ( + "%s==%s" if is_version else "%s===%s" + ) + list( + parse_requirements(spec % (self.egg_name, self.egg_version)) + ) + except ValueError: + raise distutils.errors.DistutilsOptionError( + "Invalid distribution name or version syntax: %s-%s" % + (self.egg_name, self.egg_version) + ) + + if self.egg_base is None: + dirs = self.distribution.package_dir + self.egg_base = (dirs or {}).get('', os.curdir) + + self.ensure_dirname('egg_base') + self.egg_info = to_filename(self.egg_name) + '.egg-info' + if self.egg_base != os.curdir: + self.egg_info = os.path.join(self.egg_base, self.egg_info) + if '-' in self.egg_name: + self.check_broken_egg_info() + + # Set package version for the benefit of dumber commands + # (e.g. sdist, bdist_wininst, etc.) + # + self.distribution.metadata.version = self.egg_version + + # If we bootstrapped around the lack of a PKG-INFO, as might be the + # case in a fresh checkout, make sure that any special tags get added + # to the version info + # + pd = self.distribution._patched_dist + if pd is not None and pd.key == self.egg_name.lower(): + pd._version = self.egg_version + pd._parsed_version = parse_version(self.egg_version) + self.distribution._patched_dist = None + + def write_or_delete_file(self, what, filename, data, force=False): + """Write `data` to `filename` or delete if empty + + If `data` is non-empty, this routine is the same as ``write_file()``. + If `data` is empty but not ``None``, this is the same as calling + ``delete_file(filename)`. If `data` is ``None``, then this is a no-op + unless `filename` exists, in which case a warning is issued about the + orphaned file (if `force` is false), or deleted (if `force` is true). + """ + if data: + self.write_file(what, filename, data) + elif os.path.exists(filename): + if data is None and not force: + log.warn( + "%s not set in setup(), but %s exists", what, filename + ) + return + else: + self.delete_file(filename) + + def write_file(self, what, filename, data): + """Write `data` to `filename` (if not a dry run) after announcing it + + `what` is used in a log message to identify what is being written + to the file. + """ + log.info("writing %s to %s", what, filename) + if six.PY3: + data = data.encode("utf-8") + if not self.dry_run: + f = open(filename, 'wb') + f.write(data) + f.close() + + def delete_file(self, filename): + """Delete `filename` (if not a dry run) after announcing it""" + log.info("deleting %s", filename) + if not self.dry_run: + os.unlink(filename) + + def run(self): + self.mkpath(self.egg_info) + os.utime(self.egg_info, None) + installer = self.distribution.fetch_build_egg + for ep in iter_entry_points('egg_info.writers'): + ep.require(installer=installer) + writer = ep.resolve() + writer(self, ep.name, os.path.join(self.egg_info, ep.name)) + + # Get rid of native_libs.txt if it was put there by older bdist_egg + nl = os.path.join(self.egg_info, "native_libs.txt") + if os.path.exists(nl): + self.delete_file(nl) + + self.find_sources() + + def find_sources(self): + """Generate SOURCES.txt manifest file""" + manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") + mm = manifest_maker(self.distribution) + mm.manifest = manifest_filename + mm.run() + self.filelist = mm.filelist + + def check_broken_egg_info(self): + bei = self.egg_name + '.egg-info' + if self.egg_base != os.curdir: + bei = os.path.join(self.egg_base, bei) + if os.path.exists(bei): + log.warn( + "-" * 78 + '\n' + "Note: Your current .egg-info directory has a '-' in its name;" + '\nthis will not work correctly with "setup.py develop".\n\n' + 'Please rename %s to %s to correct this problem.\n' + '-' * 78, + bei, self.egg_info + ) + self.broken_egg_info = self.egg_info + self.egg_info = bei # make it work for now + + +class FileList(_FileList): + # Implementations of the various MANIFEST.in commands + + def process_template_line(self, line): + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dir_pattern). + (action, patterns, dir, dir_pattern) = self._parse_template_line(line) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + self.debug_print("include " + ' '.join(patterns)) + for pattern in patterns: + if not self.include(pattern): + log.warn("warning: no files found matching '%s'", pattern) + + elif action == 'exclude': + self.debug_print("exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.exclude(pattern): + log.warn(("warning: no previously-included files " + "found matching '%s'"), pattern) + + elif action == 'global-include': + self.debug_print("global-include " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_include(pattern): + log.warn(("warning: no files found matching '%s' " + "anywhere in distribution"), pattern) + + elif action == 'global-exclude': + self.debug_print("global-exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_exclude(pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found anywhere in distribution"), + pattern) + + elif action == 'recursive-include': + self.debug_print("recursive-include %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_include(dir, pattern): + log.warn(("warning: no files found matching '%s' " + "under directory '%s'"), + pattern, dir) + + elif action == 'recursive-exclude': + self.debug_print("recursive-exclude %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_exclude(dir, pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found under directory '%s'"), + pattern, dir) + + elif action == 'graft': + self.debug_print("graft " + dir_pattern) + if not self.graft(dir_pattern): + log.warn("warning: no directories found matching '%s'", + dir_pattern) + + elif action == 'prune': + self.debug_print("prune " + dir_pattern) + if not self.prune(dir_pattern): + log.warn(("no previously-included directories found " + "matching '%s'"), dir_pattern) + + else: + raise DistutilsInternalError( + "this cannot happen: invalid action '%s'" % action) + + def _remove_files(self, predicate): + """ + Remove all files from the file list that match the predicate. + Return True if any matching files were removed + """ + found = False + for i in range(len(self.files) - 1, -1, -1): + if predicate(self.files[i]): + self.debug_print(" removing " + self.files[i]) + del self.files[i] + found = True + return found + + def include(self, pattern): + """Include files that match 'pattern'.""" + found = [f for f in glob(pattern) if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def exclude(self, pattern): + """Exclude files that match 'pattern'.""" + match = translate_pattern(pattern) + return self._remove_files(match.match) + + def recursive_include(self, dir, pattern): + """ + Include all files anywhere in 'dir/' that match the pattern. + """ + full_pattern = os.path.join(dir, '**', pattern) + found = [f for f in glob(full_pattern, recursive=True) + if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def recursive_exclude(self, dir, pattern): + """ + Exclude any file anywhere in 'dir/' that match the pattern. + """ + match = translate_pattern(os.path.join(dir, '**', pattern)) + return self._remove_files(match.match) + + def graft(self, dir): + """Include all files from 'dir/'.""" + found = [ + item + for match_dir in glob(dir) + for item in distutils.filelist.findall(match_dir) + ] + self.extend(found) + return bool(found) + + def prune(self, dir): + """Filter out files from 'dir/'.""" + match = translate_pattern(os.path.join(dir, '**')) + return self._remove_files(match.match) + + def global_include(self, pattern): + """ + Include all files anywhere in the current directory that match the + pattern. This is very inefficient on large file trees. + """ + if self.allfiles is None: + self.findall() + match = translate_pattern(os.path.join('**', pattern)) + found = [f for f in self.allfiles if match.match(f)] + self.extend(found) + return bool(found) + + def global_exclude(self, pattern): + """ + Exclude all files anywhere that match the pattern. + """ + match = translate_pattern(os.path.join('**', pattern)) + return self._remove_files(match.match) + + def append(self, item): + if item.endswith('\r'): # Fix older sdists built on Windows + item = item[:-1] + path = convert_path(item) + + if self._safe_path(path): + self.files.append(path) + + def extend(self, paths): + self.files.extend(filter(self._safe_path, paths)) + + def _repair(self): + """ + Replace self.files with only safe paths + + Because some owners of FileList manipulate the underlying + ``files`` attribute directly, this method must be called to + repair those paths. + """ + self.files = list(filter(self._safe_path, self.files)) + + def _safe_path(self, path): + enc_warn = "'%s' not %s encodable -- skipping" + + # To avoid accidental trans-codings errors, first to unicode + u_path = unicode_utils.filesys_decode(path) + if u_path is None: + log.warn("'%s' in unexpected encoding -- skipping" % path) + return False + + # Must ensure utf-8 encodability + utf8_path = unicode_utils.try_encode(u_path, "utf-8") + if utf8_path is None: + log.warn(enc_warn, path, 'utf-8') + return False + + try: + # accept is either way checks out + if os.path.exists(u_path) or os.path.exists(utf8_path): + return True + # this will catch any encode errors decoding u_path + except UnicodeEncodeError: + log.warn(enc_warn, path, sys.getfilesystemencoding()) + + +class manifest_maker(sdist): + template = "MANIFEST.in" + + def initialize_options(self): + self.use_defaults = 1 + self.prune = 1 + self.manifest_only = 1 + self.force_manifest = 1 + + def finalize_options(self): + pass + + def run(self): + self.filelist = FileList() + if not os.path.exists(self.manifest): + self.write_manifest() # it must exist so it'll get in the list + self.add_defaults() + if os.path.exists(self.template): + self.read_template() + self.prune_file_list() + self.filelist.sort() + self.filelist.remove_duplicates() + self.write_manifest() + + def _manifest_normalize(self, path): + path = unicode_utils.filesys_decode(path) + return path.replace(os.sep, '/') + + def write_manifest(self): + """ + Write the file list in 'self.filelist' to the manifest file + named by 'self.manifest'. + """ + self.filelist._repair() + + # Now _repairs should encodability, but not unicode + files = [self._manifest_normalize(f) for f in self.filelist.files] + msg = "writing manifest file '%s'" % self.manifest + self.execute(write_file, (self.manifest, files), msg) + + def warn(self, msg): + if not self._should_suppress_warning(msg): + sdist.warn(self, msg) + + @staticmethod + def _should_suppress_warning(msg): + """ + suppress missing-file warnings from sdist + """ + return re.match(r"standard file .*not found", msg) + + def add_defaults(self): + sdist.add_defaults(self) + self.check_license() + self.filelist.append(self.template) + self.filelist.append(self.manifest) + rcfiles = list(walk_revctrl()) + if rcfiles: + self.filelist.extend(rcfiles) + elif os.path.exists(self.manifest): + self.read_manifest() + + if os.path.exists("setup.py"): + # setup.py should be included by default, even if it's not + # the script called to create the sdist + self.filelist.append("setup.py") + + ei_cmd = self.get_finalized_command('egg_info') + self.filelist.graft(ei_cmd.egg_info) + + def prune_file_list(self): + build = self.get_finalized_command('build') + base_dir = self.distribution.get_fullname() + self.filelist.prune(build.build_base) + self.filelist.prune(base_dir) + sep = re.escape(os.sep) + self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, + is_regex=1) + + +def write_file(filename, contents): + """Create a file with the specified name and write 'contents' (a + sequence of strings without line terminators) to it. + """ + contents = "\n".join(contents) + + # assuming the contents has been vetted for utf-8 encoding + contents = contents.encode("utf-8") + + with open(filename, "wb") as f: # always write POSIX-style manifest + f.write(contents) + + +def write_pkg_info(cmd, basename, filename): + log.info("writing %s", filename) + if not cmd.dry_run: + metadata = cmd.distribution.metadata + metadata.version, oldver = cmd.egg_version, metadata.version + metadata.name, oldname = cmd.egg_name, metadata.name + + try: + # write unescaped data to PKG-INFO, so older pkg_resources + # can still parse it + metadata.write_pkg_info(cmd.egg_info) + finally: + metadata.name, metadata.version = oldname, oldver + + safe = getattr(cmd.distribution, 'zip_safe', None) + + bdist_egg.write_safety_flag(cmd.egg_info, safe) + + +def warn_depends_obsolete(cmd, basename, filename): + if os.path.exists(filename): + log.warn( + "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + +def _write_requirements(stream, reqs): + lines = yield_lines(reqs or ()) + append_cr = lambda line: line + '\n' + lines = map(append_cr, lines) + stream.writelines(lines) + + +def write_requirements(cmd, basename, filename): + dist = cmd.distribution + data = six.StringIO() + _write_requirements(data, dist.install_requires) + extras_require = dist.extras_require or {} + for extra in sorted(extras_require): + data.write('\n[{extra}]\n'.format(**vars())) + _write_requirements(data, extras_require[extra]) + cmd.write_or_delete_file("requirements", filename, data.getvalue()) + + +def write_setup_requirements(cmd, basename, filename): + data = io.StringIO() + _write_requirements(data, cmd.distribution.setup_requires) + cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) + + +def write_toplevel_names(cmd, basename, filename): + pkgs = dict.fromkeys( + [ + k.split('.', 1)[0] + for k in cmd.distribution.iter_distribution_names() + ] + ) + cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') + + +def overwrite_arg(cmd, basename, filename): + write_arg(cmd, basename, filename, True) + + +def write_arg(cmd, basename, filename, force=False): + argname = os.path.splitext(basename)[0] + value = getattr(cmd.distribution, argname, None) + if value is not None: + value = '\n'.join(value) + '\n' + cmd.write_or_delete_file(argname, filename, value, force) + + +def write_entries(cmd, basename, filename): + ep = cmd.distribution.entry_points + + if isinstance(ep, six.string_types) or ep is None: + data = ep + elif ep is not None: + data = [] + for section, contents in sorted(ep.items()): + if not isinstance(contents, six.string_types): + contents = EntryPoint.parse_group(section, contents) + contents = '\n'.join(sorted(map(str, contents.values()))) + data.append('[%s]\n%s\n\n' % (section, contents)) + data = ''.join(data) + + cmd.write_or_delete_file('entry points', filename, data, True) + + +def get_pkg_info_revision(): + """ + Get a -r### off of PKG-INFO Version in case this is an sdist of + a subversion revision. + """ + warnings.warn("get_pkg_info_revision is deprecated.", EggInfoDeprecationWarning) + if os.path.exists('PKG-INFO'): + with io.open('PKG-INFO') as f: + for line in f: + match = re.match(r"Version:.*-r(\d+)\s*$", line) + if match: + return int(match.group(1)) + return 0 + + +class EggInfoDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in eggInfo in setupTools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install.py new file mode 100644 index 0000000..31a5ddb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install.py @@ -0,0 +1,125 @@ +from distutils.errors import DistutilsArgError +import inspect +import glob +import warnings +import platform +import distutils.command.install as orig + +import setuptools + +# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for +# now. See https://github.com/pypa/setuptools/issues/199/ +_install = orig.install + + +class install(orig.install): + """Use easy_install to install the package, w/dependencies""" + + user_options = orig.install.user_options + [ + ('old-and-unmanageable', None, "Try not to use this!"), + ('single-version-externally-managed', None, + "used by system package builders to create 'flat' eggs"), + ] + boolean_options = orig.install.boolean_options + [ + 'old-and-unmanageable', 'single-version-externally-managed', + ] + new_commands = [ + ('install_egg_info', lambda self: True), + ('install_scripts', lambda self: True), + ] + _nc = dict(new_commands) + + def initialize_options(self): + orig.install.initialize_options(self) + self.old_and_unmanageable = None + self.single_version_externally_managed = None + + def finalize_options(self): + orig.install.finalize_options(self) + if self.root: + self.single_version_externally_managed = True + elif self.single_version_externally_managed: + if not self.root and not self.record: + raise DistutilsArgError( + "You must specify --record or --root when building system" + " packages" + ) + + def handle_extra_path(self): + if self.root or self.single_version_externally_managed: + # explicit backward-compatibility mode, allow extra_path to work + return orig.install.handle_extra_path(self) + + # Ignore extra_path when installing an egg (or being run by another + # command without --root or --single-version-externally-managed + self.path_file = None + self.extra_dirs = '' + + def run(self): + # Explicit request for old-style install? Just do it + if self.old_and_unmanageable or self.single_version_externally_managed: + return orig.install.run(self) + + if not self._called_from_setup(inspect.currentframe()): + # Run in backward-compatibility mode to support bdist_* commands. + orig.install.run(self) + else: + self.do_egg_install() + + @staticmethod + def _called_from_setup(run_frame): + """ + Attempt to detect whether run() was called from setup() or by another + command. If called by setup(), the parent caller will be the + 'run_command' method in 'distutils.dist', and *its* caller will be + the 'run_commands' method. If called any other way, the + immediate caller *might* be 'run_command', but it won't have been + called by 'run_commands'. Return True in that case or if a call stack + is unavailable. Return False otherwise. + """ + if run_frame is None: + msg = "Call stack not available. bdist_* commands may fail." + warnings.warn(msg) + if platform.python_implementation() == 'IronPython': + msg = "For best results, pass -X:Frames to enable call stack." + warnings.warn(msg) + return True + res = inspect.getouterframes(run_frame)[2] + caller, = res[:1] + info = inspect.getframeinfo(caller) + caller_module = caller.f_globals.get('__name__', '') + return ( + caller_module == 'distutils.dist' + and info.function == 'run_commands' + ) + + def do_egg_install(self): + + easy_install = self.distribution.get_command_class('easy_install') + + cmd = easy_install( + self.distribution, args="x", root=self.root, record=self.record, + ) + cmd.ensure_finalized() # finalize before bdist_egg munges install cmd + cmd.always_copy_from = '.' # make sure local-dir eggs get installed + + # pick up setup-dir .egg files only: no .egg-info + cmd.package_index.scan(glob.glob('*.egg')) + + self.run_command('bdist_egg') + args = [self.distribution.get_command_obj('bdist_egg').egg_output] + + if setuptools.bootstrap_install_from: + # Bootstrap self-installation of setuptools + args.insert(0, setuptools.bootstrap_install_from) + + cmd.args = args + cmd.run() + setuptools.bootstrap_install_from = None + + +# XXX Python 3.1 doesn't see _nc if this is inside the class +install.sub_commands = ( + [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + + install.new_commands +) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py new file mode 100644 index 0000000..edc4718 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py @@ -0,0 +1,62 @@ +from distutils import log, dir_util +import os + +from setuptools import Command +from setuptools import namespaces +from setuptools.archive_util import unpack_archive +import pkg_resources + + +class install_egg_info(namespaces.Installer, Command): + """Install an .egg-info directory for the package""" + + description = "Install an .egg-info directory for the package" + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ] + + def initialize_options(self): + self.install_dir = None + + def finalize_options(self): + self.set_undefined_options('install_lib', + ('install_dir', 'install_dir')) + ei_cmd = self.get_finalized_command("egg_info") + basename = pkg_resources.Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version + ).egg_name() + '.egg-info' + self.source = ei_cmd.egg_info + self.target = os.path.join(self.install_dir, basename) + self.outputs = [] + + def run(self): + self.run_command('egg_info') + if os.path.isdir(self.target) and not os.path.islink(self.target): + dir_util.remove_tree(self.target, dry_run=self.dry_run) + elif os.path.exists(self.target): + self.execute(os.unlink, (self.target,), "Removing " + self.target) + if not self.dry_run: + pkg_resources.ensure_directory(self.target) + self.execute( + self.copytree, (), "Copying %s to %s" % (self.source, self.target) + ) + self.install_namespaces() + + def get_outputs(self): + return self.outputs + + def copytree(self): + # Copy the .egg-info tree to site-packages + def skimmer(src, dst): + # filter out source-control directories; note that 'src' is always + # a '/'-separated path, regardless of platform. 'dst' is a + # platform-specific path. + for skip in '.svn/', 'CVS/': + if src.startswith(skip) or '/' + skip in src: + return None + self.outputs.append(dst) + log.debug("Copying %s to %s", src, dst) + return dst + + unpack_archive(self.source, self.target, skimmer) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py new file mode 100644 index 0000000..2b31c3e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_lib.py @@ -0,0 +1,121 @@ +import os +import imp +from itertools import product, starmap +import distutils.command.install_lib as orig + + +class install_lib(orig.install_lib): + """Don't add compiled flags to filenames of non-Python files""" + + def run(self): + self.build() + outfiles = self.install() + if outfiles is not None: + # always compile, in case we have any extension stubs to deal with + self.byte_compile(outfiles) + + def get_exclusions(self): + """ + Return a collections.Sized collections.Container of paths to be + excluded for single_version_externally_managed installations. + """ + all_packages = ( + pkg + for ns_pkg in self._get_SVEM_NSPs() + for pkg in self._all_packages(ns_pkg) + ) + + excl_specs = product(all_packages, self._gen_exclusion_paths()) + return set(starmap(self._exclude_pkg_path, excl_specs)) + + def _exclude_pkg_path(self, pkg, exclusion_path): + """ + Given a package name and exclusion path within that package, + compute the full exclusion path. + """ + parts = pkg.split('.') + [exclusion_path] + return os.path.join(self.install_dir, *parts) + + @staticmethod + def _all_packages(pkg_name): + """ + >>> list(install_lib._all_packages('foo.bar.baz')) + ['foo.bar.baz', 'foo.bar', 'foo'] + """ + while pkg_name: + yield pkg_name + pkg_name, sep, child = pkg_name.rpartition('.') + + def _get_SVEM_NSPs(self): + """ + Get namespace packages (list) but only for + single_version_externally_managed installations and empty otherwise. + """ + # TODO: is it necessary to short-circuit here? i.e. what's the cost + # if get_finalized_command is called even when namespace_packages is + # False? + if not self.distribution.namespace_packages: + return [] + + install_cmd = self.get_finalized_command('install') + svem = install_cmd.single_version_externally_managed + + return self.distribution.namespace_packages if svem else [] + + @staticmethod + def _gen_exclusion_paths(): + """ + Generate file paths to be excluded for namespace packages (bytecode + cache files). + """ + # always exclude the package module itself + yield '__init__.py' + + yield '__init__.pyc' + yield '__init__.pyo' + + if not hasattr(imp, 'get_tag'): + return + + base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) + yield base + '.pyc' + yield base + '.pyo' + yield base + '.opt-1.pyc' + yield base + '.opt-2.pyc' + + def copy_tree( + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + ): + assert preserve_mode and preserve_times and not preserve_symlinks + exclude = self.get_exclusions() + + if not exclude: + return orig.install_lib.copy_tree(self, infile, outfile) + + # Exclude namespace package __init__.py* files from the output + + from setuptools.archive_util import unpack_directory + from distutils import log + + outfiles = [] + + def pf(src, dst): + if dst in exclude: + log.warn("Skipping installation of %s (namespace package)", + dst) + return False + + log.info("copying %s -> %s", src, os.path.dirname(dst)) + outfiles.append(dst) + return dst + + unpack_directory(infile, outfile, pf) + return outfiles + + def get_outputs(self): + outputs = orig.install_lib.get_outputs(self) + exclude = self.get_exclusions() + if exclude: + return [f for f in outputs if f not in exclude] + return outputs diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py new file mode 100644 index 0000000..1623427 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/install_scripts.py @@ -0,0 +1,65 @@ +from distutils import log +import distutils.command.install_scripts as orig +import os +import sys + +from pkg_resources import Distribution, PathMetadata, ensure_directory + + +class install_scripts(orig.install_scripts): + """Do normal script install, plus any egg_info wrapper scripts""" + + def initialize_options(self): + orig.install_scripts.initialize_options(self) + self.no_ep = False + + def run(self): + import setuptools.command.easy_install as ei + + self.run_command("egg_info") + if self.distribution.scripts: + orig.install_scripts.run(self) # run first to set up self.outfiles + else: + self.outfiles = [] + if self.no_ep: + # don't install entry point scripts into .egg file! + return + + ei_cmd = self.get_finalized_command("egg_info") + dist = Distribution( + ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), + ei_cmd.egg_name, ei_cmd.egg_version, + ) + bs_cmd = self.get_finalized_command('build_scripts') + exec_param = getattr(bs_cmd, 'executable', None) + bw_cmd = self.get_finalized_command("bdist_wininst") + is_wininst = getattr(bw_cmd, '_is_running', False) + writer = ei.ScriptWriter + if is_wininst: + exec_param = "python.exe" + writer = ei.WindowsScriptWriter + if exec_param == sys.executable: + # In case the path to the Python executable contains a space, wrap + # it so it's not split up. + exec_param = [exec_param] + # resolve the writer to the environment + writer = writer.best() + cmd = writer.command_spec_class.best().from_param(exec_param) + for args in writer.get_args(dist, cmd.as_header()): + self.write_script(*args) + + def write_script(self, script_name, contents, mode="t", *ignored): + """Write an executable file to the scripts directory""" + from setuptools.command.easy_install import chmod, current_umask + + log.info("Installing %s script to %s", script_name, self.install_dir) + target = os.path.join(self.install_dir, script_name) + self.outfiles.append(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + f = open(target, "w" + mode) + f.write(contents) + f.close() + chmod(target, 0o777 - mask) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml new file mode 100644 index 0000000..5972a96 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%(name)s" + type="win32"/> + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly> diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py new file mode 100644 index 0000000..61063e7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/py36compat.py @@ -0,0 +1,136 @@ +import os +from glob import glob +from distutils.util import convert_path +from distutils.command import sdist + +from setuptools.extern.six.moves import filter + + +class sdist_add_defaults: + """ + Mix-in providing forward-compatibility for functionality as found in + distutils on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. Instead, override in the subclass. + """ + + def add_defaults(self): + """Add all the default files to self.filelist: + - README or README.txt + - setup.py + - test/test*.py + - all pure Python modules mentioned in setup script + - all files pointed by package_data (build_py) + - all files defined in data_files. + - all files defined as scripts. + - all C sources listed as part of extensions or C libraries + in the setup script (doesn't catch C headers!) + Warns if (README or README.txt) or setup.py are missing; everything + else is optional. + """ + self._add_defaults_standards() + self._add_defaults_optional() + self._add_defaults_python() + self._add_defaults_data_files() + self._add_defaults_ext() + self._add_defaults_c_libs() + self._add_defaults_scripts() + + @staticmethod + def _cs_path_exists(fspath): + """ + Case-sensitive path existence check + + >>> sdist_add_defaults._cs_path_exists(__file__) + True + >>> sdist_add_defaults._cs_path_exists(__file__.upper()) + False + """ + if not os.path.exists(fspath): + return False + # make absolute so we always have a directory + abspath = os.path.abspath(fspath) + directory, filename = os.path.split(abspath) + return filename in os.listdir(directory) + + def _add_defaults_standards(self): + standards = [self.READMES, self.distribution.script_name] + for fn in standards: + if isinstance(fn, tuple): + alts = fn + got_it = False + for fn in alts: + if self._cs_path_exists(fn): + got_it = True + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + ', '.join(alts)) + else: + if self._cs_path_exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + def _add_defaults_optional(self): + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = filter(os.path.isfile, glob(pattern)) + self.filelist.extend(files) + + def _add_defaults_python(self): + # build_py is used to get: + # - python modules + # - files defined in package_data + build_py = self.get_finalized_command('build_py') + + # getting python files + if self.distribution.has_pure_modules(): + self.filelist.extend(build_py.get_source_files()) + + # getting package_data files + # (computed in build_py.data_files by build_py.finalize_options) + for pkg, src_dir, build_dir, filenames in build_py.data_files: + for filename in filenames: + self.filelist.append(os.path.join(src_dir, filename)) + + def _add_defaults_data_files(self): + # getting distribution.data_files + if self.distribution.has_data_files(): + for item in self.distribution.data_files: + if isinstance(item, str): + # plain file + item = convert_path(item) + if os.path.isfile(item): + self.filelist.append(item) + else: + # a (dirname, filenames) tuple + dirname, filenames = item + for f in filenames: + f = convert_path(f) + if os.path.isfile(f): + self.filelist.append(f) + + def _add_defaults_ext(self): + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + def _add_defaults_c_libs(self): + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + def _add_defaults_scripts(self): + if self.distribution.has_scripts(): + build_scripts = self.get_finalized_command('build_scripts') + self.filelist.extend(build_scripts.get_source_files()) + + +if hasattr(sdist.sdist, '_add_defaults_standards'): + # disable the functionality already available upstream + class sdist_add_defaults: + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/register.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/register.py new file mode 100644 index 0000000..98bc015 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/register.py @@ -0,0 +1,18 @@ +from distutils import log +import distutils.command.register as orig + + +class register(orig.register): + __doc__ = orig.register.__doc__ + + def run(self): + try: + # Make sure that we are using valid current name/version info + self.run_command('egg_info') + orig.register.run(self) + finally: + self.announce( + "WARNING: Registering is deprecated, use twine to " + "upload instead (https://pypi.org/p/twine/)", + log.WARN + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/rotate.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/rotate.py new file mode 100644 index 0000000..b89353f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/rotate.py @@ -0,0 +1,66 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import shutil + +from setuptools.extern import six + +from setuptools import Command + + +class rotate(Command): + """Delete older distributions""" + + description = "delete older distributions, keeping N newest files" + user_options = [ + ('match=', 'm', "patterns to match (required)"), + ('dist-dir=', 'd', "directory where the distributions are"), + ('keep=', 'k', "number of matching distributions to keep"), + ] + + boolean_options = [] + + def initialize_options(self): + self.match = None + self.dist_dir = None + self.keep = None + + def finalize_options(self): + if self.match is None: + raise DistutilsOptionError( + "Must specify one or more (comma-separated) match patterns " + "(e.g. '.zip' or '.egg')" + ) + if self.keep is None: + raise DistutilsOptionError("Must specify number of files to keep") + try: + self.keep = int(self.keep) + except ValueError: + raise DistutilsOptionError("--keep must be an integer") + if isinstance(self.match, six.string_types): + self.match = [ + convert_path(p.strip()) for p in self.match.split(',') + ] + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + def run(self): + self.run_command("egg_info") + from glob import glob + + for pattern in self.match: + pattern = self.distribution.get_name() + '*' + pattern + files = glob(os.path.join(self.dist_dir, pattern)) + files = [(os.path.getmtime(f), f) for f in files] + files.sort() + files.reverse() + + log.info("%d file(s) matching %s", len(files), pattern) + files = files[self.keep:] + for (t, f) in files: + log.info("Deleting %s", f) + if not self.dry_run: + if os.path.isdir(f): + shutil.rmtree(f) + else: + os.unlink(f) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py new file mode 100644 index 0000000..611cec5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/saveopts.py @@ -0,0 +1,22 @@ +from setuptools.command.setopt import edit_config, option_base + + +class saveopts(option_base): + """Save command-line options to a file""" + + description = "save supplied options to setup.cfg or other config file" + + def run(self): + dist = self.distribution + settings = {} + + for cmd in dist.command_options: + + if cmd == 'saveopts': + continue # don't save our own options! + + for opt, (src, val) in dist.get_option_dict(cmd).items(): + if src == "command line": + settings.setdefault(cmd, {})[opt] = val + + edit_config(self.filename, settings, self.dry_run) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/sdist.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/sdist.py new file mode 100644 index 0000000..dc25398 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/sdist.py @@ -0,0 +1,221 @@ +from distutils import log +import distutils.command.sdist as orig +import os +import sys +import io +import contextlib + +from setuptools.extern import six + +from .py36compat import sdist_add_defaults + +import pkg_resources + +_default_revctrl = list + + +def walk_revctrl(dirname=''): + """Find all files under revision control""" + for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): + for item in ep.load()(dirname): + yield item + + +class sdist(sdist_add_defaults, orig.sdist): + """Smart sdist that finds anything supported by revision control""" + + user_options = [ + ('formats=', None, + "formats for source distribution (comma-separated list)"), + ('keep-temp', 'k', + "keep the distribution tree around after creating " + + "archive file(s)"), + ('dist-dir=', 'd', + "directory to put the source distribution archive(s) in " + "[default: dist]"), + ] + + negative_opt = {} + + README_EXTENSIONS = ['', '.rst', '.txt', '.md'] + READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) + + def run(self): + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + self.filelist = ei_cmd.filelist + self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) + self.check_readme() + + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + self.make_distribution() + + dist_files = getattr(self.distribution, 'dist_files', []) + for file in self.archive_files: + data = ('sdist', '', file) + if data not in dist_files: + dist_files.append(data) + + def initialize_options(self): + orig.sdist.initialize_options(self) + + self._default_to_gztar() + + def _default_to_gztar(self): + # only needed on Python prior to 3.6. + if sys.version_info >= (3, 6, 0, 'beta', 1): + return + self.formats = ['gztar'] + + def make_distribution(self): + """ + Workaround for #516 + """ + with self._remove_os_link(): + orig.sdist.make_distribution(self) + + @staticmethod + @contextlib.contextmanager + def _remove_os_link(): + """ + In a context, remove and restore os.link if it exists + """ + + class NoValue: + pass + + orig_val = getattr(os, 'link', NoValue) + try: + del os.link + except Exception: + pass + try: + yield + finally: + if orig_val is not NoValue: + setattr(os, 'link', orig_val) + + def __read_template_hack(self): + # This grody hack closes the template file (MANIFEST.in) if an + # exception occurs during read_template. + # Doing so prevents an error when easy_install attempts to delete the + # file. + try: + orig.sdist.read_template(self) + except Exception: + _, _, tb = sys.exc_info() + tb.tb_next.tb_frame.f_locals['template'].close() + raise + + # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle + # has been fixed, so only override the method if we're using an earlier + # Python. + has_leaky_handle = ( + sys.version_info < (2, 7, 2) + or (3, 0) <= sys.version_info < (3, 1, 4) + or (3, 2) <= sys.version_info < (3, 2, 1) + ) + if has_leaky_handle: + read_template = __read_template_hack + + def _add_defaults_python(self): + """getting python files""" + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + self.filelist.extend(build_py.get_source_files()) + # This functionality is incompatible with include_package_data, and + # will in fact create an infinite recursion if include_package_data + # is True. Use of include_package_data will imply that + # distutils-style automatic handling of package_data is disabled + if not self.distribution.include_package_data: + for _, src_dir, _, filenames in build_py.data_files: + self.filelist.extend([os.path.join(src_dir, filename) + for filename in filenames]) + + def _add_defaults_data_files(self): + try: + if six.PY2: + sdist_add_defaults._add_defaults_data_files(self) + else: + super()._add_defaults_data_files() + except TypeError: + log.warn("data_files contains unexpected objects") + + def check_readme(self): + for f in self.READMES: + if os.path.exists(f): + return + else: + self.warn( + "standard file not found: should have one of " + + ', '.join(self.READMES) + ) + + def make_release_tree(self, base_dir, files): + orig.sdist.make_release_tree(self, base_dir, files) + + # Save any egg_info command line options used to create this sdist + dest = os.path.join(base_dir, 'setup.cfg') + if hasattr(os, 'link') and os.path.exists(dest): + # unlink and re-copy, since it might be hard-linked, and + # we don't want to change the source version + os.unlink(dest) + self.copy_file('setup.cfg', dest) + + self.get_finalized_command('egg_info').save_version_info(dest) + + def _manifest_is_not_generated(self): + # check for special comment used in 2.7.1 and higher + if not os.path.isfile(self.manifest): + return False + + with io.open(self.manifest, 'rb') as fp: + first_line = fp.readline() + return (first_line != + '# file GENERATED by distutils, do NOT edit\n'.encode()) + + def read_manifest(self): + """Read the manifest file (named by 'self.manifest') and use it to + fill in 'self.filelist', the list of files to include in the source + distribution. + """ + log.info("reading manifest file '%s'", self.manifest) + manifest = open(self.manifest, 'rb') + for line in manifest: + # The manifest must contain UTF-8. See #303. + if six.PY3: + try: + line = line.decode('UTF-8') + except UnicodeDecodeError: + log.warn("%r not UTF-8 decodable -- skipping" % line) + continue + # ignore comments and blank lines + line = line.strip() + if line.startswith('#') or not line: + continue + self.filelist.append(line) + manifest.close() + + def check_license(self): + """Checks if license_file' is configured and adds it to + 'self.filelist' if the value contains a valid path. + """ + + opts = self.distribution.get_option_dict('metadata') + + # ignore the source of the value + _, license_file = opts.get('license_file', (None, None)) + + if license_file is None: + log.debug("'license_file' option was not specified") + return + + if not os.path.exists(license_file): + log.warn("warning: Failed to find the configured license file '%s'", + license_file) + return + + self.filelist.append(license_file) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/setopt.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/setopt.py new file mode 100644 index 0000000..7e57cc0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/setopt.py @@ -0,0 +1,149 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import distutils +import os + +from setuptools.extern.six.moves import configparser + +from setuptools import Command + +__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] + + +def config_file(kind="local"): + """Get the filename of the distutils, local, global, or per-user config + + `kind` must be one of "local", "global", or "user" + """ + if kind == 'local': + return 'setup.cfg' + if kind == 'global': + return os.path.join( + os.path.dirname(distutils.__file__), 'distutils.cfg' + ) + if kind == 'user': + dot = os.name == 'posix' and '.' or '' + return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) + raise ValueError( + "config_file() type must be 'local', 'global', or 'user'", kind + ) + + +def edit_config(filename, settings, dry_run=False): + """Edit a configuration file to include `settings` + + `settings` is a dictionary of dictionaries or ``None`` values, keyed by + command/section name. A ``None`` value means to delete the entire section, + while a dictionary lists settings to be changed or deleted in that section. + A setting of ``None`` means to delete that setting. + """ + log.debug("Reading configuration from %s", filename) + opts = configparser.RawConfigParser() + opts.read([filename]) + for section, options in settings.items(): + if options is None: + log.info("Deleting section [%s] from %s", section, filename) + opts.remove_section(section) + else: + if not opts.has_section(section): + log.debug("Adding new section [%s] to %s", section, filename) + opts.add_section(section) + for option, value in options.items(): + if value is None: + log.debug( + "Deleting %s.%s from %s", + section, option, filename + ) + opts.remove_option(section, option) + if not opts.options(section): + log.info("Deleting empty [%s] section from %s", + section, filename) + opts.remove_section(section) + else: + log.debug( + "Setting %s.%s to %r in %s", + section, option, value, filename + ) + opts.set(section, option, value) + + log.info("Writing %s", filename) + if not dry_run: + with open(filename, 'w') as f: + opts.write(f) + + +class option_base(Command): + """Abstract base class for commands that mess with config files""" + + user_options = [ + ('global-config', 'g', + "save options to the site-wide distutils.cfg file"), + ('user-config', 'u', + "save options to the current user's pydistutils.cfg file"), + ('filename=', 'f', + "configuration file to use (default=setup.cfg)"), + ] + + boolean_options = [ + 'global-config', 'user-config', + ] + + def initialize_options(self): + self.global_config = None + self.user_config = None + self.filename = None + + def finalize_options(self): + filenames = [] + if self.global_config: + filenames.append(config_file('global')) + if self.user_config: + filenames.append(config_file('user')) + if self.filename is not None: + filenames.append(self.filename) + if not filenames: + filenames.append(config_file('local')) + if len(filenames) > 1: + raise DistutilsOptionError( + "Must specify only one configuration file option", + filenames + ) + self.filename, = filenames + + +class setopt(option_base): + """Save command-line options to a file""" + + description = "set an option in setup.cfg or another config file" + + user_options = [ + ('command=', 'c', 'command to set an option for'), + ('option=', 'o', 'option to set'), + ('set-value=', 's', 'value of the option'), + ('remove', 'r', 'remove (unset) the value'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.command = None + self.option = None + self.set_value = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.command is None or self.option is None: + raise DistutilsOptionError("Must specify --command *and* --option") + if self.set_value is None and not self.remove: + raise DistutilsOptionError("Must specify --set-value or --remove") + + def run(self): + edit_config( + self.filename, { + self.command: {self.option.replace('-', '_'): self.set_value} + }, + self.dry_run + ) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/test.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/test.py new file mode 100644 index 0000000..973e4eb --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/test.py @@ -0,0 +1,271 @@ +import os +import operator +import sys +import contextlib +import itertools +import unittest +from distutils.errors import DistutilsError, DistutilsOptionError +from distutils import log +from unittest import TestLoader + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter + +from pkg_resources import (resource_listdir, resource_exists, normalize_path, + working_set, _namespace_packages, evaluate_marker, + add_activation_listener, require, EntryPoint) +from setuptools import Command +from .build_py import _unique_everseen + +__metaclass__ = type + + +class ScanningLoader(TestLoader): + + def __init__(self): + TestLoader.__init__(self) + self._visited = set() + + def loadTestsFromModule(self, module, pattern=None): + """Return a suite of all tests cases contained in the given module + + If the module is a package, load tests from all the modules in it. + If the module has an ``additional_tests`` function, call it and add + the return value to the tests. + """ + if module in self._visited: + return None + self._visited.add(module) + + tests = [] + tests.append(TestLoader.loadTestsFromModule(self, module)) + + if hasattr(module, "additional_tests"): + tests.append(module.additional_tests()) + + if hasattr(module, '__path__'): + for file in resource_listdir(module.__name__, ''): + if file.endswith('.py') and file != '__init__.py': + submodule = module.__name__ + '.' + file[:-3] + else: + if resource_exists(module.__name__, file + '/__init__.py'): + submodule = module.__name__ + '.' + file + else: + continue + tests.append(self.loadTestsFromName(submodule)) + + if len(tests) != 1: + return self.suiteClass(tests) + else: + return tests[0] # don't create a nested suite for only one return + + +# adapted from jaraco.classes.properties:NonDataProperty +class NonDataProperty: + def __init__(self, fget): + self.fget = fget + + def __get__(self, obj, objtype=None): + if obj is None: + return self + return self.fget(obj) + + +class test(Command): + """Command to run unit tests after in-place build""" + + description = "run unit tests after in-place build" + + user_options = [ + ('test-module=', 'm', "Run 'test_suite' in specified module"), + ('test-suite=', 's', + "Run single test, case or suite (e.g. 'module.test_suite')"), + ('test-runner=', 'r', "Test runner to use"), + ] + + def initialize_options(self): + self.test_suite = None + self.test_module = None + self.test_loader = None + self.test_runner = None + + def finalize_options(self): + + if self.test_suite and self.test_module: + msg = "You may specify a module or a suite, but not both" + raise DistutilsOptionError(msg) + + if self.test_suite is None: + if self.test_module is None: + self.test_suite = self.distribution.test_suite + else: + self.test_suite = self.test_module + ".test_suite" + + if self.test_loader is None: + self.test_loader = getattr(self.distribution, 'test_loader', None) + if self.test_loader is None: + self.test_loader = "setuptools.command.test:ScanningLoader" + if self.test_runner is None: + self.test_runner = getattr(self.distribution, 'test_runner', None) + + @NonDataProperty + def test_args(self): + return list(self._test_args()) + + def _test_args(self): + if not self.test_suite and sys.version_info >= (2, 7): + yield 'discover' + if self.verbose: + yield '--verbose' + if self.test_suite: + yield self.test_suite + + def with_project_on_sys_path(self, func): + """ + Backward compatibility for project_on_sys_path context. + """ + with self.project_on_sys_path(): + func() + + @contextlib.contextmanager + def project_on_sys_path(self, include_dists=[]): + with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) + + if with_2to3: + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + ei_cmd = self.get_finalized_command("egg_info") + + old_path = sys.path[:] + old_modules = sys.modules.copy() + + try: + project_path = normalize_path(ei_cmd.egg_base) + sys.path.insert(0, project_path) + working_set.__init__() + add_activation_listener(lambda dist: dist.activate()) + require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) + with self.paths_on_pythonpath([project_path]): + yield + finally: + sys.path[:] = old_path + sys.modules.clear() + sys.modules.update(old_modules) + working_set.__init__() + + @staticmethod + @contextlib.contextmanager + def paths_on_pythonpath(paths): + """ + Add the indicated paths to the head of the PYTHONPATH environment + variable so that subprocesses will also see the packages at + these paths. + + Do this in a context that restores the value on exit. + """ + nothing = object() + orig_pythonpath = os.environ.get('PYTHONPATH', nothing) + current_pythonpath = os.environ.get('PYTHONPATH', '') + try: + prefix = os.pathsep.join(_unique_everseen(paths)) + to_join = filter(None, [prefix, current_pythonpath]) + new_path = os.pathsep.join(to_join) + if new_path: + os.environ['PYTHONPATH'] = new_path + yield + finally: + if orig_pythonpath is nothing: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = orig_pythonpath + + @staticmethod + def install_dists(dist): + """ + Install the requirements indicated by self.distribution and + return an iterable of the dists that were built. + """ + ir_d = dist.fetch_build_eggs(dist.install_requires) + tr_d = dist.fetch_build_eggs(dist.tests_require or []) + er_d = dist.fetch_build_eggs( + v for k, v in dist.extras_require.items() + if k.startswith(':') and evaluate_marker(k[1:]) + ) + return itertools.chain(ir_d, tr_d, er_d) + + def run(self): + installed_dists = self.install_dists(self.distribution) + + cmd = ' '.join(self._argv) + if self.dry_run: + self.announce('skipping "%s" (dry run)' % cmd) + return + + self.announce('running "%s"' % cmd) + + paths = map(operator.attrgetter('location'), installed_dists) + with self.paths_on_pythonpath(paths): + with self.project_on_sys_path(): + self.run_tests() + + def run_tests(self): + # Purge modules under test from sys.modules. The test loader will + # re-import them from the build location. Required when 2to3 is used + # with namespace packages. + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + module = self.test_suite.split('.')[0] + if module in _namespace_packages: + del_modules = [] + if module in sys.modules: + del_modules.append(module) + module += '.' + for name in sys.modules: + if name.startswith(module): + del_modules.append(name) + list(map(sys.modules.__delitem__, del_modules)) + + test = unittest.main( + None, None, self._argv, + testLoader=self._resolve_as_ep(self.test_loader), + testRunner=self._resolve_as_ep(self.test_runner), + exit=False, + ) + if not test.result.wasSuccessful(): + msg = 'Test failed: %s' % test.result + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + @property + def _argv(self): + return ['unittest'] + self.test_args + + @staticmethod + def _resolve_as_ep(val): + """ + Load the indicated attribute value, called, as a as if it were + specified as an entry point. + """ + if val is None: + return + parsed = EntryPoint.parse("x=" + val) + return parsed.resolve()() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload.py new file mode 100644 index 0000000..6db8888 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload.py @@ -0,0 +1,196 @@ +import io +import os +import hashlib +import getpass + +from base64 import standard_b64encode + +from distutils import log +from distutils.command import upload as orig +from distutils.spawn import spawn + +from distutils.errors import DistutilsError + +from setuptools.extern.six.moves.urllib.request import urlopen, Request +from setuptools.extern.six.moves.urllib.error import HTTPError +from setuptools.extern.six.moves.urllib.parse import urlparse + + +class upload(orig.upload): + """ + Override default upload behavior to obtain password + in a variety of different ways. + """ + def run(self): + try: + orig.upload.run(self) + finally: + self.announce( + "WARNING: Uploading via this command is deprecated, use twine " + "to upload instead (https://pypi.org/p/twine/)", + log.WARN + ) + + def finalize_options(self): + orig.upload.finalize_options(self) + self.username = ( + self.username or + getpass.getuser() + ) + # Attempt to obtain password. Short circuit evaluation at the first + # sign of success. + self.password = ( + self.password or + self._load_password_from_keyring() or + self._prompt_for_password() + ) + + def upload_file(self, command, pyversion, filename): + # Makes sure the repository URL is compliant + schema, netloc, url, params, query, fragments = \ + urlparse(self.repository) + if params or query or fragments: + raise AssertionError("Incompatible url %s" % self.repository) + + if schema not in ('http', 'https'): + raise AssertionError("unsupported schema " + schema) + + # Sign if requested + if self.sign: + gpg_args = ["gpg", "--detach-sign", "-a", filename] + if self.identity: + gpg_args[2:2] = ["--local-user", self.identity] + spawn(gpg_args, + dry_run=self.dry_run) + + # Fill in the data - send all the meta-data in case we need to + # register a new release + with open(filename, 'rb') as f: + content = f.read() + + meta = self.distribution.metadata + + data = { + # action + ':action': 'file_upload', + 'protocol_version': '1', + + # identify release + 'name': meta.get_name(), + 'version': meta.get_version(), + + # file content + 'content': (os.path.basename(filename), content), + 'filetype': command, + 'pyversion': pyversion, + 'md5_digest': hashlib.md5(content).hexdigest(), + + # additional meta-data + 'metadata_version': str(meta.get_metadata_version()), + 'summary': meta.get_description(), + 'home_page': meta.get_url(), + 'author': meta.get_contact(), + 'author_email': meta.get_contact_email(), + 'license': meta.get_licence(), + 'description': meta.get_long_description(), + 'keywords': meta.get_keywords(), + 'platform': meta.get_platforms(), + 'classifiers': meta.get_classifiers(), + 'download_url': meta.get_download_url(), + # PEP 314 + 'provides': meta.get_provides(), + 'requires': meta.get_requires(), + 'obsoletes': meta.get_obsoletes(), + } + + data['comment'] = '' + + if self.sign: + data['gpg_signature'] = (os.path.basename(filename) + ".asc", + open(filename+".asc", "rb").read()) + + # set up the authentication + user_pass = (self.username + ":" + self.password).encode('ascii') + # The exact encoding of the authentication string is debated. + # Anyway PyPI only accepts ascii for both username or password. + auth = "Basic " + standard_b64encode(user_pass).decode('ascii') + + # Build up the MIME payload for the POST data + boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\r\n--' + boundary.encode('ascii') + end_boundary = sep_boundary + b'--\r\n' + body = io.BytesIO() + for key, value in data.items(): + title = '\r\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(value, list): + value = [value] + for value in value: + if type(value) is tuple: + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = str(value).encode('utf-8') + body.write(sep_boundary) + body.write(title.encode('utf-8')) + body.write(b"\r\n\r\n") + body.write(value) + body.write(end_boundary) + body = body.getvalue() + + msg = "Submitting %s to %s" % (filename, self.repository) + self.announce(msg, log.INFO) + + # build the Request + headers = { + 'Content-type': 'multipart/form-data; boundary=%s' % boundary, + 'Content-length': str(len(body)), + 'Authorization': auth, + } + + request = Request(self.repository, data=body, + headers=headers) + # send the data + try: + result = urlopen(request) + status = result.getcode() + reason = result.msg + except HTTPError as e: + status = e.code + reason = e.msg + except OSError as e: + self.announce(str(e), log.ERROR) + raise + + if status == 200: + self.announce('Server response (%s): %s' % (status, reason), + log.INFO) + if self.show_response: + text = getattr(self, '_read_pypi_response', + lambda x: None)(result) + if text is not None: + msg = '\n'.join(('-' * 75, text, '-' * 75)) + self.announce(msg, log.INFO) + else: + msg = 'Upload failed (%s): %s' % (status, reason) + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + def _load_password_from_keyring(self): + """ + Attempt to load password from keyring. Suppress Exceptions. + """ + try: + keyring = __import__('keyring') + return keyring.get_password(self.repository, self.username) + except Exception: + pass + + def _prompt_for_password(self): + """ + Prompt for a password on the tty. Suppress Exceptions. + """ + try: + return getpass.getpass() + except (Exception, KeyboardInterrupt): + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py new file mode 100644 index 0000000..07aa564 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/command/upload_docs.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +"""upload_docs + +Implements a Distutils 'upload_docs' subcommand (upload documentation to +PyPI's pythonhosted.org). +""" + +from base64 import standard_b64encode +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import socket +import zipfile +import tempfile +import shutil +import itertools +import functools + +from setuptools.extern import six +from setuptools.extern.six.moves import http_client, urllib + +from pkg_resources import iter_entry_points +from .upload import upload + + +def _encode(s): + errors = 'surrogateescape' if six.PY3 else 'strict' + return s.encode('utf-8', errors) + + +class upload_docs(upload): + # override the default repository as upload_docs isn't + # supported by Warehouse (and won't be). + DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' + + description = 'Upload documentation to PyPI' + + user_options = [ + ('repository=', 'r', + "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), + ('show-response', None, + 'display full response text from server'), + ('upload-dir=', None, 'directory to upload'), + ] + boolean_options = upload.boolean_options + + def has_sphinx(self): + if self.upload_dir is None: + for ep in iter_entry_points('distutils.commands', 'build_sphinx'): + return True + + sub_commands = [('build_sphinx', has_sphinx)] + + def initialize_options(self): + upload.initialize_options(self) + self.upload_dir = None + self.target_dir = None + + def finalize_options(self): + upload.finalize_options(self) + if self.upload_dir is None: + if self.has_sphinx(): + build_sphinx = self.get_finalized_command('build_sphinx') + self.target_dir = build_sphinx.builder_target_dir + else: + build = self.get_finalized_command('build') + self.target_dir = os.path.join(build.build_base, 'docs') + else: + self.ensure_dirname('upload_dir') + self.target_dir = self.upload_dir + if 'pypi.python.org' in self.repository: + log.warn("Upload_docs command is deprecated. Use RTD instead.") + self.announce('Using upload directory %s' % self.target_dir) + + def create_zipfile(self, filename): + zip_file = zipfile.ZipFile(filename, "w") + try: + self.mkpath(self.target_dir) # just in case + for root, dirs, files in os.walk(self.target_dir): + if root == self.target_dir and not files: + tmpl = "no files found in upload directory '%s'" + raise DistutilsOptionError(tmpl % self.target_dir) + for name in files: + full = os.path.join(root, name) + relative = root[len(self.target_dir):].lstrip(os.path.sep) + dest = os.path.join(relative, name) + zip_file.write(full, dest) + finally: + zip_file.close() + + def run(self): + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + tmp_dir = tempfile.mkdtemp() + name = self.distribution.metadata.get_name() + zip_file = os.path.join(tmp_dir, "%s.zip" % name) + try: + self.create_zipfile(zip_file) + self.upload_file(zip_file) + finally: + shutil.rmtree(tmp_dir) + + @staticmethod + def _build_part(item, sep_boundary): + key, values = item + title = '\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(values, list): + values = [values] + for value in values: + if isinstance(value, tuple): + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = _encode(value) + yield sep_boundary + yield _encode(title) + yield b"\n\n" + yield value + if value and value[-1:] == b'\r': + yield b'\n' # write an extra newline (lurve Macs) + + @classmethod + def _build_multipart(cls, data): + """ + Build up the MIME payload for the POST data + """ + boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\n--' + boundary + end_boundary = sep_boundary + b'--' + end_items = end_boundary, b"\n", + builder = functools.partial( + cls._build_part, + sep_boundary=sep_boundary, + ) + part_groups = map(builder, data.items()) + parts = itertools.chain.from_iterable(part_groups) + body_items = itertools.chain(parts, end_items) + content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') + return b''.join(body_items), content_type + + def upload_file(self, filename): + with open(filename, 'rb') as f: + content = f.read() + meta = self.distribution.metadata + data = { + ':action': 'doc_upload', + 'name': meta.get_name(), + 'content': (os.path.basename(filename), content), + } + # set up the authentication + credentials = _encode(self.username + ':' + self.password) + credentials = standard_b64encode(credentials) + if six.PY3: + credentials = credentials.decode('ascii') + auth = "Basic " + credentials + + body, ct = self._build_multipart(data) + + msg = "Submitting documentation to %s" % (self.repository) + self.announce(msg, log.INFO) + + # build the Request + # We can't use urllib2 since we need to send the Basic + # auth right with the first request + schema, netloc, url, params, query, fragments = \ + urllib.parse.urlparse(self.repository) + assert not params and not query and not fragments + if schema == 'http': + conn = http_client.HTTPConnection(netloc) + elif schema == 'https': + conn = http_client.HTTPSConnection(netloc) + else: + raise AssertionError("unsupported schema " + schema) + + data = '' + try: + conn.connect() + conn.putrequest("POST", url) + content_type = ct + conn.putheader('Content-type', content_type) + conn.putheader('Content-length', str(len(body))) + conn.putheader('Authorization', auth) + conn.endheaders() + conn.send(body) + except socket.error as e: + self.announce(str(e), log.ERROR) + return + + r = conn.getresponse() + if r.status == 200: + msg = 'Server response (%s): %s' % (r.status, r.reason) + self.announce(msg, log.INFO) + elif r.status == 301: + location = r.getheader('Location') + if location is None: + location = 'https://pythonhosted.org/%s/' % meta.get_name() + msg = 'Upload successful. Visit %s' % location + self.announce(msg, log.INFO) + else: + msg = 'Upload failed (%s): %s' % (r.status, r.reason) + self.announce(msg, log.ERROR) + if self.show_response: + print('-' * 75, r.read(), '-' * 75) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/config.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/config.py new file mode 100644 index 0000000..b662604 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/config.py @@ -0,0 +1,656 @@ +from __future__ import absolute_import, unicode_literals +import io +import os +import sys + +import warnings +import functools +from collections import defaultdict +from functools import partial +from functools import wraps +from importlib import import_module + +from distutils.errors import DistutilsOptionError, DistutilsFileError +from setuptools.extern.packaging.version import LegacyVersion, parse +from setuptools.extern.six import string_types, PY3 + + +__metaclass__ = type + + +def read_configuration( + filepath, find_others=False, ignore_option_errors=False): + """Read given configuration file and returns options from it as a dict. + + :param str|unicode filepath: Path to configuration file + to get options from. + + :param bool find_others: Whether to search for other configuration files + which could be on in various places. + + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + + :rtype: dict + """ + from setuptools.dist import Distribution, _Distribution + + filepath = os.path.abspath(filepath) + + if not os.path.isfile(filepath): + raise DistutilsFileError( + 'Configuration file %s does not exist.' % filepath) + + current_directory = os.getcwd() + os.chdir(os.path.dirname(filepath)) + + try: + dist = Distribution() + + filenames = dist.find_config_files() if find_others else [] + if filepath not in filenames: + filenames.append(filepath) + + _Distribution.parse_config_files(dist, filenames=filenames) + + handlers = parse_configuration( + dist, dist.command_options, + ignore_option_errors=ignore_option_errors) + + finally: + os.chdir(current_directory) + + return configuration_to_dict(handlers) + + +def _get_option(target_obj, key): + """ + Given a target object and option key, get that option from + the target object, either through a get_{key} method or + from an attribute directly. + """ + getter_name = 'get_{key}'.format(**locals()) + by_attribute = functools.partial(getattr, target_obj, key) + getter = getattr(target_obj, getter_name, by_attribute) + return getter() + + +def configuration_to_dict(handlers): + """Returns configuration data gathered by given handlers as a dict. + + :param list[ConfigHandler] handlers: Handlers list, + usually from parse_configuration() + + :rtype: dict + """ + config_dict = defaultdict(dict) + + for handler in handlers: + for option in handler.set_options: + value = _get_option(handler.target_obj, option) + config_dict[handler.section_prefix][option] = value + + return config_dict + + +def parse_configuration( + distribution, command_options, ignore_option_errors=False): + """Performs additional parsing of configuration options + for a distribution. + + Returns a list of used option handlers. + + :param Distribution distribution: + :param dict command_options: + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + :rtype: list + """ + options = ConfigOptionsHandler( + distribution, command_options, ignore_option_errors) + options.parse() + + meta = ConfigMetadataHandler( + distribution.metadata, command_options, ignore_option_errors, + distribution.package_dir) + meta.parse() + + return meta, options + + +class ConfigHandler: + """Handles metadata supplied in configuration files.""" + + section_prefix = None + """Prefix for config sections handled by this handler. + Must be provided by class heirs. + + """ + + aliases = {} + """Options aliases. + For compatibility with various packages. E.g.: d2to1 and pbr. + Note: `-` in keys is replaced with `_` by config parser. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False): + sections = {} + + section_prefix = self.section_prefix + for section_name, section_options in options.items(): + if not section_name.startswith(section_prefix): + continue + + section_name = section_name.replace(section_prefix, '').strip('.') + sections[section_name] = section_options + + self.ignore_option_errors = ignore_option_errors + self.target_obj = target_obj + self.sections = sections + self.set_options = [] + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + raise NotImplementedError( + '%s must provide .parsers property' % self.__class__.__name__) + + def __setitem__(self, option_name, value): + unknown = tuple() + target_obj = self.target_obj + + # Translate alias into real name. + option_name = self.aliases.get(option_name, option_name) + + current_value = getattr(target_obj, option_name, unknown) + + if current_value is unknown: + raise KeyError(option_name) + + if current_value: + # Already inhabited. Skipping. + return + + skip_option = False + parser = self.parsers.get(option_name) + if parser: + try: + value = parser(value) + + except Exception: + skip_option = True + if not self.ignore_option_errors: + raise + + if skip_option: + return + + setter = getattr(target_obj, 'set_%s' % option_name, None) + if setter is None: + setattr(target_obj, option_name, value) + else: + setter(value) + + self.set_options.append(option_name) + + @classmethod + def _parse_list(cls, value, separator=','): + """Represents value as a list. + + Value is split either by separator (defaults to comma) or by lines. + + :param value: + :param separator: List items separator character. + :rtype: list + """ + if isinstance(value, list): # _get_parser_compound case + return value + + if '\n' in value: + value = value.splitlines() + else: + value = value.split(separator) + + return [chunk.strip() for chunk in value if chunk.strip()] + + @classmethod + def _parse_dict(cls, value): + """Represents value as a dict. + + :param value: + :rtype: dict + """ + separator = '=' + result = {} + for line in cls._parse_list(value): + key, sep, val = line.partition(separator) + if sep != separator: + raise DistutilsOptionError( + 'Unable to parse option value to dict: %s' % value) + result[key.strip()] = val.strip() + + return result + + @classmethod + def _parse_bool(cls, value): + """Represents value as boolean. + + :param value: + :rtype: bool + """ + value = value.lower() + return value in ('1', 'true', 'yes') + + @classmethod + def _exclude_files_parser(cls, key): + """Returns a parser function to make sure field inputs + are not files. + + Parses a value after getting the key so error messages are + more informative. + + :param key: + :rtype: callable + """ + def parser(value): + exclude_directive = 'file:' + if value.startswith(exclude_directive): + raise ValueError( + 'Only strings are accepted for the {0} field, ' + 'files are not accepted'.format(key)) + return value + return parser + + @classmethod + def _parse_file(cls, value): + """Represents value as a string, allowing including text + from nearest files using `file:` directive. + + Directive is sandboxed and won't reach anything outside + directory with setup.py. + + Examples: + file: README.rst, CHANGELOG.md, src/file.txt + + :param str value: + :rtype: str + """ + include_directive = 'file:' + + if not isinstance(value, string_types): + return value + + if not value.startswith(include_directive): + return value + + spec = value[len(include_directive):] + filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) + return '\n'.join( + cls._read_file(path) + for path in filepaths + if (cls._assert_local(path) or True) + and os.path.isfile(path) + ) + + @staticmethod + def _assert_local(filepath): + if not filepath.startswith(os.getcwd()): + raise DistutilsOptionError( + '`file:` directive can not access %s' % filepath) + + @staticmethod + def _read_file(filepath): + with io.open(filepath, encoding='utf-8') as f: + return f.read() + + @classmethod + def _parse_attr(cls, value, package_dir=None): + """Represents value as a module attribute. + + Examples: + attr: package.attr + attr: package.module.attr + + :param str value: + :rtype: str + """ + attr_directive = 'attr:' + if not value.startswith(attr_directive): + return value + + attrs_path = value.replace(attr_directive, '').strip().split('.') + attr_name = attrs_path.pop() + + module_name = '.'.join(attrs_path) + module_name = module_name or '__init__' + + parent_path = os.getcwd() + if package_dir: + if attrs_path[0] in package_dir: + # A custom path was specified for the module we want to import + custom_path = package_dir[attrs_path[0]] + parts = custom_path.rsplit('/', 1) + if len(parts) > 1: + parent_path = os.path.join(os.getcwd(), parts[0]) + module_name = parts[1] + else: + module_name = custom_path + elif '' in package_dir: + # A custom parent directory was specified for all root modules + parent_path = os.path.join(os.getcwd(), package_dir['']) + sys.path.insert(0, parent_path) + try: + module = import_module(module_name) + value = getattr(module, attr_name) + + finally: + sys.path = sys.path[1:] + + return value + + @classmethod + def _get_parser_compound(cls, *parse_methods): + """Returns parser function to represents value as a list. + + Parses a value applying given methods one after another. + + :param parse_methods: + :rtype: callable + """ + def parse(value): + parsed = value + + for method in parse_methods: + parsed = method(parsed) + + return parsed + + return parse + + @classmethod + def _parse_section_to_dict(cls, section_options, values_parser=None): + """Parses section options into a dictionary. + + Optionally applies a given parser to values. + + :param dict section_options: + :param callable values_parser: + :rtype: dict + """ + value = {} + values_parser = values_parser or (lambda val: val) + for key, (_, val) in section_options.items(): + value[key] = values_parser(val) + return value + + def parse_section(self, section_options): + """Parses configuration file section. + + :param dict section_options: + """ + for (name, (_, value)) in section_options.items(): + try: + self[name] = value + + except KeyError: + pass # Keep silent for a new option may appear anytime. + + def parse(self): + """Parses configuration file items from one + or more related sections. + + """ + for section_name, section_options in self.sections.items(): + + method_postfix = '' + if section_name: # [section.option] variant + method_postfix = '_%s' % section_name + + section_parser_method = getattr( + self, + # Dots in section names are translated into dunderscores. + ('parse_section%s' % method_postfix).replace('.', '__'), + None) + + if section_parser_method is None: + raise DistutilsOptionError( + 'Unsupported distribution option section: [%s.%s]' % ( + self.section_prefix, section_name)) + + section_parser_method(section_options) + + def _deprecated_config_handler(self, func, msg, warning_class): + """ this function will wrap around parameters that are deprecated + + :param msg: deprecation message + :param warning_class: class of warning exception to be raised + :param func: function to be wrapped around + """ + @wraps(func) + def config_handler(*args, **kwargs): + warnings.warn(msg, warning_class) + return func(*args, **kwargs) + + return config_handler + + +class ConfigMetadataHandler(ConfigHandler): + + section_prefix = 'metadata' + + aliases = { + 'home_page': 'url', + 'summary': 'description', + 'classifier': 'classifiers', + 'platform': 'platforms', + } + + strict_mode = False + """We need to keep it loose, to be partially compatible with + `pbr` and `d2to1` packages which also uses `metadata` section. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False, + package_dir=None): + super(ConfigMetadataHandler, self).__init__(target_obj, options, + ignore_option_errors) + self.package_dir = package_dir + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_file = self._parse_file + parse_dict = self._parse_dict + exclude_files_parser = self._exclude_files_parser + + return { + 'platforms': parse_list, + 'keywords': parse_list, + 'provides': parse_list, + 'requires': self._deprecated_config_handler( + parse_list, + "The requires parameter is deprecated, please use " + "install_requires for runtime dependencies.", + DeprecationWarning), + 'obsoletes': parse_list, + 'classifiers': self._get_parser_compound(parse_file, parse_list), + 'license': exclude_files_parser('license'), + 'description': parse_file, + 'long_description': parse_file, + 'version': self._parse_version, + 'project_urls': parse_dict, + } + + def _parse_version(self, value): + """Parses `version` option value. + + :param value: + :rtype: str + + """ + version = self._parse_file(value) + + if version != value: + version = version.strip() + # Be strict about versions loaded from file because it's easy to + # accidentally include newlines and other unintended content + if isinstance(parse(version), LegacyVersion): + tmpl = ( + 'Version loaded from {value} does not ' + 'comply with PEP 440: {version}' + ) + raise DistutilsOptionError(tmpl.format(**locals())) + + return version + + version = self._parse_attr(value, self.package_dir) + + if callable(version): + version = version() + + if not isinstance(version, string_types): + if hasattr(version, '__iter__'): + version = '.'.join(map(str, version)) + else: + version = '%s' % version + + return version + + +class ConfigOptionsHandler(ConfigHandler): + + section_prefix = 'options' + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_list_semicolon = partial(self._parse_list, separator=';') + parse_bool = self._parse_bool + parse_dict = self._parse_dict + + return { + 'zip_safe': parse_bool, + 'use_2to3': parse_bool, + 'include_package_data': parse_bool, + 'package_dir': parse_dict, + 'use_2to3_fixers': parse_list, + 'use_2to3_exclude_fixers': parse_list, + 'convert_2to3_doctests': parse_list, + 'scripts': parse_list, + 'eager_resources': parse_list, + 'dependency_links': parse_list, + 'namespace_packages': parse_list, + 'install_requires': parse_list_semicolon, + 'setup_requires': parse_list_semicolon, + 'tests_require': parse_list_semicolon, + 'packages': self._parse_packages, + 'entry_points': self._parse_file, + 'py_modules': parse_list, + } + + def _parse_packages(self, value): + """Parses `packages` option value. + + :param value: + :rtype: list + """ + find_directives = ['find:', 'find_namespace:'] + trimmed_value = value.strip() + + if trimmed_value not in find_directives: + return self._parse_list(value) + + findns = trimmed_value == find_directives[1] + if findns and not PY3: + raise DistutilsOptionError( + 'find_namespace: directive is unsupported on Python < 3.3') + + # Read function arguments from a dedicated section. + find_kwargs = self.parse_section_packages__find( + self.sections.get('packages.find', {})) + + if findns: + from setuptools import find_namespace_packages as find_packages + else: + from setuptools import find_packages + + return find_packages(**find_kwargs) + + def parse_section_packages__find(self, section_options): + """Parses `packages.find` configuration file section. + + To be used in conjunction with _parse_packages(). + + :param dict section_options: + """ + section_data = self._parse_section_to_dict( + section_options, self._parse_list) + + valid_keys = ['where', 'include', 'exclude'] + + find_kwargs = dict( + [(k, v) for k, v in section_data.items() if k in valid_keys and v]) + + where = find_kwargs.get('where') + if where is not None: + find_kwargs['where'] = where[0] # cast list to single val + + return find_kwargs + + def parse_section_entry_points(self, section_options): + """Parses `entry_points` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['entry_points'] = parsed + + def _parse_package_data(self, section_options): + parsed = self._parse_section_to_dict(section_options, self._parse_list) + + root = parsed.get('*') + if root: + parsed[''] = root + del parsed['*'] + + return parsed + + def parse_section_package_data(self, section_options): + """Parses `package_data` configuration file section. + + :param dict section_options: + """ + self['package_data'] = self._parse_package_data(section_options) + + def parse_section_exclude_package_data(self, section_options): + """Parses `exclude_package_data` configuration file section. + + :param dict section_options: + """ + self['exclude_package_data'] = self._parse_package_data( + section_options) + + def parse_section_extras_require(self, section_options): + """Parses `extras_require` configuration file section. + + :param dict section_options: + """ + parse_list = partial(self._parse_list, separator=';') + self['extras_require'] = self._parse_section_to_dict( + section_options, parse_list) + + def parse_section_data_files(self, section_options): + """Parses `data_files` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['data_files'] = [(k, v) for k, v in parsed.items()] diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/dep_util.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/dep_util.py new file mode 100644 index 0000000..2931c13 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/dep_util.py @@ -0,0 +1,23 @@ +from distutils.dep_util import newer_group + +# yes, this is was almost entirely copy-pasted from +# 'newer_pairwise()', this is just another convenience +# function. +def newer_pairwise_group(sources_groups, targets): + """Walk both arguments in parallel, testing if each source group is newer + than its corresponding target. Returns a pair of lists (sources_groups, + targets) where sources is newer than target, according to the semantics + of 'newer_group()'. + """ + if len(sources_groups) != len(targets): + raise ValueError("'sources_group' and 'targets' must be the same length") + + # build a pair of lists (sources_groups, targets) where source is newer + n_sources = [] + n_targets = [] + for i in range(len(sources_groups)): + if newer_group(sources_groups[i], targets[i]): + n_sources.append(sources_groups[i]) + n_targets.append(targets[i]) + + return n_sources, n_targets diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/depends.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/depends.py new file mode 100644 index 0000000..45e7052 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/depends.py @@ -0,0 +1,186 @@ +import sys +import imp +import marshal +from distutils.version import StrictVersion +from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN + +from .py33compat import Bytecode + + +__all__ = [ + 'Require', 'find_module', 'get_module_constant', 'extract_constant' +] + + +class Require: + """A prerequisite to building or installing a distribution""" + + def __init__(self, name, requested_version, module, homepage='', + attribute=None, format=None): + + if format is None and requested_version is not None: + format = StrictVersion + + if format is not None: + requested_version = format(requested_version) + if attribute is None: + attribute = '__version__' + + self.__dict__.update(locals()) + del self.self + + def full_name(self): + """Return full package/distribution name, w/version""" + if self.requested_version is not None: + return '%s-%s' % (self.name, self.requested_version) + return self.name + + def version_ok(self, version): + """Is 'version' sufficiently up-to-date?""" + return self.attribute is None or self.format is None or \ + str(version) != "unknown" and version >= self.requested_version + + def get_version(self, paths=None, default="unknown"): + """Get version number of installed module, 'None', or 'default' + + Search 'paths' for module. If not found, return 'None'. If found, + return the extracted version attribute, or 'default' if no version + attribute was specified, or the value cannot be determined without + importing the module. The version is formatted according to the + requirement's version format (if any), unless it is 'None' or the + supplied 'default'. + """ + + if self.attribute is None: + try: + f, p, i = find_module(self.module, paths) + if f: + f.close() + return default + except ImportError: + return None + + v = get_module_constant(self.module, self.attribute, default, paths) + + if v is not None and v is not default and self.format is not None: + return self.format(v) + + return v + + def is_present(self, paths=None): + """Return true if dependency is present on 'paths'""" + return self.get_version(paths) is not None + + def is_current(self, paths=None): + """Return true if dependency is present and up-to-date on 'paths'""" + version = self.get_version(paths) + if version is None: + return False + return self.version_ok(version) + + +def find_module(module, paths=None): + """Just like 'imp.find_module()', but with package support""" + + parts = module.split('.') + + while parts: + part = parts.pop(0) + f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) + + if kind == PKG_DIRECTORY: + parts = parts or ['__init__'] + paths = [path] + + elif parts: + raise ImportError("Can't find %r in %s" % (parts, module)) + + return info + + +def get_module_constant(module, symbol, default=-1, paths=None): + """Find 'module' by searching 'paths', and extract 'symbol' + + Return 'None' if 'module' does not exist on 'paths', or it does not define + 'symbol'. If the module defines 'symbol' as a constant, return the + constant. Otherwise, return 'default'.""" + + try: + f, path, (suffix, mode, kind) = find_module(module, paths) + except ImportError: + # Module doesn't exist + return None + + try: + if kind == PY_COMPILED: + f.read(8) # skip magic & date + code = marshal.load(f) + elif kind == PY_FROZEN: + code = imp.get_frozen_object(module) + elif kind == PY_SOURCE: + code = compile(f.read(), path, 'exec') + else: + # Not something we can parse; we'll have to import it. :( + if module not in sys.modules: + imp.load_module(module, f, path, (suffix, mode, kind)) + return getattr(sys.modules[module], symbol, None) + + finally: + if f: + f.close() + + return extract_constant(code, symbol, default) + + +def extract_constant(code, symbol, default=-1): + """Extract the constant value of 'symbol' from 'code' + + If the name 'symbol' is bound to a constant value by the Python code + object 'code', return that value. If 'symbol' is bound to an expression, + return 'default'. Otherwise, return 'None'. + + Return value is based on the first assignment to 'symbol'. 'symbol' must + be a global, or at least a non-"fast" local in the code block. That is, + only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' + must be present in 'code.co_names'. + """ + if symbol not in code.co_names: + # name's not there, can't possibly be an assignment + return None + + name_idx = list(code.co_names).index(symbol) + + STORE_NAME = 90 + STORE_GLOBAL = 97 + LOAD_CONST = 100 + + const = default + + for byte_code in Bytecode(code): + op = byte_code.opcode + arg = byte_code.arg + + if op == LOAD_CONST: + const = code.co_consts[arg] + elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): + return const + else: + const = default + + +def _update_globals(): + """ + Patch the globals to remove the objects not available on some platforms. + + XXX it'd be better to test assertions about bytecode instead. + """ + + if not sys.platform.startswith('java') and sys.platform != 'cli': + return + incompatible = 'extract_constant', 'get_module_constant' + for name in incompatible: + del globals()[name] + __all__.remove(name) + + +_update_globals() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/dist.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/dist.py new file mode 100644 index 0000000..9a165de --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/dist.py @@ -0,0 +1,1278 @@ +# -*- coding: utf-8 -*- +__all__ = ['Distribution'] + +import io +import sys +import re +import os +import warnings +import numbers +import distutils.log +import distutils.core +import distutils.cmd +import distutils.dist +from distutils.util import strtobool +from distutils.debug import DEBUG +from distutils.fancy_getopt import translate_longopt +import itertools + +from collections import defaultdict +from email import message_from_file + +from distutils.errors import ( + DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, +) +from distutils.util import rfc822_escape +from distutils.version import StrictVersion + +from setuptools.extern import six +from setuptools.extern import packaging +from setuptools.extern.six.moves import map, filter, filterfalse + +from . import SetuptoolsDeprecationWarning + +from setuptools.depends import Require +from setuptools import windows_support +from setuptools.monkey import get_unpatched +from setuptools.config import parse_configuration +import pkg_resources + +__import__('setuptools.extern.packaging.specifiers') +__import__('setuptools.extern.packaging.version') + + +def _get_unpatched(cls): + warnings.warn("Do not call this function", DistDeprecationWarning) + return get_unpatched(cls) + + +def get_metadata_version(self): + mv = getattr(self, 'metadata_version', None) + + if mv is None: + if self.long_description_content_type or self.provides_extras: + mv = StrictVersion('2.1') + elif (self.maintainer is not None or + self.maintainer_email is not None or + getattr(self, 'python_requires', None) is not None): + mv = StrictVersion('1.2') + elif (self.provides or self.requires or self.obsoletes or + self.classifiers or self.download_url): + mv = StrictVersion('1.1') + else: + mv = StrictVersion('1.0') + + self.metadata_version = mv + + return mv + + +def read_pkg_file(self, file): + """Reads the metadata values from a file object.""" + msg = message_from_file(file) + + def _read_field(name): + value = msg[name] + if value == 'UNKNOWN': + return None + return value + + def _read_list(name): + values = msg.get_all(name, None) + if values == []: + return None + return values + + self.metadata_version = StrictVersion(msg['metadata-version']) + self.name = _read_field('name') + self.version = _read_field('version') + self.description = _read_field('summary') + # we are filling author only. + self.author = _read_field('author') + self.maintainer = None + self.author_email = _read_field('author-email') + self.maintainer_email = None + self.url = _read_field('home-page') + self.license = _read_field('license') + + if 'download-url' in msg: + self.download_url = _read_field('download-url') + else: + self.download_url = None + + self.long_description = _read_field('description') + self.description = _read_field('summary') + + if 'keywords' in msg: + self.keywords = _read_field('keywords').split(',') + + self.platforms = _read_list('platform') + self.classifiers = _read_list('classifier') + + # PEP 314 - these fields only exist in 1.1 + if self.metadata_version == StrictVersion('1.1'): + self.requires = _read_list('requires') + self.provides = _read_list('provides') + self.obsoletes = _read_list('obsoletes') + else: + self.requires = None + self.provides = None + self.obsoletes = None + + +# Based on Python 3.5 version +def write_pkg_file(self, file): + """Write the PKG-INFO format data to a file object. + """ + version = self.get_metadata_version() + + if six.PY2: + def write_field(key, value): + file.write("%s: %s\n" % (key, self._encode_field(value))) + else: + def write_field(key, value): + file.write("%s: %s\n" % (key, value)) + + write_field('Metadata-Version', str(version)) + write_field('Name', self.get_name()) + write_field('Version', self.get_version()) + write_field('Summary', self.get_description()) + write_field('Home-page', self.get_url()) + + if version < StrictVersion('1.2'): + write_field('Author', self.get_contact()) + write_field('Author-email', self.get_contact_email()) + else: + optional_fields = ( + ('Author', 'author'), + ('Author-email', 'author_email'), + ('Maintainer', 'maintainer'), + ('Maintainer-email', 'maintainer_email'), + ) + + for field, attr in optional_fields: + attr_val = getattr(self, attr) + + if attr_val is not None: + write_field(field, attr_val) + + write_field('License', self.get_license()) + if self.download_url: + write_field('Download-URL', self.download_url) + for project_url in self.project_urls.items(): + write_field('Project-URL', '%s, %s' % project_url) + + long_desc = rfc822_escape(self.get_long_description()) + write_field('Description', long_desc) + + keywords = ','.join(self.get_keywords()) + if keywords: + write_field('Keywords', keywords) + + if version >= StrictVersion('1.2'): + for platform in self.get_platforms(): + write_field('Platform', platform) + else: + self._write_list(file, 'Platform', self.get_platforms()) + + self._write_list(file, 'Classifier', self.get_classifiers()) + + # PEP 314 + self._write_list(file, 'Requires', self.get_requires()) + self._write_list(file, 'Provides', self.get_provides()) + self._write_list(file, 'Obsoletes', self.get_obsoletes()) + + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + write_field('Requires-Python', self.python_requires) + + # PEP 566 + if self.long_description_content_type: + write_field( + 'Description-Content-Type', + self.long_description_content_type + ) + if self.provides_extras: + for extra in self.provides_extras: + write_field('Provides-Extra', extra) + + +sequence = tuple, list + + +def check_importable(dist, attr, value): + try: + ep = pkg_resources.EntryPoint.parse('x=' + value) + assert not ep.extras + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be importable 'module:attrs' string (got %r)" + % (attr, value) + ) + + +def assert_string_list(dist, attr, value): + """Verify that value is a string list or None""" + try: + assert ''.join(value) != value + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be a list of strings (got %r)" % (attr, value) + ) + + +def check_nsp(dist, attr, value): + """Verify that namespace packages are valid""" + ns_packages = value + assert_string_list(dist, attr, ns_packages) + for nsp in ns_packages: + if not dist.has_contents_for(nsp): + raise DistutilsSetupError( + "Distribution contains no modules or packages for " + + "namespace package %r" % nsp + ) + parent, sep, child = nsp.rpartition('.') + if parent and parent not in ns_packages: + distutils.log.warn( + "WARNING: %r is declared as a package namespace, but %r" + " is not: please correct this in setup.py", nsp, parent + ) + + +def check_extras(dist, attr, value): + """Verify that extras_require mapping is valid""" + try: + list(itertools.starmap(_check_extra, value.items())) + except (TypeError, ValueError, AttributeError): + raise DistutilsSetupError( + "'extras_require' must be a dictionary whose values are " + "strings or lists of strings containing valid project/version " + "requirement specifiers." + ) + + +def _check_extra(extra, reqs): + name, sep, marker = extra.partition(':') + if marker and pkg_resources.invalid_marker(marker): + raise DistutilsSetupError("Invalid environment marker: " + marker) + list(pkg_resources.parse_requirements(reqs)) + + +def assert_bool(dist, attr, value): + """Verify that value is True, False, 0, or 1""" + if bool(value) != value: + tmpl = "{attr!r} must be a boolean value (got {value!r})" + raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) + + +def check_requirements(dist, attr, value): + """Verify that install_requires is a valid requirements list""" + try: + list(pkg_resources.parse_requirements(value)) + if isinstance(value, (dict, set)): + raise TypeError("Unordered types are not allowed") + except (TypeError, ValueError) as error: + tmpl = ( + "{attr!r} must be a string or list of strings " + "containing valid project/version requirement specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_specifier(dist, attr, value): + """Verify that value is a valid version specifier""" + try: + packaging.specifiers.SpecifierSet(value) + except packaging.specifiers.InvalidSpecifier as error: + tmpl = ( + "{attr!r} must be a string " + "containing valid version specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_entry_points(dist, attr, value): + """Verify that entry_points map is parseable""" + try: + pkg_resources.EntryPoint.parse_map(value) + except ValueError as e: + raise DistutilsSetupError(e) + + +def check_test_suite(dist, attr, value): + if not isinstance(value, six.string_types): + raise DistutilsSetupError("test_suite must be a string") + + +def check_package_data(dist, attr, value): + """Verify that value is a dictionary of package names to glob lists""" + if isinstance(value, dict): + for k, v in value.items(): + if not isinstance(k, str): + break + try: + iter(v) + except TypeError: + break + else: + return + raise DistutilsSetupError( + attr + " must be a dictionary mapping package names to lists of " + "wildcard patterns" + ) + + +def check_packages(dist, attr, value): + for pkgname in value: + if not re.match(r'\w+(\.\w+)*', pkgname): + distutils.log.warn( + "WARNING: %r not a valid package name; please use only " + ".-separated package names in setup.py", pkgname + ) + + +_Distribution = get_unpatched(distutils.core.Distribution) + + +class Distribution(_Distribution): + """Distribution with support for features, tests, and package data + + This is an enhanced version of 'distutils.dist.Distribution' that + effectively adds the following new optional keyword arguments to 'setup()': + + 'install_requires' -- a string or sequence of strings specifying project + versions that the distribution requires when installed, in the format + used by 'pkg_resources.require()'. They will be installed + automatically when the package is installed. If you wish to use + packages that are not available in PyPI, or want to give your users an + alternate download location, you can add a 'find_links' option to the + '[easy_install]' section of your project's 'setup.cfg' file, and then + setuptools will scan the listed web pages for links that satisfy the + requirements. + + 'extras_require' -- a dictionary mapping names of optional "extras" to the + additional requirement(s) that using those extras incurs. For example, + this:: + + extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) + + indicates that the distribution can optionally provide an extra + capability called "reST", but it can only be used if docutils and + reSTedit are installed. If the user installs your package using + EasyInstall and requests one of your extras, the corresponding + additional requirements will be installed if needed. + + 'features' **deprecated** -- a dictionary mapping option names to + 'setuptools.Feature' + objects. Features are a portion of the distribution that can be + included or excluded based on user options, inter-feature dependencies, + and availability on the current system. Excluded features are omitted + from all setup commands, including source and binary distributions, so + you can create multiple distributions from the same source tree. + Feature names should be valid Python identifiers, except that they may + contain the '-' (minus) sign. Features can be included or excluded + via the command line options '--with-X' and '--without-X', where 'X' is + the name of the feature. Whether a feature is included by default, and + whether you are allowed to control this from the command line, is + determined by the Feature object. See the 'Feature' class for more + information. + + 'test_suite' -- the name of a test suite to run for the 'test' command. + If the user runs 'python setup.py test', the package will be installed, + and the named test suite will be run. The format is the same as + would be used on a 'unittest.py' command line. That is, it is the + dotted name of an object to import and call to generate a test suite. + + 'package_data' -- a dictionary mapping package names to lists of filenames + or globs to use to find data files contained in the named packages. + If the dictionary has filenames or globs listed under '""' (the empty + string), those names will be searched for in every package, in addition + to any names for the specific package. Data files found using these + names/globs will be installed along with the package, in the same + location as the package. Note that globs are allowed to reference + the contents of non-package subdirectories, as long as you use '/' as + a path separator. (Globs are automatically converted to + platform-specific paths at runtime.) + + In addition to these new keywords, this class also has several new methods + for manipulating the distribution's contents. For example, the 'include()' + and 'exclude()' methods can be thought of as in-place add and subtract + commands that add or remove packages, modules, extensions, and so on from + the distribution. They are used by the feature subsystem to configure the + distribution for the included and excluded features. + """ + + _DISTUTILS_UNSUPPORTED_METADATA = { + 'long_description_content_type': None, + 'project_urls': dict, + 'provides_extras': set, + } + + _patched_dist = None + + def patch_missing_pkg_info(self, attrs): + # Fake up a replacement for the data that would normally come from + # PKG-INFO, but which might not yet be built if this is a fresh + # checkout. + # + if not attrs or 'name' not in attrs or 'version' not in attrs: + return + key = pkg_resources.safe_name(str(attrs['name'])).lower() + dist = pkg_resources.working_set.by_key.get(key) + if dist is not None and not dist.has_metadata('PKG-INFO'): + dist._version = pkg_resources.safe_version(str(attrs['version'])) + self._patched_dist = dist + + def __init__(self, attrs=None): + have_package_data = hasattr(self, "package_data") + if not have_package_data: + self.package_data = {} + attrs = attrs or {} + if 'features' in attrs or 'require_features' in attrs: + Feature.warn_deprecated() + self.require_features = [] + self.features = {} + self.dist_files = [] + # Filter-out setuptools' specific options. + self.src_root = attrs.pop("src_root", None) + self.patch_missing_pkg_info(attrs) + self.dependency_links = attrs.pop('dependency_links', []) + self.setup_requires = attrs.pop('setup_requires', []) + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + vars(self).setdefault(ep.name, None) + _Distribution.__init__(self, { + k: v for k, v in attrs.items() + if k not in self._DISTUTILS_UNSUPPORTED_METADATA + }) + + # Fill-in missing metadata fields not supported by distutils. + # Note some fields may have been set by other tools (e.g. pbr) + # above; they are taken preferrentially to setup() arguments + for option, default in self._DISTUTILS_UNSUPPORTED_METADATA.items(): + for source in self.metadata.__dict__, attrs: + if option in source: + value = source[option] + break + else: + value = default() if default else None + setattr(self.metadata, option, value) + + if isinstance(self.metadata.version, numbers.Number): + # Some people apparently take "version number" too literally :) + self.metadata.version = str(self.metadata.version) + + if self.metadata.version is not None: + try: + ver = packaging.version.Version(self.metadata.version) + normalized_version = str(ver) + if self.metadata.version != normalized_version: + warnings.warn( + "Normalizing '%s' to '%s'" % ( + self.metadata.version, + normalized_version, + ) + ) + self.metadata.version = normalized_version + except (packaging.version.InvalidVersion, TypeError): + warnings.warn( + "The version specified (%r) is an invalid version, this " + "may not work as expected with newer versions of " + "setuptools, pip, and PyPI. Please see PEP 440 for more " + "details." % self.metadata.version + ) + self._finalize_requires() + + def _finalize_requires(self): + """ + Set `metadata.python_requires` and fix environment markers + in `install_requires` and `extras_require`. + """ + if getattr(self, 'python_requires', None): + self.metadata.python_requires = self.python_requires + + if getattr(self, 'extras_require', None): + for extra in self.extras_require.keys(): + # Since this gets called multiple times at points where the + # keys have become 'converted' extras, ensure that we are only + # truly adding extras we haven't seen before here. + extra = extra.split(':')[0] + if extra: + self.metadata.provides_extras.add(extra) + + self._convert_extras_requirements() + self._move_install_requirements_markers() + + def _convert_extras_requirements(self): + """ + Convert requirements in `extras_require` of the form + `"extra": ["barbazquux; {marker}"]` to + `"extra:{marker}": ["barbazquux"]`. + """ + spec_ext_reqs = getattr(self, 'extras_require', None) or {} + self._tmp_extras_require = defaultdict(list) + for section, v in spec_ext_reqs.items(): + # Do not strip empty sections. + self._tmp_extras_require[section] + for r in pkg_resources.parse_requirements(v): + suffix = self._suffix_for(r) + self._tmp_extras_require[section + suffix].append(r) + + @staticmethod + def _suffix_for(req): + """ + For a requirement, return the 'extras_require' suffix for + that requirement. + """ + return ':' + str(req.marker) if req.marker else '' + + def _move_install_requirements_markers(self): + """ + Move requirements in `install_requires` that are using environment + markers `extras_require`. + """ + + # divide the install_requires into two sets, simple ones still + # handled by install_requires and more complex ones handled + # by extras_require. + + def is_simple_req(req): + return not req.marker + + spec_inst_reqs = getattr(self, 'install_requires', None) or () + inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) + simple_reqs = filter(is_simple_req, inst_reqs) + complex_reqs = filterfalse(is_simple_req, inst_reqs) + self.install_requires = list(map(str, simple_reqs)) + + for r in complex_reqs: + self._tmp_extras_require[':' + str(r.marker)].append(r) + self.extras_require = dict( + (k, [str(r) for r in map(self._clean_req, v)]) + for k, v in self._tmp_extras_require.items() + ) + + def _clean_req(self, req): + """ + Given a Requirement, remove environment markers and return it. + """ + req.marker = None + return req + + def _parse_config_files(self, filenames=None): + """ + Adapted from distutils.dist.Distribution.parse_config_files, + this method provides the same functionality in subtly-improved + ways. + """ + from setuptools.extern.six.moves.configparser import ConfigParser + + # Ignore install directory options if we have a venv + if six.PY3 and sys.prefix != sys.base_prefix: + ignore_options = [ + 'install-base', 'install-platbase', 'install-lib', + 'install-platlib', 'install-purelib', 'install-headers', + 'install-scripts', 'install-data', 'prefix', 'exec-prefix', + 'home', 'user', 'root'] + else: + ignore_options = [] + + ignore_options = frozenset(ignore_options) + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: + self.announce("Distribution.parse_config_files():") + + parser = ConfigParser() + for filename in filenames: + with io.open(filename, encoding='utf-8') as reader: + if DEBUG: + self.announce(" reading {filename}".format(**locals())) + (parser.read_file if six.PY3 else parser.readfp)(reader) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__' and opt not in ignore_options: + val = self._try_str(parser.get(section, opt)) + opt = opt.replace('-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if 'global' in self.command_options: + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + else: + setattr(self, opt, val) + except ValueError as msg: + raise DistutilsOptionError(msg) + + @staticmethod + def _try_str(val): + """ + On Python 2, much of distutils relies on string values being of + type 'str' (bytes) and not unicode text. If the value can be safely + encoded to bytes using the default encoding, prefer that. + + Why the default encoding? Because that value can be implicitly + decoded back to text if needed. + + Ref #1653 + """ + if six.PY3: + return val + try: + return val.encode() + except UnicodeEncodeError: + pass + return val + + def _set_command_options(self, command_obj, option_dict=None): + """ + Set the options for 'command_obj' from 'option_dict'. Basically + this means copying elements of a dictionary ('option_dict') to + attributes of an instance ('command'). + + 'command_obj' must be a Command instance. If 'option_dict' is not + supplied, uses the standard option dictionary for this command + (from 'self.command_options'). + + (Adopted from distutils.dist.Distribution._set_command_options) + """ + command_name = command_obj.get_command_name() + if option_dict is None: + option_dict = self.get_option_dict(command_name) + + if DEBUG: + self.announce(" setting options for '%s' command:" % command_name) + for (option, (source, value)) in option_dict.items(): + if DEBUG: + self.announce(" %s = %s (from %s)" % (option, value, + source)) + try: + bool_opts = [translate_longopt(o) + for o in command_obj.boolean_options] + except AttributeError: + bool_opts = [] + try: + neg_opt = command_obj.negative_opt + except AttributeError: + neg_opt = {} + + try: + is_string = isinstance(value, six.string_types) + if option in neg_opt and is_string: + setattr(command_obj, neg_opt[option], not strtobool(value)) + elif option in bool_opts and is_string: + setattr(command_obj, option, strtobool(value)) + elif hasattr(command_obj, option): + setattr(command_obj, option, value) + else: + raise DistutilsOptionError( + "error in %s: command '%s' has no such option '%s'" + % (source, command_name, option)) + except ValueError as msg: + raise DistutilsOptionError(msg) + + def parse_config_files(self, filenames=None, ignore_option_errors=False): + """Parses configuration files from various levels + and loads configuration. + + """ + self._parse_config_files(filenames=filenames) + + parse_configuration(self, self.command_options, + ignore_option_errors=ignore_option_errors) + self._finalize_requires() + + def parse_command_line(self): + """Process features after parsing command line options""" + result = _Distribution.parse_command_line(self) + if self.features: + self._finalize_features() + return result + + def _feature_attrname(self, name): + """Convert feature name to corresponding option attribute name""" + return 'with_' + name.replace('-', '_') + + def fetch_build_eggs(self, requires): + """Resolve pre-setup requirements""" + resolved_dists = pkg_resources.working_set.resolve( + pkg_resources.parse_requirements(requires), + installer=self.fetch_build_egg, + replace_conflicting=True, + ) + for dist in resolved_dists: + pkg_resources.working_set.add(dist, replace=True) + return resolved_dists + + def finalize_options(self): + _Distribution.finalize_options(self) + if self.features: + self._set_global_opts_from_features() + + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + value = getattr(self, ep.name, None) + if value is not None: + ep.require(installer=self.fetch_build_egg) + ep.load()(self, ep.name, value) + if getattr(self, 'convert_2to3_doctests', None): + # XXX may convert to set here when we can rely on set being builtin + self.convert_2to3_doctests = [ + os.path.abspath(p) + for p in self.convert_2to3_doctests + ] + else: + self.convert_2to3_doctests = [] + + def get_egg_cache_dir(self): + egg_cache_dir = os.path.join(os.curdir, '.eggs') + if not os.path.exists(egg_cache_dir): + os.mkdir(egg_cache_dir) + windows_support.hide_file(egg_cache_dir) + readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') + with open(readme_txt_filename, 'w') as f: + f.write('This directory contains eggs that were downloaded ' + 'by setuptools to build, test, and run plug-ins.\n\n') + f.write('This directory caches those eggs to prevent ' + 'repeated downloads.\n\n') + f.write('However, it is safe to delete this directory.\n\n') + + return egg_cache_dir + + def fetch_build_egg(self, req): + """Fetch an egg needed for building""" + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args': ['easy_install']}) + opts = dist.get_option_dict('easy_install') + opts.clear() + opts.update( + (k, v) + for k, v in self.get_option_dict('easy_install').items() + if k in ( + # don't use any other settings + 'find_links', 'site_dirs', 'index_url', + 'optimize', 'site_dirs', 'allow_hosts', + )) + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1] + links + opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() + cmd = easy_install( + dist, args=["x"], install_dir=install_dir, + exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() + return cmd.easy_install(req) + + def _set_global_opts_from_features(self): + """Add --with-X/--without-X options based on optional features""" + + go = [] + no = self.negative_opt.copy() + + for name, feature in self.features.items(): + self._set_feature(name, None) + feature.validate(self) + + if feature.optional: + descr = feature.description + incdef = ' (default)' + excdef = '' + if not feature.include_by_default(): + excdef, incdef = incdef, excdef + + new = ( + ('with-' + name, None, 'include ' + descr + incdef), + ('without-' + name, None, 'exclude ' + descr + excdef), + ) + go.extend(new) + no['without-' + name] = 'with-' + name + + self.global_options = self.feature_options = go + self.global_options + self.negative_opt = self.feature_negopt = no + + def _finalize_features(self): + """Add/remove features and resolve dependencies between them""" + + # First, flag all the enabled items (and thus their dependencies) + for name, feature in self.features.items(): + enabled = self.feature_is_included(name) + if enabled or (enabled is None and feature.include_by_default()): + feature.include_in(self) + self._set_feature(name, 1) + + # Then disable the rest, so that off-by-default features don't + # get flagged as errors when they're required by an enabled feature + for name, feature in self.features.items(): + if not self.feature_is_included(name): + feature.exclude_from(self) + self._set_feature(name, 0) + + def get_command_class(self, command): + """Pluggable version of get_command_class()""" + if command in self.cmdclass: + return self.cmdclass[command] + + eps = pkg_resources.iter_entry_points('distutils.commands', command) + for ep in eps: + ep.require(installer=self.fetch_build_egg) + self.cmdclass[command] = cmdclass = ep.load() + return cmdclass + else: + return _Distribution.get_command_class(self, command) + + def print_commands(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.print_commands(self) + + def get_command_list(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.get_command_list(self) + + def _set_feature(self, name, status): + """Set feature's inclusion status""" + setattr(self, self._feature_attrname(name), status) + + def feature_is_included(self, name): + """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" + return getattr(self, self._feature_attrname(name)) + + def include_feature(self, name): + """Request inclusion of feature named 'name'""" + + if self.feature_is_included(name) == 0: + descr = self.features[name].description + raise DistutilsOptionError( + descr + " is required, but was excluded or is not available" + ) + self.features[name].include_in(self) + self._set_feature(name, 1) + + def include(self, **attrs): + """Add items to distribution that are named in keyword arguments + + For example, 'dist.include(py_modules=["x"])' would add 'x' to + the distribution's 'py_modules' attribute, if it was not already + there. + + Currently, this method only supports inclusion for attributes that are + lists or tuples. If you need to add support for adding to other + attributes in this or a subclass, you can add an '_include_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' + will try to call 'dist._include_foo({"bar":"baz"})', which can then + handle whatever special inclusion logic is needed. + """ + for k, v in attrs.items(): + include = getattr(self, '_include_' + k, None) + if include: + include(v) + else: + self._include_misc(k, v) + + def exclude_package(self, package): + """Remove packages, modules, and extensions in named package""" + + pfx = package + '.' + if self.packages: + self.packages = [ + p for p in self.packages + if p != package and not p.startswith(pfx) + ] + + if self.py_modules: + self.py_modules = [ + p for p in self.py_modules + if p != package and not p.startswith(pfx) + ] + + if self.ext_modules: + self.ext_modules = [ + p for p in self.ext_modules + if p.name != package and not p.name.startswith(pfx) + ] + + def has_contents_for(self, package): + """Return true if 'exclude_package(package)' would do something""" + + pfx = package + '.' + + for p in self.iter_distribution_names(): + if p == package or p.startswith(pfx): + return True + + def _exclude_misc(self, name, value): + """Handle 'exclude()' for list/tuple attrs without a special handler""" + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list or tuple (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is not None and not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + elif old: + setattr(self, name, [item for item in old if item not in value]) + + def _include_misc(self, name, value): + """Handle 'include()' for list/tuple attrs without a special handler""" + + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is None: + setattr(self, name, value) + elif not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + else: + new = [item for item in value if item not in old] + setattr(self, name, old + new) + + def exclude(self, **attrs): + """Remove items from distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from + the distribution's 'py_modules' attribute. Excluding packages uses + the 'exclude_package()' method, so all of the package's contained + packages, modules, and extensions are also excluded. + + Currently, this method only supports exclusion from attributes that are + lists or tuples. If you need to add support for excluding from other + attributes in this or a subclass, you can add an '_exclude_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' + will try to call 'dist._exclude_foo({"bar":"baz"})', which can then + handle whatever special exclusion logic is needed. + """ + for k, v in attrs.items(): + exclude = getattr(self, '_exclude_' + k, None) + if exclude: + exclude(v) + else: + self._exclude_misc(k, v) + + def _exclude_packages(self, packages): + if not isinstance(packages, sequence): + raise DistutilsSetupError( + "packages: setting must be a list or tuple (%r)" % (packages,) + ) + list(map(self.exclude_package, packages)) + + def _parse_command_opts(self, parser, args): + # Remove --with-X/--without-X options when processing command args + self.global_options = self.__class__.global_options + self.negative_opt = self.__class__.negative_opt + + # First, expand any aliases + command = args[0] + aliases = self.get_option_dict('aliases') + while command in aliases: + src, alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! + import shlex + args[:1] = shlex.split(alias, True) + command = args[0] + + nargs = _Distribution._parse_command_opts(self, parser, args) + + # Handle commands that want to consume all remaining arguments + cmd_class = self.get_command_class(command) + if getattr(cmd_class, 'command_consumes_arguments', None): + self.get_option_dict(command)['args'] = ("command line", nargs) + if nargs is not None: + return [] + + return nargs + + def get_cmdline_options(self): + """Return a '{cmd: {opt:val}}' map of all command-line options + + Option names are all long, but do not include the leading '--', and + contain dashes rather than underscores. If the option doesn't take + an argument (e.g. '--quiet'), the 'val' is 'None'. + + Note that options provided by config files are intentionally excluded. + """ + + d = {} + + for cmd, opts in self.command_options.items(): + + for opt, (src, val) in opts.items(): + + if src != "command line": + continue + + opt = opt.replace('_', '-') + + if val == 0: + cmdobj = self.get_command_obj(cmd) + neg_opt = self.negative_opt.copy() + neg_opt.update(getattr(cmdobj, 'negative_opt', {})) + for neg, pos in neg_opt.items(): + if pos == opt: + opt = neg + val = None + break + else: + raise AssertionError("Shouldn't be able to get here") + + elif val == 1: + val = None + + d.setdefault(cmd, {})[opt] = val + + return d + + def iter_distribution_names(self): + """Yield all packages, modules, and extension names in distribution""" + + for pkg in self.packages or (): + yield pkg + + for module in self.py_modules or (): + yield module + + for ext in self.ext_modules or (): + if isinstance(ext, tuple): + name, buildinfo = ext + else: + name = ext.name + if name.endswith('module'): + name = name[:-6] + yield name + + def handle_display_options(self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + import sys + + if six.PY2 or self.help_commands: + return _Distribution.handle_display_options(self, option_order) + + # Stdout may be StringIO (e.g. in tests) + if not isinstance(sys.stdout, io.TextIOWrapper): + return _Distribution.handle_display_options(self, option_order) + + # Don't wrap stdout if utf-8 is already the encoding. Provides + # workaround for #334. + if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): + return _Distribution.handle_display_options(self, option_order) + + # Print metadata in UTF-8 no matter the platform + encoding = sys.stdout.encoding + errors = sys.stdout.errors + newline = sys.platform != 'win32' and '\n' or None + line_buffering = sys.stdout.line_buffering + + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) + try: + return _Distribution.handle_display_options(self, option_order) + finally: + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding, errors, newline, line_buffering) + + +class Feature: + """ + **deprecated** -- The `Feature` facility was never completely implemented + or supported, `has reported issues + <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in + a future version. + + A subset of the distribution that can be excluded if unneeded/wanted + + Features are created using these keyword arguments: + + 'description' -- a short, human readable description of the feature, to + be used in error messages, and option help messages. + + 'standard' -- if true, the feature is included by default if it is + available on the current system. Otherwise, the feature is only + included if requested via a command line '--with-X' option, or if + another included feature requires it. The default setting is 'False'. + + 'available' -- if true, the feature is available for installation on the + current system. The default setting is 'True'. + + 'optional' -- if true, the feature's inclusion can be controlled from the + command line, using the '--with-X' or '--without-X' options. If + false, the feature's inclusion status is determined automatically, + based on 'availabile', 'standard', and whether any other feature + requires it. The default setting is 'True'. + + 'require_features' -- a string or sequence of strings naming features + that should also be included if this feature is included. Defaults to + empty list. May also contain 'Require' objects that should be + added/removed from the distribution. + + 'remove' -- a string or list of strings naming packages to be removed + from the distribution if this feature is *not* included. If the + feature *is* included, this argument is ignored. This argument exists + to support removing features that "crosscut" a distribution, such as + defining a 'tests' feature that removes all the 'tests' subpackages + provided by other features. The default for this argument is an empty + list. (Note: the named package(s) or modules must exist in the base + distribution when the 'setup()' function is initially called.) + + other keywords -- any other keyword arguments are saved, and passed to + the distribution's 'include()' and 'exclude()' methods when the + feature is included or excluded, respectively. So, for example, you + could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be + added or removed from the distribution as appropriate. + + A feature must include at least one 'requires', 'remove', or other + keyword argument. Otherwise, it can't affect the distribution in any way. + Note also that you can subclass 'Feature' to create your own specialized + feature types that modify the distribution in other ways when included or + excluded. See the docstrings for the various methods here for more detail. + Aside from the methods, the only feature attributes that distributions look + at are 'description' and 'optional'. + """ + + @staticmethod + def warn_deprecated(): + msg = ( + "Features are deprecated and will be removed in a future " + "version. See https://github.com/pypa/setuptools/issues/65." + ) + warnings.warn(msg, DistDeprecationWarning, stacklevel=3) + + def __init__( + self, description, standard=False, available=True, + optional=True, require_features=(), remove=(), **extras): + self.warn_deprecated() + + self.description = description + self.standard = standard + self.available = available + self.optional = optional + if isinstance(require_features, (str, Require)): + require_features = require_features, + + self.require_features = [ + r for r in require_features if isinstance(r, str) + ] + er = [r for r in require_features if not isinstance(r, str)] + if er: + extras['require_features'] = er + + if isinstance(remove, str): + remove = remove, + self.remove = remove + self.extras = extras + + if not remove and not require_features and not extras: + raise DistutilsSetupError( + "Feature %s: must define 'require_features', 'remove', or " + "at least one of 'packages', 'py_modules', etc." + ) + + def include_by_default(self): + """Should this feature be included by default?""" + return self.available and self.standard + + def include_in(self, dist): + """Ensure feature and its requirements are included in distribution + + You may override this in a subclass to perform additional operations on + the distribution. Note that this method may be called more than once + per feature, and so should be idempotent. + + """ + + if not self.available: + raise DistutilsPlatformError( + self.description + " is required, " + "but is not available on this platform" + ) + + dist.include(**self.extras) + + for f in self.require_features: + dist.include_feature(f) + + def exclude_from(self, dist): + """Ensure feature is excluded from distribution + + You may override this in a subclass to perform additional operations on + the distribution. This method will be called at most once per + feature, and only after all included features have been asked to + include themselves. + """ + + dist.exclude(**self.extras) + + if self.remove: + for item in self.remove: + dist.exclude_package(item) + + def validate(self, dist): + """Verify that feature makes sense in context of distribution + + This method is called by the distribution just before it parses its + command line. It checks to ensure that the 'remove' attribute, if any, + contains only valid package/module names that are present in the base + distribution when 'setup()' is called. You may override it in a + subclass to perform any other required validation of the feature + against a target distribution. + """ + + for item in self.remove: + if not dist.has_contents_for(item): + raise DistutilsSetupError( + "%s wants to be able to remove %s, but the distribution" + " doesn't contain any packages or modules under %s" + % (self.description, item, item) + ) + + +class DistDeprecationWarning(SetuptoolsDeprecationWarning): + """Class for warning about deprecations in dist in + setuptools. Not ignored by default, unlike DeprecationWarning.""" diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/extension.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/extension.py new file mode 100644 index 0000000..2946889 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/extension.py @@ -0,0 +1,57 @@ +import re +import functools +import distutils.core +import distutils.errors +import distutils.extension + +from setuptools.extern.six.moves import map + +from .monkey import get_unpatched + + +def _have_cython(): + """ + Return True if Cython can be imported. + """ + cython_impl = 'Cython.Distutils.build_ext' + try: + # from (cython_impl) import build_ext + __import__(cython_impl, fromlist=['build_ext']).build_ext + return True + except Exception: + pass + return False + + +# for compatibility +have_pyrex = _have_cython + +_Extension = get_unpatched(distutils.core.Extension) + + +class Extension(_Extension): + """Extension that uses '.c' files in place of '.pyx' files""" + + def __init__(self, name, sources, *args, **kw): + # The *args is needed for compatibility as calls may use positional + # arguments. py_limited_api may be set only via keyword. + self.py_limited_api = kw.pop("py_limited_api", False) + _Extension.__init__(self, name, sources, *args, **kw) + + def _convert_pyx_sources_to_lang(self): + """ + Replace sources with .pyx extensions to sources with the target + language extension. This mechanism allows language authors to supply + pre-converted sources but to prefer the .pyx sources. + """ + if _have_cython(): + # the build has Cython, so allow it to compile the .pyx files + return + lang = self.language or '' + target_ext = '.cpp' if lang.lower() == 'c++' else '.c' + sub = functools.partial(re.sub, '.pyx$', target_ext) + self.sources = list(map(sub, self.sources)) + + +class Library(Extension): + """Just like a regular Extension, but built as a library instead""" diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py new file mode 100644 index 0000000..cb2fa32 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if sys.version_info >= (3, ): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'six', 'packaging', 'pyparsing', +VendorImporter(__name__, names, 'setuptools._vendor').install() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9612525340be9b69967826f79f5c0da8a7cf431e GIT binary patch literal 2429 zcmZ`)TW=dh6rS0e?TwRG6-sCY(MTYIC2E&mL<<EK+6q;msA{SL7S(Fw87G^pcegX+ zBsS|89PxyB<Gp$0Kk&xCm{*?q7kJ{FS=&h)byjnBcIS5HeBb%zo8{$@K>0hq^8B9$ zA^+mXym-*K2UWGfaKdRyy5w8J9qt|z?oOR9<zCkjRJg+7{?vWxoe&D+wn!^@1#`$| z5AD3T(6|Rxp%DaTldi*Q*X1kR<Nh)2dcx-cuN{*q?FRe;uk!}{t?`gA9g}XIH~BKW z8{CB*E}E5RBICJyG$?YZg&ZG;49eH+@x#aL#<lBgAau-%SnslAHiY$a$@)pglWd3O zg--G;PSerV1G|vmb^#cY>s=ua6D3#{>!Gw`l1yo62o6j3_TwF)SYPG?Ci7fJSv(MJ zJNqv<GzJa}zOmkisy+f!(vn0()6$t@%PHMry`(Q)PPud9z#oqjIGVfJ4a5-~DKoXG z@~!2Y#$qSqDxuBF+-tkLGBqiRH0}u#Rvl5Xzti%Jr$pM9KI|@QXaHp*5ejSmJLnWL zIf%9B9K^EI&r>d>>I`IOdoPM^t6SM;2mEF)Dh{q+)BW2!doumBf9uYj&eKkj6jx_K zxq4J&hc|kA;|@4BEOefy>TI(*OeczxEYVTaE=Hz4|3Ln!01Tl44e5C8*=wk_=i_=5 z$3Vfi0~NWYR>72H4@kF0o+0@hYmp${_<M^8l4485vbPJ+OQjir%c>B~p~PPqixrFK zfX{m>P;m)E+lFkms0|>z(C^bY$|d+TOUmvOA?YrldzJ})la8;vajG)|dk6*=48npg zx8Vb*frq1bxD)!bJ8>u8#4laB&Ydly9qpF>o(CiRDG*BC#J{B_(D=8-(VqY!GGoXB zc8JI957QL+%7D*OD|VPbhAg<n;*4WB7V}}yj?iq7^I<AjqFA2I!w0#bcV#}@*@ZXs z%+u^NXmS~jvDpetqkz2<OgKwL<Hp&@xP!PbVdVyTVF}s_Y-mk=?x*oEoW?^Jjkg^u zVS>u3bK%F-jw(;rU}Mz;L;O|h!E*`fIT+4N=pm=D)S+UM+=r@u2XhVv2Z1;$An?uu z^8D$<AAMf>rME^V0YDN=DJ9z5^UL5enbgXfZPUB>FW}C;FS}Lmm!zz10phy0AIgFP zdnx&eyjcGc>JRXjyL<IM(TyqjgHGwMAhy72fBfA7nnxfJkhv^B5E3y1kS)!v=INZJ zc@Mi0(KL_w0{J)aY0+0m!SSC@VTp}js@P68<|%-fOYvfuNWs5gSuO{thcm<#+a6{d zRngMO(qN{KOyw-;vr#@|NFdvF7|RT__Y>C3Gc`=BT%3&u*|no3<B8HT*&ZTY+MBIV zUIh0l3B#;1A!veC^e6%;9D(#zm@CtSNGO;ELetO9Qgt;vlronl0PP>d+5{MtRJH0= z2ET(#ql!pmjC>c@4+<&z$&nS|IMcw>oS)+wMs&ut4`7m72SdD7+N2Jx!xPdl2;uF~ z6&gAY4cv3=JF~=V>V{}o_FaKSNi;~neoe08`z72GC%`Xz$vWdFr(CG6r`HpaB^l5F zBGksa(8>}*lI5DksT46EF*vFcnLee&X3LfD!M>)km}7#tC_t6pqI$L2EpQKJRf^|< zj<3F<c(Xw*$3_x_6oAEB0Hp|U1WYRsq1}w47sJ?!6nxd9i08d1l9<h=UdX%<Qja83 zL0(4lA({;|7`ZbBMOk8AqpVsrsC%9h`ptUStiNx2S}ss1IYNQLTOG&=%@L@Tg68<r o>3!B-+{89KcCzu&dnG@{ectAPso$+m_7&b-_NuG9D-S&SKOl*PjsO4v literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/glibc.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/glibc.py new file mode 100644 index 0000000..a134591 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/glibc.py @@ -0,0 +1,86 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py +from __future__ import absolute_import + +import ctypes +import re +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/glob.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/glob.py new file mode 100644 index 0000000..9d7cbc5 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/glob.py @@ -0,0 +1,174 @@ +""" +Filename globbing utility. Mostly a copy of `glob` from Python 3.5. + +Changes include: + * `yield from` and PEP3102 `*` removed. + * Hidden files are not ignored. +""" + +import os +import re +import fnmatch + +__all__ = ["glob", "iglob", "escape"] + + +def glob(pathname, recursive=False): + """Return a list of paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + return list(iglob(pathname, recursive=recursive)) + + +def iglob(pathname, recursive=False): + """Return an iterator which yields the paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + it = _iglob(pathname, recursive) + if recursive and _isrecursive(pathname): + s = next(it) # skip empty string + assert not s + return it + + +def _iglob(pathname, recursive): + dirname, basename = os.path.split(pathname) + if not has_magic(pathname): + if basename: + if os.path.lexists(pathname): + yield pathname + else: + # Patterns ending with a slash should match only directories + if os.path.isdir(dirname): + yield pathname + return + if not dirname: + if recursive and _isrecursive(basename): + for x in glob2(dirname, basename): + yield x + else: + for x in glob1(dirname, basename): + yield x + return + # `os.path.split()` returns the argument itself as a dirname if it is a + # drive or UNC path. Prevent an infinite recursion if a drive or UNC path + # contains magic characters (i.e. r'\\?\C:'). + if dirname != pathname and has_magic(dirname): + dirs = _iglob(dirname, recursive) + else: + dirs = [dirname] + if has_magic(basename): + if recursive and _isrecursive(basename): + glob_in_dir = glob2 + else: + glob_in_dir = glob1 + else: + glob_in_dir = glob0 + for dirname in dirs: + for name in glob_in_dir(dirname, basename): + yield os.path.join(dirname, name) + + +# These 2 helper functions non-recursively glob inside a literal directory. +# They return a list of basenames. `glob1` accepts a pattern while `glob0` +# takes a literal basename (so it only has to check for its existence). + + +def glob1(dirname, pattern): + if not dirname: + if isinstance(pattern, bytes): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except OSError: + return [] + return fnmatch.filter(names, pattern) + + +def glob0(dirname, basename): + if not basename: + # `os.path.split()` returns an empty basename for paths ending with a + # directory separator. 'q*x/' should match only directories. + if os.path.isdir(dirname): + return [basename] + else: + if os.path.lexists(os.path.join(dirname, basename)): + return [basename] + return [] + + +# This helper function recursively yields relative pathnames inside a literal +# directory. + + +def glob2(dirname, pattern): + assert _isrecursive(pattern) + yield pattern[:0] + for x in _rlistdir(dirname): + yield x + + +# Recursively yields relative pathnames inside a literal directory. +def _rlistdir(dirname): + if not dirname: + if isinstance(dirname, bytes): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except os.error: + return + for x in names: + yield x + path = os.path.join(dirname, x) if dirname else x + for y in _rlistdir(path): + yield os.path.join(x, y) + + +magic_check = re.compile('([*?[])') +magic_check_bytes = re.compile(b'([*?[])') + + +def has_magic(s): + if isinstance(s, bytes): + match = magic_check_bytes.search(s) + else: + match = magic_check.search(s) + return match is not None + + +def _isrecursive(pattern): + if isinstance(pattern, bytes): + return pattern == b'**' + else: + return pattern == '**' + + +def escape(pathname): + """Escape all special characters. + """ + # Escaping is done by wrapping any of "*?[" between square brackets. + # Metacharacters do not work in the drive part and shouldn't be escaped. + drive, pathname = os.path.splitdrive(pathname) + if isinstance(pathname, bytes): + pathname = magic_check_bytes.sub(br'[\1]', pathname) + else: + pathname = magic_check.sub(r'[\1]', pathname) + return drive + pathname diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/gui-32.exe b/backend/venv/venv/lib/python3.7/site-packages/setuptools/gui-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/gui-64.exe b/backend/venv/venv/lib/python3.7/site-packages/setuptools/gui-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..330c51a5dde15a0bb610a48cd0ca11770c914dae GIT binary patch literal 75264 zcmeFadwf*Y)jvFwnIS`x;e^XT0FeO(MS~a}F9`!WhfMU0Of(kMsHo8(V!frwIe?W* z;+fb?HdA?8+uGK)RPE!XtyXK1i(*0`7w+JN0IkF;dl=CmnuP25eb+uSNkDzx=l%Wj z{`2x7bN1QSwbx#I?X}lhd!ORlR#<Eni^YyV!?0LZ<4OMl;`e|4X-D#)v1<oe-Wa%T z+-hrh+ql{D@2~PyR6cTF<=qc?%I|*o;YU=@J@<MlwTC_TKkNzKFw67MBXjSa;&Nqp zlT}Z+^ZDQ3clGAh)L-D(Yprv|`<B+Jc<!s1(^`(_qYqu*S}2}(wLT=Cq1J)od3)<T zJb!e5`FyG)1#wA{#WME^yJh5S?8a1Fr)7dAGi{*7@&RHVG-J2s;+ZYN0V_QyoMy2& z=m-B&PfG<-2}$^el<HKWWLd<Tm82e&FBwBYi+!-wGD(DzKV?>nGoydR|7Ez-Vp(B= z`n?rQQSV)(BIV?J_#uF(@5z23B>s6Uma-|8bMIE~#`s@=DAZ}W5P$pd*Y95dWHH6e zX8H7TBzS<6;dt5w=6Z7?U&E9NGo$Du`fABS@~H3RL)QQQ-~X2wP@;3ZP9^%FH(QCS z-W(;m*z1vJ%Qwk4EBY6nF#AZ++YDbrh@D(ZgZK3-O82f<aG+I*J!&ZBt-J)|>g)0y z4wrw`Y#Fb_O08kmS!*o4R~lPQ{gS0sS(B@e&C%>ebK?B!W8*bXZP(IaLDu~G9EELR zr}>XjgJL_7+tqBFqZmzzG+!4A*(WQ;CcK9HhwBQB#j8<hNWVgtn}rnipjT0t>Mc>& zVsB})ZG3Z~)uOOD-av>oEBZ!{e5ZVeJf~@E>L2wt=N6^ri!w|Cg*o0Dg8aUXN;Kjv z5ixre)+ntSsIcRaHg)I<#b~HLcClt}4j6Olosl-}OC=WZ27rrjY`HgpnHP=)y#XaQ z+na~}DAAzT!*3W24zbvqXOU`O0S*uh%#k9`A^1NP-eDFVg2E=!l^6;F<D!A?U5e4F z7;TEJwYp%A=0p%r)orHwTPri0(GwA=CHlccP=djS0b2`T0}K{^z-6(B;ao#AmoEn& zQesbue2F3b5~?VHy(_P#Yzk{tSPx&9Nx>F{EjJP7+sd5;F?+^aO$e;nNSM7Vh4KHH zz7)3C>}r@DQrL-DiBk|5y1~1_r+tRPj>^#`7HNGZ$g0TqsS?fM_oBJl2GuQ%4O);g z(+V=-B_dMmlvd^9H4r(h-X4(FZ{zu9W=B!&r)nrreToRNC9xNw@!Ie}SBq5}<ZD2p z^i)IO(!)X4vCF76)FENkLiD+vZv_~Nt=nf%mCpw1rYNA}-<^@=rBs&Y0T$UPvV_Wu zFc8h5=w;1R=sW<=Ujyp}%!5~?;9V&qw9aZjh~!$sKu<xmXVLTb&@g7@q}n!Z2y;C? z&T6S`Q=PuuhWm<tgLBjT1j$cIp<a+Y;Xj+`y#uMf2EyoGB^LHp1Y_6E_wA0p<t1iM zlvhGOrSwzAKX6(sv0E_7UCRL)=%!*mavAO~_Y=L(L0-^gMHqD}R3JcXBcFcqihONF zz6KDDuMMx0h~x+^!~Itjt!>aI@#7A(7jyshLwYD>yb|O>C7$v25F|AlJMg%xi2)9U zg}o*EW+UqO6>2fuccBguN7PDi8}4AL+ULw_C#R|%{R7oT%nqO3Tz~%1k00JbywK!? zag$QlQFlV@RH&STR{j4`*w<i*m|o%7jn*Zju4B_Sn;E};C1f-rDQMdj_HSGKd8m9d z(89;2i|%jzkHu2VHephQSqC2?Au`EmPnp%C&e;9NlDsgpe;6v?28{g*MMAc%{IfxX zg=rs}1wid$&IE07K(lz~S#%U)8wDE#6BKhYFzXiiW|;`06ub)zaGk4{0p<}mV_yd` zqMmU1F~QU1)fRNv*Jikn?@hr-d@0YIsIg$y#Y9ediobC|jx^R%oj*m*7A2dJ9URNQ zVPOJ6j4=8qO8R!AEOSgncg&*EYYpb`;Wc_~I^P2cl(p+UhBlt>AjSns%R}!^fW!s8 z%m9?JLR<V8;37K6!_$Nk3@Z9JFG)ju%&SN&Z&hM%Wl=iY!e`d?Wmk;Nim^fQ@2Qfc zRcVn1)j2IgwNG<t@#Zwtxm?tVHkYAIc{S>@a4(RK2|N*i-zp$UW{O&wqXZFA*(t4Z zT!&DdoJIZjQazWVZGP-HX1BRM<SVRQVLSMOV>IEpf(hZ_aWsI&_R-t|W2HH9C(6Z& z(&88!%*{8vCCGwR&Kr(C?^O^Eqo1_)6vZZAxfXNPBFBoXv>Z2r>J_$)Xli_qVd$r= zp{U&(!hkuKdKA6MX>3<mCLe$_MQ?FZjG}*ORifASXrGJG;D@>mLl8M-2>B0C+LCe7 z*a(^-%Fp_cw;&7Xu3v`52XzPzXxfBTX#tg6Eb4_J_8!3DYySc~Sd;yPR7sr-vrT*f zG70=9h8M9-$;^+QB;>Sm`GjGFS+c{-?686-4X}dchsagI@)M<1s%9h6vwW9)=Uun= zXMhTG-+zwP!d!RZR~9@n-Xj{onqLB;M{$Ouft+wu@yxmzvmJ9CgLKTdpB-gQihqmr zs|J6Qc0ONmp2gB4gk9pO9+S=acKh1+e^0bn^j0J8COSircT+{~_`xDo$s!-4`{CGJ zZv`h}UeR@JPC%;t6(Wg7KA(VkdkpnLz2`LOt{gLav(k9X5so=pF0fkkkH;zx>@E%2 zhJngm6Em!q#9#!@K|o>P9gb&_scT05GHoK&GKy+()0AM1N@I^h{|Lp~P&})lOU|!W z$MaVJ)c5yrqZg2DH~dGn3kk5|p)^B_*;c{mXM5*UWSJY0oeJB7sb(35&QRn(2_+<k z<%9d&DaJ*KIie1$r719rxGHnZ@mnqHke}9u^wqSrN;v#YQn(4A3d)W;3Xp}{flMXp zaOI+V$m)ft0C6ii<{U~q2+)z(d7+t@zIqfYOf2%XVOotwYf5yORna%(DS9KwJz-TL z-Z?fPcj7bZL(Dw{nTleHEd+KPbI+e-1)Vn}(G+6#4TP#N8)gmZ#|<?Tzo%74aqVtx zKug+bERZ1s+-*Z%NRL~!w}{hi^iXGMt>!<&hN^nHm$p8tgAYER2G?~BL5ih1-iU5( zHE|&pX4iudwG{u}%Bet9XF7%37f!*tp{)Mv%i`aKO71SD`;gLj+$IPjeswH7IGazy zK2}=$K#r8iP+~Ll4EHQ-_>zE__3OumDQw>oNpH;NgZk&b4!I}x<u>64Qa-X#^P4NL z1St0kP+Aw}N^5_TBPqF?`@z#4KO2}=(PzM+H=^cu-xY9>R6_Uw6iXy&ZDo#t;|Vik zj6is~H)9gsx!!;&T=VC!870n%fgfD}aYJ=;Y~_g%)J)zr9z+)Q2BIJcup|@pspUNR zoHsAUzd-&Wy~kNOOIo!%w8onJ7m{Axh3G)#xk~q5{iAesKsdKiiDpCCE@rJEz2oXo zV|;*CV7{c|#ikCPH*emG6-sn4QB}xj)4nMNJQ;O^6{9g^v}#>V(%687GU0!y=9uLi zi=`@$@<(rkgmGgw$_4Oj$6p7^<H7OQiN7ALJ@FJk4x*1z(_s9e1b)mS2(;6iD1;}c zmrnZW(ROxLXL&90*&xdPDCp~dnC&gjY*4)z!mbVJ>ZE!se|7f3Qsfh2JH`e;uBIbJ z`#g~qVogm-)Q%2r0B+MlI(Jr{7g}SS7XOxpZIE4dhV-wEV&AUN8jFd`n&R4BYFkKe za7qz|I+NAY>XEE|QRLG)?_gC+zTU4i@@$byy(bxUvzcR7^7Y!j9D!uiWoC{`lCKkc zs~DS%8ER(8HeaRMX*5l#Keo+^Z#Tv|yRxXOF<s5TXw?lyuM<bmKTqYz{sR=fF$aU> zp@gb~=n{pTl>?JwP9++gh_Y6ui&0M;r53g(=W`Lu!F&s|Hd+6qNA9xN!)%v2RAvEZ zae0ZoyFF~%1s)fkuq#yFbR8R(t+2vurZ^SbOlOyDlhiC}m2A^HI+dph(Z0<g)+VSs z{#!^zVlEXk8EX|1cJU~>cg6<5T*pX;hBP-R91VLtAl@+Bpg^AHX_GJ-V9QNg#r`0S zJUKVf@<$tgNQe3tkUO9EzKB5!W5s=%29F(sZ0Orv%#N|m(b?V##eZDQ2>ZX*q_BU3 zDy;#7v&7%RFTEZK`!{P@O2Jd!6^Pb81~*8C)epk{LuS%SN@_8aD6Fmv`#(05{y|B9 zGm|K+t~7hc4&)D2GsR9AOYMe*N2>i(waI`&9fvWsNsnVWu*hq$j0jl@eGOp~Hxz8f zw_AxlW=%LLuT8ESuF#J2YXudKQ17KJ+CJdKw;QlKAlf8G)Z3<Ath%PnQ3p<&qG7!_ zny@Re2WYREKUCYH_z$TUhk=2KVMtrKJHiFaMNg$CUhd!Y4*s;LRbi*7<>S=y2n7(_ zsQ9}p!@z_(F3h$kD_Du53w}Z}pn!WDzg-jtQq&S9_d})N886{t!S%G;U|3hFcU$@8 z$dv#vs7uK`K)FOklSHoGx}@H^>~h^OudgBgU#N?1PT0XbE5a<|t;RcH2Y_x^Kqw-B zU8!-Sm=V;-Ac|RuybDm#O(^lP86`jyb%QdriTutnL}PQk9?Lq?5%x(;*uqzW7qX_r z5D>{8emOF(0TZ`Gosdni4PFG&%p*~bR5y3sc?YJHpi^*7l{T~b7bPK*qmP?nzrv1? zI9QDuNVw^453$DL(ff-hv?Gi)p?LIe+NpxqhQ0a46LyN&7KLJ=w4tdnDI{Wnu;S4T z3SvDFWMsVqE9`c@Pe_Y%Xg8`t*3mbX^eQ)cS!^GFRs62|v18H(D~*lW^ST=iLrXi_ zq%^i=$NzlBTHh?^U;*1L)jkfm`Q=cjD$znPffWtZkLXZ^)nO-u&`j`Nmm`zb;$7-+ zR^5u&TF2snXvE0}`X~$Fbd)=hqoB~KjuwohPGoc4MA-)NLzn=l9yJwacZnL(G`BAD zq%{}jU|JlN9!WbYEwlDtL&Z8A(5EjPiAklD@6`aF<8}y`(wp{Dy~CNfnRW~w-)?>$ z*pGr8yGLK0g}m0K!)e>*5ds_p!Yi+^Sc0rQf%4S>qz9!p&nX34bV4(hZ&9<TXr8{3 zKt3glMLZznCyYe4;7x*mk;GUAl!3O=Mgt&0TYY3@%C39_WIu@GiJKHCM?Ro25718@ zsq3oIfY{_f>Vsw?A5bsDQ<;Hy{zq&h^as89R@S~KgR~5JP^cxuUM|nq#+RWF0<^L- z_7^4z^o>8s02)NJF!=Ji)RIUG&DeVDjQU{%vD{4Epxr{t?Dg1qUZ-?7(pE|P=(^aj zf%9rUHl%qq$9trOyA)={sxS~tPTM3T3@kmNwW+mt0T$&>BW&9p@@)v!HmQvO)Ys6Y zfPD3KqbagmJwMW=PEZ;TWg|Qq;StHOgm9)AZI5(mbyN(UFl8>bm)}r;es1BOD}gHJ z`uizhChrnVP}qiO$?)8+7#;ocW6SYh+ei^}v<>O#{76WSk01s+IOvO#k#@Gl*eOb% z(bk(70HnBgARFpj<3t<rN)Nr5;dx^z3?a1YBB4m6xsSPdoMdHYqvq16UTk9h2PzK} z@5rN8FhTpWlWs{AKrJI6L1JcQ5^bazyHX|N{Yxf!joFkwz5ZMfEZeK*pr^|a<{5sW z32+kN4^zbDQ_<U)`=?vz;hKpDUy6>QsoU^=0Qltf_)%hG#)>S{J$NJreP0Lk=@Y0q zbu0>wqPqWpy3tDs1nX;)V<l;ZI}P#Fr?dJhcq6H9a{4dhfg;wy_66B7flodh_*|h+ z|0DDYRw;54=x%Y;(+fhux{1pWtlclw?!YSszj_QH@Lfz{NTsBPscn!Ve=-wqr^MkR zv4;{pVb(=3VA+8fi^-+vUx8smE1>vKS7z}8Q&3Mqx|WvsoFbrHmG~ZtW9__&p3!vU zT{N0W^{zJ)@cIq5?fg}|hOzy0g#BDaLq}<JCt*#dCnS|*gUkdZQH#;Y+Keh=uEU@# z{?;jQr<i-78FieZUP9Cg(g|mnh&hD?39s6DEsmw&V1y4Dyv@l!MS_g2Y!(XOX}Bk} zkn{!YSI~MuOI4tEsRD7+K<$qI7`s9d#*kU#bMQv0f?#ZhHGYFg+A6f{h+-S!(<#QB ze|*hFgppQ4%Ax5L+`^wtJ_li!Oz-u{_n#)8yNUb|-<5AZcheKJ3KHb^P<2tq!DD#P z+)c`R!qh`Lz?C$X=qI*cw>N_{Ru|u9vCJ!QeEvSxt$UPm$H)%|b(epDcg5CRlTT(< zHPg30YKkI>>(^vL)|ywK<n)it*H@FgKWJgUoL=Alf~R{BEB&e|RXV%3BD7J7Hr^q` z1KY0@3WdP9g6UaU_%sJ!a~W6=hQh*sc4?9s@qa--#7jYem}$uQF%~A|e3EizQ_eej zb27?#E*SU<zEYz6k7lgF3S!{{kYKn=Hwi2~iak27mPNQ0mGQ-aWM1M+d>_<!{C*%^ z6dy=YEr<fNTTu%pX*zUP|DsH-(_ko#EcQMqy$Ly4UW0`NOJ33DFavFnNO9j`l<T2M zQ@dZIV$Gl~z861<QLIOQONe<`-jT8zkz4t8{H|av3CC(;!{L}I;)U4lIU!c%39(Ov zNCM_KiNAxz3}ZbhK12|j0{w5a6ccfNjuNf#kk0E2{!q*wbr!R6A@-B};@pE>vVC4L ziBpHdEH2gl8;!wY5LH^CBimVUmGlJEFCdsZvshtI*xw;N{sMBa!jlx%e~+;KnB5{p zNV3%ZR&^wJG*Oqr-VfPYjGbT~bwn6TtK^y`mh!5HI<!fOKD|2!wW{ZWXum{=zXVwb z=o}=bNQiAS+<OqsX4*~lov3UFe;54>v1<Zsmc6*V7*vjJ4&En)Y<q-WeVbrPhMP5E zpgurm1EO$Kw*RWCAIGo4sQVfc^Fr)VkMD3O*C?2>U^cpy&1QZR_J34)mD#<jD-{2+ z$}Gj-Q<W}v71=%7#k$|34n(i~J?ezS2!+k|E<(><gO+tb5O^rIwaCU!7%r)$DV6^a zn-(&d1Ta>4A@%^CRSL$dKg&qTwu`;lLjUN&>c%<f6vICbfD_aG4Y0-=zQ8Qh8=z}% z*X)3QD1XI_DWjN$qA|nqFjO_&g*haLY31SA#NDL2DenpC(@t8n+%@C`z^@wu<VEc# z!O%4<Y=xi;$evM~(8Wdzy$}@>BcbX&*;44G0xgA3dO#ROuFRU5IcbBF1}B(n8_cx` z23YWXSX_m*6$@;hQ1MA?@5zCHx3B6PY*l$9m{?7Dj`1aQ)8$?e>ID3iXQ#MRN)G9o zkpoP%Lo(EVnvGd48<xa*`V6PB$OT129gLr8(yGRUQ(E7~Kc5U@gSo&y(3VIuY)L*> zyL)L^$N+t|ZLy+<*s&1nWcvd3aoT9H4+8buj4iwt6ro>jsP@|Z%MK>{16hz*e1K{+ z=NDER%%qg9T+}Cb1qf8LQia9UtdPD)fNUL{xDrtK>Wjrzlzo6^&P6k@YojG?1fLF! z>iHLHgH1qQyP6xAvH)P)4*)>@Ib)k%^Tp0Ij0$sf9mT`6Vz(lOhGZ{Ez4J-*!3<m! zVmpgj9CM@$CQdwN2U#Z`G)GGDSHkBWHH;!CM*RCUnLh{O^X)%dw5H}g{LMiYOa3!r zv#Ux9wvBZ(*-hD<)ZnKe&dT}@qpL6{5RSQ?*<lz`?ONoaHEM_p&zO55z?J<i>LgN1 zPY9PcAY&CWLj8(e*I3eW7eCNYT5OB7Rl}a2$bjAgSxS%v_=ZaR0xEqjl^!V+;~PjD z4z0GS5r3+YN<sHst;&24;QgV#BmmA2^+jea@k`Jbft2Iwn}Pa^WwMRU_6F!DC^PII zpAxDOdFml4a%cc`@fo2rk=KzTTQOQ>|JMpktp7mwrRA;25i9DLR=RMABCX#vLt4Mw z*$GVOA4v(D%r-0K8<cXWtcSHC>8XtDZ!DI^<94()hi#VqyQRpZ00$~&DN=_8NdzuV z1rn*GeW}38RNyygRzGHi3Jd|*#5d_ZbEPMjf;~u)YJjQt$WnxMWqMDc6xm6m*;6D% zrihqprN~4Pn590X_moPJPsQ79>Il8(ZYe@G551>cioAegam7w783u5D6AVWi)Qc5X zioibgJXu=%X{Pj!rE17;vEM2|DNF8#T|Mz3C_&gPi8~Qe*qGuYsOJb2TypouJai6I zUt0S`W{BNkDe`yAta%M)&@w3qCGI9C@?;~A6d~n0+DTQdNWn2#s0b7n{~Ar5Raak0 zb#jsPW^oT$5gU+?W=gP_HSymB#JJ1o!x&UrO7JFz%JoG(cni{7T_joJ8S#u417xI; zlb9t?y~!i%TLVQHe5}+Bh?3b+DRxmB0_!mdmiPk*>OJ>L%iSoa_uRL1hu(9)6amb5 zdsvG6O9UQ~BEJ)X3iV#Sr%H-^3;v+@Xi{XWh+ZVszK@DlpO3f1ETeT^uwXDu8+v0J zAlJT9a<?eEjwQwcGlY?^zY-WpWEic%{J|=CXd`7ilDh?rA{b`^I<O?T?5zDlS`G5C zfHRcILYOLweEMja{l?~?H=HNOZv46~=q*mnl7;Y0X+bJ9Ffl#EmWbi!lOZT!>YxQF zvIrU!xoe|Gb<B%inMjLXnZjxOK^keG%9N3?nkqyoQe`?lvZ^wQlhl-$BF3BQ7>1ex zYI?EsPEk){1jY}KY!Nr0xEx`75i5ea6?t66{tZi<q3(8q&1qJgAu6u46|n{k&l0D+ zUW{#~tbf{F<Ud*@-EcIBg{+LsKN!1rfE1{UMz>Aa3?wNs+b$d1W&h@74%Dqe^MQOJ z%-QZEknLhK^7Nj9r8e2tQfE_)Es34v?L$?_?|^EJ+$Jawsr`Y#Yf#cjt3o6;u-cy| zMIh&bV{9>y)NIR(p9K1~L2y&KPm_~C79;_bYfe9h)TI~5vGsRQsq!8CQOKC&!}K%~ zu&Ar)*g>%F!~l6cWu-}pz0`{12!i^-1WqaC*sVnbx8fz^P>5EEAcGGQ<TX<x*o@#L zvSPnTm9lq(*xh-IoiaP=Yp6L`jYxG&(BBCGg1L%OHFt`7AQEBX89RLq0{T(@9u3M? z*96M(xrbUx<*4>wq|vy10a|RL<>7{@f@lam!GhV|QmJ+(`X>hS5<;A_DxE0sqC_U* ztZFvB<cd8*bg@@S3`T64DzbPI9K%S<_iXa1nV+kAgSp*E&%$zxt_EOzW*@xf;qSqe zEg}d3VT#?uhrv3ItWI?Ve(h%z$m7qU0ICl98eoYkQ8j<h(w`_S0hJbnP+}xRGC<l& z;749fv)$OC=$q2`4D1Tb8KGUuObsfyx_Vw1%CGrJ5SEML{Fi7$WIe9EAiz&d5D%<L zz)c`AvbPI+2yJuC?5HOIdRjb+pjL<V=AmvL?h-Z9dQBuk+!=Zh*w{fgXeqUlDa>4~ zNbJFEoP$Moe+!Ty)-zfGvC`Fg;k*#cH#Pet0xUO0fIqjQ;!{vdBZ7nwGR=Q^2=WdV zMGxjVO!OqJ^h&<a>w-W+>QwyBS99_Epz6Z!LhaW?6Pbx8tFL}ggMFrjUb7O_U=-Q$ zg_uYPc;XKuP)~f~3u)RF+OX<n*2}a(@JL7#QSlp)Jk2NKFYS&0Mv7la@pGlf#q<Qr zJ)fRnv}5TB&N_mgi=>D|Ppo(8c+v_rN04nmTD48ASG)(iNne-089H|$3gZXlLzLvx zzBLRW3Qz~8ekn!LK)+{Z7>x|Tc>K5E<>>8&+Q=fNiD?OjB*lJ%=pxn~e-h8aSk@|9 zu!AvG*%@CVQofFBse)tVBzMH1gDhrCvD=UY<iNO;kU$NyV_DTyJ{DAVQik|cv#3Xv z(eecK68z?><MDfuIuyToQf-b|gEKBAtBMaW1J?K{>_G{)>G7i!(zm9?4<SJ4sGy%x z`k75XN)h`QeV|}TTx@NB<RCI5&oI)1kov)sRM*bOx*y1YL&%fyg`iUC0eknX71(Vo zf^SBdCux_e`C<i#jHar`aKD6Aa>d$GL<D2^w2~#{0GbK2_9CAV^0#PC5=S2+N`(Iy zwBs_{8g;3pCU;meNuktURajK_7%X_1hTL2@Frz5?SQaAk@lue1pQ#j6f|zhfZz_eD zeMA4kl}*fb9wM;nF81CdMM7ezF_+P{6d^lQI5yv|l;?$P->$PjPASNd!a0Il!L1|~ z1Ki=*<tMQ_6MZ1~$C~h?0`-1u&rUPPCM3(YjZw#22!vwH1blCm{2jpM>hk>R?}r>7 z45xehT)Bxk9-%Fv(c*7f908$>DZ^_b9l%h$%naFoVChmtzsgV_!0&1GUTl6XR`pJL zI5C;nAj2JggBGtAH54vCNIqr|zOjamEq>rri0xi5fdS-r1d+)iLsoExFl5<lN%_L} zU1*j}m$BAmCB!Jb4`diEA=)@MJN+jXKVHO8D_F+?<$?XBifzpM0|2q^H)u!bKdla^ zp6RSkENd=w*2tK71})Kg<F~6pKSq)NpcI7e`PqNc)az8p`{g=9X^~J#{}Ryz_?1f3 zC#`DGd(t$jEsz)p`=Mq>&<O{MB&<`CusV#wtVA}M6{b*LrNxF>VaUctU{TQxo3#8! zyffEufN8irXad`F8}gH?hDa9Me-F0)&`>;<SIo-udsP6W4~O0+9~x=cH7+D-{eHW~ z)gUMWz{ccrup@=(7J37h0~$5*rGbAZXa^-L#OzQZd98j5?eeSxw7!wHG8XY>6NzGN zqGzx3W{Kf$d7V)8jMqucV|fl>Rl!{4r<UOz(uAL2$`_0*K$EXbNC^~zS4=Ct2suGi z3mXaEJ+PRpLFt5tmK+Y)NZK&#?|Xld;7O*F^gP0DA-jx<Xpz4fPs2SJ(D~X}yWuuo zLp)kl4EGlZLV1w|1)4Lar1751DC>5_uBBSUP_L%!@Fzv<!e;Y5`T(e=p!|2O?*dV< zy&-6j+1EUfgL3Hhs4!SNHq0=#lBPg`r57v>B2Z$YurPBSjfNRagJ<TUZSs5&2yNp7 zv~VjVh?HQ|@`N4%tLpoo5{bZaAB+W@{tPwOXb9PM>OB`#ejSq!>pg=P4p@!Nsimo= zF$l_9Jse^E*dSTD21cHzWfp9-LzheXzJ(^RFj2=G2R{SG?NAYAqpeABhC%u*{nEFj z(uaxkUYn1vU!E6w^T19!3JGwCdJ=Jj5PLXQk_~~wPsAThLnWkAPU)}C(2J0x@ezF+ zez)_vJ`^|IcP14$Zu=IdV-Km)TVEyC{U;9LAm|@61MxCDAzgdQe@cS}yjT4KiUJ~& zhMnHEVLsM|3g|Q!;kW`i>Y)Z<&W~eZ!ukpVpz-4OLjX%QePMy)z&B`mJT+Z>M$;{b zN7J%&?Mc~xQbXas#vw(LO*91oX}5kDhAv@h5-`AmOaOTL`hKwjw{bvms|m$+%)3_z z0e?&)Ko(FO1r*=N{%^GP{|``n7w;)wWnY&d<U=y>j}sh%df%t@<-YF%v-PMz34ob; z1~6|R9=lcm^R4XvR$JGPj7@9^wU{u_H<2~%N}=ovlL6n=10^+irB|ay%+V2i7UTqs zg5jQr7)YHbupxxeI!Qh$`hjg<3}v3LD|Wq={}__NirAet(mMIaTsG8dS#p24{1Yt0 zPB^Arr%&s!s3q62td1@@M_04?>*yTu`T<5W<O{EUV%XwKka<5uFv^8(F{~Va_&d>q ztJ#eFh|8elFdMT9?=yApCl;fLnoB$>yjl1`@Iw-4#WaS`6d=w60VMfI(ig$Q<QyLc zey`UyEls<+Th4({U{SAN1-XxA<0Q;Q{2X!sX0x(`tOcF_7@HhOClV{ni8MSa=^dw{ zg*l0IeP)gaPL>LrnXQ*QMYAdtkkQOu(i6PHoU^3f!-A2{F9%;pOy)mEH!wdPv_PCI ztu4<PROP0f!Ltz6(d2V5Sz?K75XxE;>m-9gmkFJ7I6Bvx)93dSWJhq$!W;tX{|cXh zTu^B2F#OYB!6`N=_5>Qmc^@Emsa1>wx2Qjcv6@3|tE*+Oh}7?ay#ncXQaa1xVu&u6 z;f|~g;|0V$umVrS`WZyy-o)sl+AeK4GNoZ0N14g86zm3!li<LcBWf9T2o<kE#YPJO zBsKu%Fp=_#>PC@oXt;>iVvB~gX)cy38Z+Tb(j;=n(@;b2+`$+U5^_u)0&V%<IzYQ! z5FpvV^~ao64UV_XLT)jd6^PSdvM+angko7(_A>dP@xoMb5u*S3F`}XNhd|(OU)&^= z@#fG0o_vDGoG~Du@)pI`5YoLHNlMt?3(Fb&6V~E!07Z#ibQ@L7PAKe3rM62QtuJ$0 z;mFG{V|TtxDckvC@=(#wNAoS&ivQGNxLgYhcb4eE0K@$PWdv+=KmZenm}wt}Gqu}7 z^XPcx05aOz6o&2@6LY8-<^$-Y7f<3a1bjh+-UPOrOrfY4!E;7Jxq1B<&aqMnUjaV6 zgQ)(5VuSo~(M_m0q%S^&iD75WiO1GV0uAvdkY|!ROMD7mTEsCyVC6PpG~@G-YlT@( zyI2eZQT5Xvldn*?noN5~v0+aZ?Mh^aqH|7J5^&kt!tX&U=+LzQ%^PmzrPOpr|IZkd zJIpyPH2UbA5}W=!og=aBSM+HI;LO8G^9EK1QDZRQ^&vr>b)auz0#~0xNg{AXb->co zPAdWU;-%zwHlqU?BE{cQ<>iX-yr1j!^xF@apz}Mrg;nYfMSAs^Nj|lPA_aS}nCV8x z!W{JDk5Hn(^BEl7a9@btU{TgC(x?9#(H5w}F+tuMD{!+#sok%>-eSWsIZNVYdKqB8 z5YR-3B#C^#JVc8qAeSO1P?kKDBBVp5<#jJPw~UkP;nS&(BE1$|lJ-bXyhVZ7t=2kg zvu!FgIgo0K(Q{d@F0ep!qzQ3a(tnLy^=WX&B;8n3^;C=Y89W+!dp_Kw^DkD1R_D)w zADPHp^^kcKkeqPJ2#F&TLy{@8>aC(Yl$WSogX~5|4rIBc-U_I4r%h4EC$mm!w&AcA zoXnE%IcFD*U29eR%?q-di$IG1z}8_MW;49#n{6~NC-6T|6bW8uOXLuYUc)XvwGLt` zohjh;%^4zw0NV$Le6eSh*)f@Q@}9j!Ktb=MptNeg99e7|qm9MX#-t9C=UE-`vl;NQ zx^+S`acpAjf*yLkrJ$nIO?3+mCzzdzgIjP!pfP0|*e-bu)=sd7RtQ3ZPj20sili-g zTl_YY2hzSn>^AtV<nBYe3KHI(*iO_@1u<9bOPV+@{5Q$DV-`V!OxuQ1lCQ8$C?o8b z@;z0^3jG2E+{NA!iz+LS;W4aK0ZdGkgabU#k5C931xG$ArLZTA@+GAIDkU9B8TJgd zs4Fp^_5=cesKbsnY3m|h^#-sa$A3|A<~Ss3aom2G-Xda`g~U0CZE;+R$bqz(a7;!> zY$upwSG(Eld=%c63|AQL*Z%@Vx8oV)Ggp&WCV|><-su;J2L@(hni=jTc+saXKqiZp zVdi@R`3(0QB&?;T#E#<{DpRwOfc*iv7!w7C(D-^RX#kttIN?5b-!9S#?N?$;vgO#! z0kZUFQ!sjm9e+;zWz9SKS8${s{Tn56Pu1JUnlk{$b~G3mV(^!-tffBI+Y9R8pW3MC zhbZNH*}RzZSn_bxm;67f9R!8r%{_RS=EDjRbA*N9?F#jc;okDR#R5k*;wn;PI-cg( zSJb89(1WqT-&FZ+eb9R|RI%_bz&WFv6BkIUZn1*28-j4q9WLkYgp&NaSlEsuhcm3N zd-$U}LH<zG)u%@qw0GGxSz>cZ8ng-`6?Tms+bNS&BHjvY4wAkyf@JvbuNM2<fCc&3 z%~{BoPxL{S7m#M2pfOT?Rs>lS&LBdX<8z^TMH}BK0uFX&5%`lLE?H^{O40V6AW*Qh zVN2a*v#MFu1GDQR!>B#7JJ{0HA=Lvt6oaC5HH4`|db4;!$I?jt=Xw*iN(rm>PU31> z4Xz&pMEpsP1w4As$c0YS7n|WpWXbe42z6n(IIA9<RWlm>?^a?Ly4)*92)fl@z+Z;o zqcJ?w6NLDWaFg}$|76er_pqcp=rvdeq4?ETH-JLn$)K>OS0j*kc#R7W-i^fx%jKUa zjw*qt!I(@egldphkaIe9n*m)u&L8ciTFJ4)--<&mCt*7V6@By{D)lo_m^t1RZy3)` z-2$&tRA#n8x^2{krF5o;KLK$rxw{g+19zF{f&%6lRoGYf*7soYn)p6uwM9R1TASG7 zXhs-F#@q`$i?u^|kj@g&Bza<@NI!8(8`9!<rZ?vx<V?J$pE#-E3=9}gi=#T3#sc=l zx?aW#aFeENFn2K2+l5?^vbhs8M?a(Qp`SEci1eT?2!Wa6yjTy;iNQNzJ9j`Fi|2qE zAou(Sla_6PeIUd($>bbwDaeP?83Eb0HDvpO+&T1Pj>>qA!66(;5jtsI11ma(dyrjv z6T8*B{){a{lN33K2%45+_k3wGvROo4e-5d9h^z3C+pxP@YLDKT6)b?DAw3ZjIfCBv z^5=NZQ!mOdwW^b(Rr%5?#p*w{(4D&jbzV6J099w$L$>!qxm&ew0a#joj`pq+yXM?A zr%^$*(;2dD6lv^wdrka#Obd0A9=EIK=y8{tE&I1Zv};O?T5ZSTlNh?1Y`cl9)pjQy zj@5(l7QH4b7@g-#*rInr$F?*ZY;Mf}R1N+X@4&NQ%$HxF$F*-l*uqXG{sH1JUHW=< z^;VEe?7@eC*)fmpN22YpycQK(ietgU+2lQtpQB!qf2&oUEUg-h^AlG8&V^(wxpa(N z54+rZveQbj#kQ^foeO~c#<cvA+Kv#`m15h!i*w)8)&X%fUs2x(Qq`+}Wmj|buUu*t zDF#NZGyAsA?AtoCZ|g+g?u4iC&Dl6<dDt#GCB2zWOl}^jNj9Vr-r%1KSsi;p(oTdy zJD9}V!1+n@R!v<6!S#B)_v#q>>%d90gb0CcJ-5R?3+*P)CfT3;ktQ9azx8;7gNMJ+ zE=8UMEv)f?4EY>*+d#~Q2uGUf#fVqfugz)NDz6q<KEtLo>W7gJN^<TbwLas>T<aB? ze@>Y@b*rI`QkZzbPHDsYWJlVn4&o=jg5w(W#}i*gloA!dfLB<%o@hn6G^rL&=$0-= z>po0esrDq|Ojc0$4SBT{+M|w)1i&wJMjZ|j$cj2F6xc)RHXLQV<?kSf<Blb8_Sh`F z8Jw9tPmV^EI;=*<2FjB7*vwjUoF>4M5y(~_9C^-+x`@?tVQ;37Xxmt05c60v3P#iV z$Vgf{DOVo++RSZb;zP{v5#VoNTL!%NnJWV?)K3Q=hJGs1F~`~|)n+w2(eyPspGyu% z=K%wM2X6@Z{|)Opb|0St@B9|HXqmQ-gu@54ekIeX?_P}p_Jxpu<_h^OPsTn3Iy-&3 zi$rd1*cuFk!H?j##nFAlWP7w5Al)9=v$-!bH!ZAY68a+a0uAb;kXx!~1LJR0A5xf3 zidoX%-L2<aG<e=JkBDefhwBic2Xnt55Jold!mFqnmUCu~k^OS)oi1`vrQF&t{#$r8 zqOm+tvO&F;8k>Qt@+qPwPE3UF5_y<{sCTLnq2%u1Z<}!?lnt-1n6Fd~f7T3_Qc}#} z0W+l)XOzCC3^4@x-Oy~H3Ch4V${c&FRJd3m``s8PrQq65bqIWoX^)UWy>;+n%BL^u zp_P!`;Ov*;6DchoIufnDjUh}5QM6ao;RF^Rf(%=?VkTfkt04pkt*E)e)tE?ymNfZp zqOk8hg%~qECYPG#VfaG{`KzF$lTJcpW6MQVq~XNsBEX0x1xH=`;=~~|tA;fVQH zuO?hrg&l!*ZBGL+GLG7J2CZ1$`vDoWf++g|X}<RXX}<RXN$>rE9700knLq}uIOKU2 zkRtAEAcNLAf)dAb2+ouaYaew>Cj3tev%z5)!!M?zb!;>L9aaFGuT{r}@G=pTK-RHg z#QA2&GguVD{+*bO#|7u3`(kKDkRsZwm&Zj*?J1e(M<@aB{glizh_{LKryGE%MD7~e zA@kFi*(;P7qc|v>euJ*^o6#(|rkUYCMCU1~W#@KEApt?Czqexhzv;K|3WsIWn7EEY z(CHWx*HDP&Gjq*Dh59i=bs26-*Ily_0V0H(t|3Uu+>0ltvN){}bKLkGfQi<u1WYY5 z+~D!3A%;q!<{C1R6gJm%(*t<9Y^TUfjN0T&xuQ!<rx+qgGuDlMm_5oA>Ctr!NQYvY z%zBPL0aZ#=7g0<ggJ*;JtT0RLrP)D(oR|x#{f&Uxa4!elG1pR5z<LaKGv1Pl9VMn% z*OET~m$^VFO&K3^&7!v0PT1*0-Ytk74tehzjJ)CgZ;I1rI-w;_r1NLuLcoF`^n}RU zr;Sg_iyr<HbFfGs0v$~@zi3;(Ap(U-5#hPqD;N`_WFfM;fs&@7e&}5l^KFXxR%*U^ z%r~K9aPT4KTZNfsH{TYSZ(X8$tXklcs{PE2SV<8vhyG_ggt)v7@#bj!3>byH%~n$u zY`k&6qD>tm7TOUgQnnq@DKUEh{}sxuFbiIfMa3MHpjky~7}Z=-0v(0gOYu+NiN#1A zg^KQbm)h=82kBSiG#KT08_Kriu%?j@F;=T91h{jOtgdgK^1F9n5!wn*4h&HlR+hhu zA<Fy>BnC$eO_0)E5kqWljBov%Dr~25zJ$3RAZeM#dF`)-uJl}NfzTSAr!d^>5tkh2 z)kM}9>@Aqqy)&A0qy5#QWlH%moZH0qE&z{K{%R`(mDpWYx#k4TiiJXh5=d%Lpg?&v z{wGw*x=CgZG@gdz)2i+KDtB^63HZ(p)V<-Q-Fl$zEpHUh=7_f*4_IZcvnGa8ETtlr z5^;tNSGb^U$Q=3Mq*8*(!^Eyt#)g@ago*=OS#!5~I8UhKhUY`aVV-j<Np3KpVj2Zm z##=FA6Sg0v;uIX+c4O*w$YfgvfAKT@`x*K2WA|?Q@<$bCl3@U<eSFnNP)W_qQOY~J z8Xt$z<-<=%@E8cNg=qou^ku+NS0fzb_y&<S9%+e>eMVO!T=k=mIlCIOr3iJDjtS}? zorXhrbY>3h6iCxMzS3LMV5xXXIF?_`ed{sGrZYN3z=`Ht89Ab7Ld?B?s4#K}F=!Xo zXgH*kRYZ!=UW9>2XJzL;kPXc!t{$<mLa)*4{|Zj$OGgIbfwi5lA4hy7af{yO0R-`@ zK`Z)cL!F?XK8<q%Y`X$Af6U$RIr@fsEQI548{7o4HYCzPpgAq*r|k5oBYeBrc5JrO zxEt~<c>+k0uRy(+?AcIS<keXd!`}v2n4dTaimYrCFBDDtPf4|#kW*TPY{c}i(|Zsa zENI%u3Ur1)ILrrOP^m{;nTB(Qm)GqA^teI<*Eji{Y9?Kj(vYp67*TlyKa&0)T3mx2 zhJ_nYG3Y&T=p~uljQRpmU}7$PdI2_eNV*$IH3kXI@CHQ~nxLExEb(s-LluyXGyg#2 zwIjsd=aDPK40E5YujKm=pwBV)G3@@$yS#jD&5kco3pUXcejysX1XaEG3{~&ijcjXA z5XbiYP=)oPLf4DP$$vKlrRV~To@ooNLGfQwWGzL;+>d`OV4Nu`4(ER;i%#NrB)7nF zg$ejwST9D^fMpnppijiBLYMtORy$=ahrXGz726taV8Lc5AN51o-~Uix;TOLrEM$A& zP=d<q3NQzX)?g<BcJ#=95iWa(b6qO@MkXue`(XtLvG9jZ{@P#yY4(Rs6ThTnQsDN9 zS`4=XSWHUwLZE*zDbU|3<TA(r=I9Q>RKS3%Ba-6}s>EQA(Wi$uVz43b(>U|z!5d8* z%I^>&DIq1>hy%5;>vH(F!no23Hp`ciLM7^W_cK5cb!?;u1QkaNM#TYizM_wr_U##x zHZQXJK|p~X_6T3rEY>0yLk0XQ)QLNUu=`Qz^<rv*wTJv0rN^-X6OKZ;C&RHv;5&87 zDLo!R9NCwb(JW(~A^)bT*=sG?c=2ygq!~LE+fK#5vvM%yc?Xa~)d^+ED2Q&*dEV?% z{2x?aLut=Zul!AFfzpVB9I<nHpj735gc=?lJNhZLv7J9DUXeP}$#pYnr%3vcs^c3s z5vW2!2$-{#c33oJ`)&dxnT!iQKt|E-cHB}Wa4hg+veej^!oL9g*z{?5eE(U^K1t|| za-+?1!~WlvYr<mx4zzVZU?zVV<^?cD*z7=TUs<)p8FClI%iezwsn?i?_MEDXP5_rH z({O7EJah}_te%#&);yqhV-9Y(JKD50TrN+8Ctet*7i^7CGzW&kg}QVA^s|<nA}IOJ zWjAI)60gi)veUK!l6IvelS;X9Qjvd4<;T>5Da0osAY8)g50{qL|3C*g+ETXY@x{4~ zSfeSX4s(m<l*9twMn1NCr`};ritXaEIx!wT8cS9OF&6aOrrM2N2@8KbA8+Q^pdBz5 zs7nmK9J3V^aRKdcDRBeI+2($@zp&tea*iG2Hw%Z${epg>L#rnq%Ia34op8D1rET=K zt6-`+lw7{`4cSU#hh4EX61~PLs`s_Zj$F7Q=-m*mc#7bF2}~k0oW-P<y8<t`e!`)- z!qMBD(CnU!)2RtWSvBF`HbOM|*B7aC(SOo|U1!&iIi*@I;BdPE2XhU@uWZ{~%r*!8 zyOvxSYW&EK4fRT7kx7l*m|Yy5W9?zCgYf@nj?eIGYemk*`)a2C9Cxm=b^kzCEvrSR zr;fkGf|{u-kdlh4p}2c$rh?D)#?j<WTwgQwm;K^uDQ;@b)L6f`$0_c-nyF9ri+h6N zhSW?2_iNBH%yvnBV!tE^#OVN>hl>ihpdljU;JkKJAR_(=)>kkmF^|qRM`Ju)H~yQj z<q~#}sB4z_HX9GYQ<+OfF#Z(OFEsX$ipZuxE-=X(OrS&-t_u~uF1AZQlqN+;4J884 z0yq(<P6dD@#Mq?B&qTnk7VC!wsFU^MR`o9a)V`DoM;WJ{arf8Du;h`Zau;fb_UDED zL`|-hc%;12E8;JsMx_1TOnd5#G>jUhEi}_A`llr{{tWdE9*nf9p;jIcRJ39x3SpBB z>P>8h()3n4Y4jVR{!9`pF1Bl}<Y&BAIVf8i=6&pL9QT~;O^ijeolwXD+&CV+;PS#F z#QHfHyH!hv`LGME71titGUQmXjbG3N1qj@joUqlkfm^T8PdK4PI+3Xk)=${gtT4E3 zeh^YpMdFe$TThf8hT0A4lmDhLbofqfXppTU@@RR2ewX7f;SfbAv4FV-qE~DeZHJh{ zim<JfCIfVO!ZYECl_-D}xYcPY|MHlty$w~o%a?S50Y&XzfR_&NE<Awq#7<=PAJAOv z*VGo<Asg=}9Bd07{sYhl0d5E2)`o<m0#;;A4@L!azJ}DfO*m^-1$rGeaU+SKzo={P zUXUUP^rJJLu&EmE0rj+5Xvb#2lNdF91kH|2F&hkb69jD7`huWYk9pSxxpES{zeM$< zbR*cFx}HV^|0nk8#5}XHYoZghYPz{o>Qj3N9Rse5sL2;6YIF5PId*L#3wWk`9KRf? zx~Gq$$Drxs>5)F&68NoE8^C`CMf6r78}#yE@YmPCUk&$f>V%n(cx&I<<}(VWFZd7m zi-X^iAi^A@;0?RWbr?d39B@@=ul9Qu;y8;%^<fY$sP>Q72Eu-AVCi8!(yC0p0DBa4 zfjj`nG{18ivLjG$gC+22a@p=xFMJ<Q&(o(L!L%nJc8jwGWA=j!LbDB#XEe<bkb-5} zbX@KLTiF(VnzZDxIX0_k;UFyjLW07*OZ=b0^n@D&9Jitd!Z29Tm>9wY|GiYY0i~<` z(_<A@wNNSlQkWqX`1CEJqS16JQyC^%1M+7pACUV4V(J|*VZjvOgeQ?=1Bxu#vuJ4o zwTedGX{XeQL-7i-J|D*GZ@~sI(@AgxZw&PFywk~T1BCIy77)f0X2IVfY>8VjY~Syf z*eByX=q<z9Zny@@`n{Nz>|-cF<QCGHqx-v6u;;XpzR~GBOyf2f<90Z(YCMJx1H^cu zfUdSB561L*TU|PQDx_6DO4-i;jEM$R3_UvoQUkbbWHgw^-viaBJ?a4b4%Gfkl?-gY z7DswP2U~nyz=(PM7^p{eRQm^N;sz#M?Sy#hT`}%yaE7AOyab+X3`p986O;{pApSWj z>KLzG5!tMbfgi;n9B8&y=Z{A<xN|0x&K%Ts5eatgiYEr+qBXQXpgA3vP2;e35$@2{ z5=0*A4RAtpPV=bOP8+Be0wGsQ>s$Fo+BBfRX!LMUJrS<xJQYmhA(4qBAf$=n1P+X* z_^lX^WINa#iFV?{5Jz2c!1c?EoCD4tUhvM+{*o%qJ$Sfc$swT>q~8UGK%~FtAZm|I zuZFoLwV#8#X|tp91Ed@75-jPUFybdlbo%cwB``e*vlh)pF7>dqE8=tzIfIZk#?)23 zO`DB!ocvMN08;ulR`DOHnxm9sqoY85S#={0r^1hESEWKqS_jd!xm$uZ#NOFgukd|M z)_Nam4GKDrPCw8}lFSxgLohmK2g1Tdp0H4oa$yk;(!I8?vwVC5%=IgD8SaVj&XZ%R z7v~(eYL^=BcSMJ2f1+l!I37YCBI?9A!~HF!Am+LYF?!D;DYzYS1cm81>{?`jsYY`f z?q$8@#gYeCQ{e9e4t7j{?Z9>#f%CQQRNzZ;n9Qf2JSF#pvJ0zalW%u0c7qkyc_0>- zt<9z5DdVZqaxVM7fQ}nn<AdFVE^LlAs+aUtLFGgR@H%)9-Z8Xf81Byjw(Q@iWs=G8 z55RMXeS>i_+?$X9<wv5*zg-=O-b=M%8YuT)M7-FcMW!MmnD4=gVKm^W^(3F2xlP!n zmv>T~ApuMefFZ>%DxQN1;ue&oi^Xu=BpBMRbEz$)1w`dwsA8aKYl{WGj9eP$gIojR zz`t-Cf{YH55<5Tgpvk9lQAeD#kC-D9$i*Yi^i3kNYlWK--Qfy~9e|u-SrhWSpnG#4 z#vG&nh0^fe$g?Q#T>9*Ri+&3>3p*y1Y2A<{9d;xq7Le*K&u|}vj7m@<_#T2-fkVFi zxZk5+_zlW}+z?XC#NQ)=eE9Rj*o>|wWYT9a!V}t+)xKnNVgG?J7PoM8%+KEd&2+zu z&~k*#`HQWkkO+FWWC--#2L&gab~{*@ub~*`0iq1L&}tI@_4O!Uvyswh`KL0HxbIOQ z5(>tgAo690S{i8)PdJl#R`g{CdEuXs9Uyb)$4+Z5eh8{sQ|FiXQEl6zDSlT3$get2 zcz3#2&_J-p{wg!vZ7Qt~I-%YRB*yc<qWIa$BeOc*0GkIEB%KbP2pJ{iqroryC($*? zmb}@Lx>w=7Hqla@^3Q->3j>t$Srd*G=+GJUK=<GA`u}ZBCU*LM`{AE%gxjmUgr(e~ zO7m9K)2zUiSa-dct{n}nPTi-~cUKoIaJVQD8arngS4DQ?f~{Sl3Gb>LX1E@dyAdlI z?xPgfY84=SaWXs(;SpwZ2Cmgw17>K2kb~dT;`fyJJt=-qh~MMl_n7$Yp;i5o*G;Lb z&8if*-r5O;-&5Fa)4q0I5LDs81&vq+%5Y(cIHp1-4FCJu(6E2gf<cOZo0=BA0P_0t z=qSC}^npgG1`a*OvISng3-*xjT*F7Ybr1i1E4eZz9#NQiC{?Jj`D{pnG%W&h!2`pj zT5L?=ieerf6{@LuxbHix_`d~%^q*Sbf=4P%>FxZPm$5-FM{6zO3nIJ}L5354;2Na= z?$dDh^Li+wJN~GyLe#Zz8ut>g<I!T@k-;d|K?1e_z>3PGh=Q*5uTUKAtQ!CyXYzHW z1t6L6AoiI=pefCJ`~!-JMTBZU`Zw{A*-X3X(1T{6!!>&<3xfu3$;VChVjaf0x24!n zY*L38nB}BeiNHXczksRg=Y~77gqE70O10h8$anFx_$A<{5WV<;4wi1|?cjZ9!+kSF z^!aRlWGV;qoAiml-GT0Y*CzlUS2)(OaIx6jL8+ohMaMvAw?fl|H{3j44mo}exV(j5 z0#lZ$a=c4SLf2);BnH)RH!dc&A-18D3mmyffQSXj^+vdTfvvj|f8~{cI_brHUvH4s zsUbWUx%iKIBTb<eD)p329Sls+IN{fHT7xkImyHsHxQ1`DxLYvsV@Rkt?(hpxMq-Yl zAMaRLh@LzNvNV?sbNe9x#x0J9`?EfnA1QDwL_S=h37G%zwSYNS(NA<NAPYZdh~ckq zPQm|O`1r4o2uad#zxWu0iB>)x?-=a&`QlW<lV*ZfBv7~4oz<s2a-T-8j*y^z31&*{ zTDXKC4fz|YCh*ItnsJN!D;AQtoY_W97q==%ufm*$Z$0oa6KO1<7sU#_oi_;zp^;IC zEB+HzgX#XySXMd?bh9Qt_yvOdtm7-RR0({WBIOR`5JyQS@K?~7GH%Y9U<@bX*a$OQ zW=rB4af)LqKLzRq=I|{L=|X}A=fPSq$y+&}L_45I9XKkIfNRCfNd$8S{|^Qqm;6k! z=;b*UI!V{(fo{SA-A&jlY+0a-y(o=AfXVh(4N!b|`EbCMyq8?~D)%u3o(sTmE7o}c zET9h1@6NF#a`-FH3q|%8?#9d{RBhq8f1!NTFyvVC5FX)xIBH5^v^sAzdivpy(V^T9 zn8Kg`8$zZ_tOqH+!#*6#=Co-l-wPHIC<1Jx9yvGw`9Paf_|E~%xO{#e9^V;FfyO1k z5^Yi6K#?#zLD$&D94E2C2{oR^;n{;@aZ;u;jA>9({D4s^*Q-)~AgwE~^E9?iX=3wa z)ds?QsC(y&R&|Bk6_jA&a>2y4MVPpLhlz~7eg$1Ux#}KC17Pr%K>gP-dndA|JFBJ0 zK1A~tXl_XLjzim6up2PO$XSV;1-A|(AaL`OBt6w+xL<jcMpTMCk5bq|48(p8cTwR5 z_i7;tL>q=E4nd`~sP?cFS%?(U<dnYcLY<VkRu{4~Jc;Wwi?G!@hTF+6a-t<Te7}#I zMxJVx^~EFLH13h>gCoLqVecL02N&vs-Z`>97fA%>oJ5GOdfFoTrd|eTN+q``WW%Q| zU_JZ!4r&83UC=Cw$-yrNWeRiO0!o9b;T+jy6qq=alMhQ}xQQ|d4`fry#1d6XI~m-4 zfNLmHD*!~*Ne;pj)^t-uFI)t4b3%@}T@e275bpqq>-^2g$+Dmo$DI-ae!?iMi-!B( z3r&p9K(jb;n0wN;*c&K#&>NPP11lDRIGl!(BCk?wv}&0GS)lGgx`V*A6}vf6Z7^1Z zEkRaeZ}m8Dm#q796oo5(*t+;J9I+1IdpGxjgsg&u(zFrMn>Gx^JiRAl9=d{?Tb{yI z!cA%YvRom(NjRE+9(*(X$RgE3Ic$M9BOt@2ZrkQz1_XI1m8>l?TBsq`B<F6F{hOr6 ztzb-;ZMaVZ)J%p`=zwZh+lYvy$WQUqPdKF7dlBGQ!eEn>F~bN(bK>pr0I0W#qDISg zEc`7UA(z6}u^>V%!SoWK&O)^({$jX?EkL+E@oVw^XOQt<v9BZ=7V`rHzZo=1rr0k8 zIYO$!J&z#OlZcMZauKx#l-L_y4+KOUGTvnNpz6GOC_9Wz(=xQoy5Ta;e$jt8b2mc3 zK(OYRG1OwI+$s1ai4s&CpQj4uHUNZ40D&$`35Y%jJE0PLO5{n+F5HW+5h19TWBip= z4N7jOQcg!E{LRvGGC#9TYiTB>(0V;MTHJKMI0wa9dweA_5qpqo-%IsuJbETd{ZQX7 z!JRoE`Aum=0-7{0I$YM9;iXD{jpA=!6qZB0)*L%c-Q4v3-IQDY7v20qHR=62fc}GB z-3LkLtgc>7UEP3qF<RGS$YpULnr3eWcwTCtrkv54EJ(`mo1<QA5P$QMuQkVC1lO&E zT#vnbYCnkyUXhCrKHx#~`zD|o)->|H{%!6C-|k&KL2Lw)gPWZ7#pn*MPNQjG4dCe9 zXYUkM%C}>fvxpRmu<XWMp5{I_pagT9i3u3)eN|%MGi`7s2>QF0y`6C4JTf9#J6@$H zTS5Npl-XPG2N|vij}IVhyov;>LaZ)=s?2Yu81A1XtHh36@$HX4iH!JOPo<!c$Emt4 zJbMFbSPHKn&}ZGIerrNN&6KOBc}L;KFQoDp8)-V817hNDBdB|Dtry~RPtp3h+)HaA z`7OJ#qLKt(NAEQoY4PlTu}kl|4x5Zv+f&Od>9KGnEq(5*d@nilpTloPGceTT^NU2& z1JN|Cl0?rw!+$_p{%3^zW7ciN4n+SI!npSpYbPz5;n?)I5UqcXZ<%zJ&Sds(X?-}) zsefeEa{1{7aFcw#2M?3Kh|6gENe_qL5$kc{A)x15$W<$-g05g5&Q}gDVjJOBfCRc9 z2%acz{$y`G{CQC`<P@aO1rvk_a)C%kbMt$%o!#70vpJGN=9BnaL83@6(!@TV^nHY` z<cDbT;O(Rvr?sJcNN=r#8qxwnKB{|#5HtPRCPK`!0x<^^I6Dc%OneT}`X@ll{!-lk z@eL4@BM>u@Zvr4mjGQe{?OSi6<frhA_}EKlFHy8B2;Utw7f~}21-*^o{^L)GhP4dC z{Zs`}8JXT8AGmoGb>n#4J-tonTj++=tAJkYF(>d)Z-Tk3^&5^m&9(_YWdb$0`aO9@ zkz`ef@2PEpm#3kcvnxp5|BY%OGcO=Xdk@_ljWbfvJ&?Ot^|R)lHebfUSc^6iepd>X z>q5A%3Ae7)`H`tgY!<F*+>Cqd7iQuEQ8R#nF?RCb--6F(fV!02y`rqSqYb3=8mK7+ zeF@3g(1pdP8Gw}b@ckUwXfjZbifAiOH%E$Z5$rAYZ_@^a%%Ar)4?1xb-qaBx|N9Gu zP@*GPcR_*|`!{J<Bg9X={XKhn;fchDAc-}R0jtEkdE^1yJW>TDe3Cq|kG=j1q8LIA zpa171UW6rMOHsiCPR$c$JD>{WrEq!)V)w47ubqLT=Wr$!msr-*awtxn$x}C}Q^e7; zMB=<Nqq8Vl#gYO~hR;H{-C+R0$6AVxNwp5J_8>kQhGfI4-3kLGDLcddPbx=AtDwq< zV-`Ojk~8EAy0dP(;y+sTxy&}^HbV-&u&8dbmw)q?VXTEbXNhK;pbAApYFKc?@=>gk z0$yw#Pgxh-pv2VN(+WF{x~LV&Y^4z%Fv(VS&~EB;)|}gdMm)i~DZTYV%t<=%tu8@} z@uyLBu<pTJBk}KGT`s>LpnPX%Z;r{*b)=RBCgIaX@IcT^ffz3l5seUPA<?ESzEz3+ z<h$^V`vLfJ0Uz%~?fr3plSD*$Se;Vv3M?c6Sc$dkjI<{au{Cg0KQ>*4gEkP2qIZ-i zQLR*oE-AyV=;wa|&G<Gc(W0Cnb9>iYEbAd{fKL~*z2Rtab}(9m<?-w2O-^j&g0Y8< zpns2c1Khc4Aet7jZQ`7w`DH-C9t}4R^WZiFHLHldAB<kK`)z1*M;q>|9;9W~-Go=@ z?SoSAgJ9JCFT91>9k@oJxFYD^vGj78wc&#+a_+W3e!iL!vTgG3(2l_MU1p8BjdJcL z+26P%BMATFV6?a*feU(DqeUqBffShor~#T3nT0?RkzqB(u)oxyH@LaVe^5)u{p>+j zX7Bz3O%&V;iIXv-lbRsx)%A~^vh97t{X8HIm-htya4npMI+S&=LeoD<UjLu}U{!qE zV#i&5x6__~Mn|Z-n+CWtJTn%)IvcYa-*$@063%HXgk=VU-_gl$n}b@g2gO;+08B_y z<TK2Wmh`PK5GJyD4jj0XMi*GBVJpRvf6CNA(+G$Ov!ZNa9|O2SQ*Q-m4fn|hNWS$q zN|Bk!$!@Y>oq<jZYDHG;ETXxNBjpE>2}}z%0@>dwMaGFbZ=wq!KhCJ~v)XE4LiR)U z!97tH<aiRAatq318!<^?MT^XOa5HLBT6z-o#rKOsolDD16e!(Y0tK)og|84OxbQnD zxaIaF3ZN+n`P<d8EjH2pp?u_FIw{*AoOxh%6BuX$Mcf2i5)R!{=7)Pb1VA8#qnFs~ z<KFxv2Gpy~jsP5VA9jH4WWz-;&)=wJ_M#=>O7%)~2Iw^0H~bjgg`I0=XRzQB&B1M$ zbV}@o<lDDv!E~GB+khJ^!(nzX=<g;A4#=otSTKs~yx%7Bg0DR+e>S$rj_V}(d=HHq zr}IOkPFR7$VYXxu4I>@anud4Z{&1|gg6(8G&=IpYycWesCkJOa+#!!te29fLpu*lP zhT95g!{x0YetXcr1^0}fh-afZgiX?1dJmklLZl(QmHbB_?GvdkybMQ_L6LhGX7tgr zqJM%#s)?_^l?LV$nAC|j_p1|=1C!0G6GWH7>AP=KitS{VxBK=d^y2bHARGeIV^4t% zG8}F;p~hg5D+GMVnv>&n-Th$XMRtf6b|3EBG6xG7!1t4yXh`s77P^QDRLz%-#ds`1 zLI=Dxa0Ph~SGk&FGl|~^BW7ZpSvuJkl?IALS;PJDd=%~>SHz=qTx&bO93`;s(7mB2 zVQ+>%;snHy+*_QZ__pzJzoRaKA2RSm27Va3*OQXpzULb?6?7euIQNe=c&`j~nFSTF zh?l(mgOHsY@T3K}gb+ZE<M~MZ2O<&7QxJX;VQ4dn{wCpdC0^+YnGf)eZwwzd3<x3f zlaAwM{T#<Du;yoDy@&I-xES8F9`xhw0pjg>;O*e=ngZUAJ~>|hEx-}H-5F%AFrXBA zW8eN_)){2SaUpzcp_K?}ItBxPyZ;U$kl=y)>#F;}51LeGbowxqOI%^N7tf<amjkaR z2j3oyy1L&)q<^~<InSg+DMAPEz{{mt@~30ke0<~~oo*{-7545s7Gc~<i&^t%cySYr zfaeMtvF$P3lhI<hyd&uU#N<Zu+r({`&R13^`R_6i#KK#_XW<%_r0mO6j3%Qumn2y3 z!JCP!JBa1tNb?Ev{@q@d`xkDqTyzlUS0@q6h35ipHldshgHp^k5^a+UGJod3h`a^Z zf(^r|oNU6$)ouZ>f@<7hR$LZ@zZTIl(6<oLm^*@#TmZiE*Ht9G#fe)4*}WBL3;onU zlC-*(4LcK0bYgQnHf+Q~=vMffa4Dr1LqwPZ)9B*}yac&u?EnOO@Hu60Yycth$pi@W z!XPZe{n5RE2CU@-O^Y4;TmlAK<YFgHf^&W&CP4s`K*1y^!6eA;KM9huZc>+D);k9R z=Jjg)<gdjXFlpJmEt}>*faX9x5k3h0Y4n?Dp5_28zUJ*}xX?=w{uGERApEmWOpxRa zOqrkLC_Bp{+h-5N_wV3-E<OH7&>Q?Sot1af$9b-xBM_PO_6&TNM@X|>jcKqJGDPSc zXLyB9p{voZy38oMh_M&r+klO6hjybGu&Fp*ZqHCeqWC0WXGrfz$E_(ec1=z6JwUV} z8bCv^KOzzz2&8|h?-L@J`d*+1mRp>kwBz>k*%?l-Xpa(=JHqstKo-pCq}U$u-9Q;y zV|@GXJv25p{u9U^{p(wy)Ep;Q?8<+wMuiqB$DSeO1Tz9kO=C6Q0mc_NoJl!W2k;(d zS!R1-sc9hoZgk?3j*M(-EC;WlY>LaFI1j~PHZ%q(zJubS9}g!1Gg>LOlVW?cmqRt2 zT7W&09+FN#nqMkh1IhQh{Ra+Kglw&64-mc!o*E-DK#Cqu>o-VZfDmWz9i-F%mGlje z9tTy^K*Jhu)p`dAT!#h-O26JF{+Htu%;+IZbfRGzAe;rkcN#H3K-@6185y6L9jv`C zhNsFLp1$!G;{%?x&>SC(1r1B@Fqz}i*l&Eo$@U1pJ%nFSLO27cpPfO25aJZqL2>OA zw-a!Q5u)L{5d#@EAu|WaiO9kK)A+2Voe7<v>%fE&cf66oh=rVdfG`x!%;u+HDu%Tu zhks)RJUn3rCh?EWKpx*K0-1c584=*EW<cTZn1K?$$_$k9zng(F{=6BO&wp<Q^7${! zKn0JQfknJp1Q_9rt7e$kCZBJHS5SD4878*EOU&>}3J1+FEwen|4F7||lg%)eE(`aV z;RXs1GsCSEcADXx6h8S6LI7*0aHkpWpzx<=m{Yjj40lp^s~PU0aDy2phb8`o8K#3$ z{6#ZN0vmtE4ChdIg&FoxIAVsyvF$}>IFI5VG{gB6E;GXc3ePsfboiPpX1IjH(<rPb z?{b96ZbsiY<NIT-3s%B<>fpmg34D#t?;2~y*v*)1#JJ6vuU}2oBxr^f$G*BkImq}8 zc95v7jWV*CIQro_WX8N{#!Ny?hZ*x1GX^WN>jN|9mu5^pVz!zwHD*izF&oU7N6Z-L z&|Ry|m^&yY**(+eBoANZB-^BmltfPA&y$07R{poYB^4@XtCpbAYWOQH$)uOMy@~F% zg4-%iMTm=bVEuE*b%PV{;ASj*30SaqxD!I5f#d`k2PGu)>#6qfz(`^xR_TAiSw;B2 z;5yiLT$cqmEc0i#(EMCY;Ef>ghEO6jKLerpNdap69{?TE4^Vt@6kpDOh;L{)xBw#r zAH}+~kg);KO~%4z)ea?aMeiB$_<RY6u10*y_)}`yR#caPhNaqh;9R1r%wSz`uz^z! zC5fk-@x2}mEsBoCA3~Pieti#uXHrhGg?<l$?|Qip!SvBoflIm08ZsJtk$H%aIS9B+ zOEsDJ7jU^5ZJznBZ#^|X#Yb!WX!8Sn`1;<>7(3K?OX}NupRee1|2gY3d|TjGo%#&l zJAI$u!-x0i`+HdYoXHRHwIrm}$M<kXhF0<a{Wtg+ovKNGxzFs!8Ssl$a6ENk82p#4 zQ|%erWYV4)t%%dUOfGHOSd5Y?ndw<(x^_fC)uS8elYlEAsidh_qCbisHQcV?fREzG zGNpwP#2gN0WNXtA#4HVF<Y>_4HG1f?#@lG!O0A#2Pn91n`i|r;NyJI$^xFH!vhdB~ zRz+%qV#92`&*#7c#XmMf^p(wgYzKQ_bb&qqS8ec%Uh30J;~vXfm^ft{^iHGC5|Gxp z3~B+0fccbtsNo)Yn=qsdgy+GfD4M{P2pBH-Q@LOG8!AnH<UINH?&`Tt=P6Qo<&&TY zy-B|_oY~^+2zLI?UUz`+*eS;FS6)ooDQXc&>Ccnec+*hv7f`l;%n&p#>DWv`*6wGh z7>elcGgM6GH=#aQ4yN=~OPkw%n(^QZ#K3@(p8#Pqfv|p-iXpw03c54l|Fm}|@KqJp z<DZv>JhJc-NFZT-NK_Psu-FCy^*wme7fCci5VS4{Sxht}F}aV$A_NkY@JN5w@>5&2 zTC3JpTm4%Xv}zM}+=v^Zb)l{|eW-B*+<5=*nR{On0<`{?{`&d<e|>Os=FXkv%$YMY zXJ*cvLAnnOHs2+@y`}mk&K6Ez=)DTrK=ZR%akBZg_BQ|69kB0a#q)PrSqiZ#kG5N( z`!07lR^1|LzG_`7^%?2uo1{c7h*QT-`}(NRAYM2hJ<E*;i)2a%l0(K=I`wy3g0<%k zoZ*V-Wl#-F9FT3ekL(lk<|nBER16RLr;d2=H&A(v48Lr&g{ws)p=E)fBHA#n=Jkwg zFv4y=Xx1s8k3&8*$OkyaPg(@HQwMksMbc6d45!VIaC|<=`drifIbVMsX@8ElK2PZW ze473omU$$xLoB~zhn`eV#b4BOMw3@33s9^xgwyue!L|^LFb=|m5E)|+B8kXZ!`P2; zU~jJrAgZpVD4-e_OTu?aj9}6$@&V&NH|Tu!id|3!j5cFhc((w|ky>{$c(siHt#+%I z`nb8}3zG4MUm{f8ei{QOL0pf0m=^j0saEOib{Uh*(<K{%jODPFwWc$Y@8{az2b!bo z??}>euO~sc--EAaKl=kKa?f%LTb>wUCWJohXU)&5?JE=QyL}l^_hqB0>TdcnYDH4h zm(hX2!PxYhpu@yqY%;JVDPG>jm@e6I?6Y5GZ~0`R@k8^VO=G{1^kgJG!F&_nV?_Au zSMrGlHPA9xeCDrNWy4@`oK&x*!u_Mdrk(GvlK~AK-n(PPg3*s}K(m}HBjfpI9%8%F z42aScl!|{;hBdRE*Zr}V5-iHNL~218G@N$nJkn*Bn<X~7Zj^w5Rm77e9?})PV3z6q zt;~K!B{~h&8S!!Z*?ZO;&dXTV^XycZqJLBrIWK-=s~&QnIjYXQefFb}i@Wtwlz&HV z@Gk{H(_DOw97Xuhh$(0ZaJ*uF;AHbYO_Q=rcQ36=o4#AvH`DuFot?BExiu4Gb>BoS zf11CUE4O;rjTak^=(y#zUhMEjt^gjY`A%-k&}VMUNwgUqE;KMNsILK*Z&+zy3C0Nt zot|~$L{sO<pmiIBTuTv%ZF(*$#JQ1g#|8RX-^t#!b}o33ImhGkELW!M-%hu13yhVU zEDWdjajB(Hc4N*`BdIZGf%rJZ=LGNL$pWPe$$@kU9T+H~I3Teg02Y@s+us~j5WH4| z=E*O>C*A{}vw0xsa#%LzEbsod7<8drPd?k!nH3u9J<ulVrp76)xwnev^o%9Z%mtg; zccP%*Fu3VCr<ZF4j|;@)Jhgau({nL$nr<j3Up)J_IRhEI<+*a-WU2Ffuj{^VqQA7s z@DrL+cqL(C0wehA2uurZYuX!SII&=bTJ;i07B~^r+cD-BY~O8HB3Vi}4z!_um*iQu zEi-EWo?+nwZ$*Ert2(dcA_)*>L>+kRD7%-83nRN(!jsL`sO)a`Y#&+Y;aJL)iwq*$ zi9h0O+&kR|tEKHtZp#hsK<L!`%fZ^%9E5Oej<hDtxfY^x1kpVATWNjT)+qa;vbT#& z@Fgov`)CXz3mE6q2flL$EG~^uwgpi<+qe;TAU@~Iz=-{xVvf+8PY_%y=+Xh1_e)$B zwnmc99pV;&;q<wYZR!utl@&JGrslgS-RE--2C;&h=D3G?6uol;`T2v1PZh9XK69Hd z!zl`Hi43^AZ?pEq<-lE!=pbViI?0^P>6RNP2s`$+RzoAPv{u7>9M)hABkAL5mauR= z#mO1*-mgShSch8+3-9E$e}h)Tsqf?6EiCxnQ@zw0P9!~~1=XEw-=TZ(tror|;64&c zAS{rArPq*v-_?f@v=4>`m`@PU#!QO`KO?YKW!S<8vbd%Dd*3Yn@C&QMg&f5q98^-B z7%!8fk(OK_nxaSr#&I~D1_n>_lFi+)DOW!pz%~t(WYFizNlbnaRjepMJmienQ=6cK zWm~bZX~uD!D^?W{*ke>M#F)II(R?V7Xg;4H6ieD|`LO@>sE|+(526|4lO0`;rSivl zC@NoOFfD{>n(^#Uv`xCTyoA$UJ_oOZO9NLm9sdyi_zWYkBoxsS5)~kQUW%r0gf^gX zIp<soH8OcNG6vG6^rPK~_*v@3{tcn%<_1+rqY9;LkM)uv{e}vC$gvYifvo`1t$9?& zhNdl*5q<97XW9!zWuPl^q4mqgK(zn4HHlj!Ije=ze}$X@5H_V=xb`X{xuK4r#~(~H zn^%&&X!d7`W<U1LMPJ_aa9l-8wCKzCY4uuZGW7fIJ#q)fKv3{&z8Sm);VfUUMGV4t zIa0ME%bWAb@^P4sMLjd;4fJ=}RD7&IA!Yp1EBE0v1A^;_XfX`*m#&h?{+zD*v7YQ& zhjCm`duT*l%~QfMNcP$$AA^V4?-pU(lS%d{_(~i5Rv3J%RaX`s$UUsaZP#eXNTqQJ z`eV=&Kbuy#)wRY!%Aq@$d?9vsHj_YPKG`Fa>PdptTLoW3WU0zYI`KA^XiMn4P->lw zn{7YTctrunj|MNj=NGWj^tf<fM$?ST8maBTiA?L$xw_FvgkXUTZFeM;_$Vd{!lBql zF@b>M)^EVcirX@rJwXKeK{rQQsyP;ClUp>Ttj>s9W=11QjI<+Gy?gN0sDfuhPSQ&H z;D*cTo4_-On+*l&^xDJV$@Mxx-?#J+qU3WX=%$AaPt%M)t`u}nIt<-mM?qJ_rh^3< z;cqEyVzemV3^q${>c)66&Lc3^$jW#j%{k4SV}&tK?v56^2-GL$ByITxsGsC7Wg{)A z12^`qd)@WPN^bjpUox1pr5cmWO$bgqrM<FQcZ9eo%xHe`Gx-#e7lUF`iG8I$b~a_2 znjehx$LEo=txPpLh)EQ^GuE_xa-s@MZat^J`6PYYwbpwE4Q;Z0ebC44VY!;<g)v`+ zeUlR{vGJ#L+?*#(o*m48PlUpZWbA97B|WcQp>i++MLv&Mh4f3UVigh@R8!zNJ=^L_ z0a8ikSkv*9BxBeA5%)TH^5kBW;65~e<zn+hbBy4@#ssP~ojYlSkJ6(;8+@%BA2LxC zyoBtU!X8)aO$5j<4WAXnB#Wr<O1~vJWuaPr(66u4!t#@==~>d)KMNzPYkrHX=||8f z$13*ClCbtbtc_f+w5v_ykl^EpwJ6Mv4MlU&k`>|dTSfPCe?SN4Tuq*pGC~Q_*<a*6 z<ky8F(COR+<;ZX0gkkJGbWO9zf#=3w1;;;T-X0w9KM-O9nb-bpjOdNGo2TbTo5Ahv zdt-gkrVmYKcPIma4;2^6BMDOQ3KHpb(-?De_PN$T1<N|9&_rw*b;^+<eQQ_iSv$-s z;V1f*ESU%x{?b>#;&?(~i=d+^HVPLKQ(^}jE^>PpOCk+Jw|Sh{MR0HP^p9^UPNdzm zkv%DdcDH{JE3<#hlX6lovW9W_PSN3O+r~jX2l9&_0cuSfw_SXLIZ+91)!kG^W!t!D zu|AwB98?Dfd8`dOYi<;b-T5Q1u*TT2BBQ&#+F<QtF^I*O@jih;@FS=TbLjg-(AY;y z#JmYvOgiJSGDHpjku)KF7I5C&$Yk9s7R6;)wKRu<vBf$g(H3IC^`ZOuk{cW?S8ME{ zqinef3ZO9*{Hu?{K3F=>c?wl}$)t5&dN{4fPsfY`1ih7Nx+)!x(yE_)WA{ItcAEXU z(f%B`aywU)@q$nvHj25U5~Y|Q{{|1CWcQvhmN8t{{8W5f^ZR%23s)a&UwBtGA!T3K zR(F_gt2>-6iVU}J4~JWqIzrdy2A@GS!B)E2MSVned)I<w@SsQ@wXhP}9p48-^E^53 zW6i1uY*(^t4fiFBXet^NujZHPlXOqZX7V}g7NH4(e$F$8Cx4-c9Vd}ISKV=yimQ1i zWh%%yV4$QUa<aC$A%C)D%wzow1etq^-UJdWb`;MPMIPdb%##<~-`N86O}$D5PU(r- zE1K3Mvh^m;A}%%rSeKX&uWJF^tYBA{1qr!jZRSxEu&4sBh124#ye(VV?QAFKaZ#yE z#yFMFE^{)wrzml(nktkD#G1G24d-oq$&&r&o0pPPYq>wN=X}Y<Kh(Mxasqp1eCIMw zn^7BFK+$GQ&viY_2HYlZtM^Z0TRq0x)b7R$lkB!nG#+}rJ3g0zF4mW`(|Fo9ZYTO< zn^`yQJExWbmHE#>>z*lD6K@tJWq+%GkH}TW31&>~W|(EDxEwk5=mmmhKeeaQhfl5$ z0K+Twe!r~cJn2V7!(+)qG6BnKTAHc?V~}6$JFQ0W&6>bn&|5kR<+~mhy$n&9jEZJj zVQWvqYT>PBm$WQSE}(;HIN`GxG^KWp+jF#upk-3^Xfh;1ksh;WlndVk#B^)mL^D8{ zj#1oo*Kv256eTo5_A*|w52P-6+FU>n8ge3Snb+g8`V!J+z$@dZH-E;W@J}fyP*UCb z!st8Yz&?5cnu%I-`O*@*`)WYb7Qdc9jAcTwReNA*6`j*BxhF83mLnm9Np~Fa;W+uw zB(~M;F*9=hkb53vjRp$}r>_<82{x2bV;ae-;}7t_Aka7_kaUmd5oEXofu3hc#c{*n zbLP6ult;Kk-@!A<yi(qCwl7Y{r*Zn!83C77mF6214>o0=XtOiKDq1uXjcm&>mWbyf z)v<EhYn>V?rTZQpx$`VbPX$CP`q4NLHnSOsu0{N(>(giFPB35liM`>%`Pn|gkonQI zoCtVW3My9z2}{`4;y8VzqmMCf`Ww;jBYNmcDex0gfqLClt9n()LggBc8|W@8zcn*T zRH??+5J=lh;RdK#q-!5>%*Gi^7h^#jk9bL<KKY)EZbz{UnD%cZ0iMwe^ppQ=6*-sQ zfhB+F<q>-MW!x)-XmU*#^~%&qT5X*c(V1SER~bw~wF&Tsg>vUeVbfzW197ZKmyxj0 zQrX#MUd{fJ{w&L}t38BZ-DfFg%Rnp{AK5~6JsgwWX+l5RkfnviZP}6A1GabmMY9lT zM%Kf=7yMWnXJPxdVu$ou^I<Lg7^6IE@6Bu^uoxR%1;p6sYJhr-7R&vK=3oe|@v<j9 z1Z(6A!6Y>NNx4`y6eO8)uFq@)2E8%dWq}W^MPH9`EuONrs9Thb31T)qcy6kU?S<y7 zSB2!R=1DYFIZ^kprFUZ_xgK7hDNVh7uQQ>&yPVw06H$2&TF0QFc%4|Lv1Mt?Zii65 zSkAn16Oz?O<^?gSw#PhJuPZW;!F>crSVir;kNjv%fobM&sqj8*YcEMo{BbWOAR+Q? zJBaqJ)z{RC<&}2-s;_k?x=|?PZ(4@N|Db$EKw%fI=6lX;?+1M+LMlw&2^~B_ED-|p zx#oML18GRsJ;vhWHv1Enx?kVab_g=`)jhJUwTjYRZ;P!mmo%kukOX^7)pF;GTp>Y` zIM&Geev?#RG-9KxS<A~@m&mus$^*`^G|sY2HyTjjjja~3s`1q6#3~iBLXY08VrlL$ z--aY2L>7t|dS&l~@<j#pS&7|i7{(N^l;}*&0T^F+T9<HHn&v0jyG<}N;XE5zF+^x# zy5@YSYOOIWkTr&4>fR%DFO2jlH5S|&dYirN!{kC)+|eqB!PwbXfWB5Uq`!XRZfebk zn(jOmOnVk4_5M+~UUUw>^tI%o+4%|DiO$^C(s0g;T9G^($rN!&3S%2vvBm>R!|GqW zH~3O6(wZZb5l;JZ1`Q!?Nq4HO^B^<7D9XYuX~lT^f~~hn{y9&tIA80MZ}*OShCBGU zM52FQ^cGYdKMp>}A%J!tX7*aFu)#I=>nNK={d@<zX+-G>|7j#V7H)LFP%7!6@_5xY z#J@XfeZHJ+%emeW3xfAiQh~n)dUIY1yy*-6PGmP<PDpeh2l#?jqPJ`G_hDji%{_d{ z&DkOIwauLul2C5WmKA#Pc8-2|W<|UnE;~KEB0?u?F?j$afGkbDN;;|Os^qBp7qc(o zBA493##3?|2ut{`Y0moCX@19I7UbmSkI;J?r6xM%81d9wq|7VE>6q&yF`J0VVNSTA zC-T#F<hKj#l^?Kx`6G)zOF$>Tw9A+CnX7pp4I?iin7dY#p+Tt?<Sp&+c_?mvuUkOx zQIgk28c~uz?NmxBlDWY^DaqYJa@+gaTH>EQ3F9&%QFK>C#NMWrHb2vW>j-R<1VrH( z(A4u!y`URT+cjOt=4$?2sw3DcrH?FS9bTZj2pG{q-7Yk`G*XPuS;&s6UvQZI>BM8r zGcG;FE)4>^=v}U~bx#Lb`;Z6|y-U)gerlZ8ja{x&_X4^g^c#A`7P~sSAS{Z{iwPFc zZcugK)>|L-Jia3zqIlXZZ%<ec?OM<7@fe8*JZDlo){XLmAs<aKAuq^zibB-d=Ru)6 zExvt6_!jSCG~1stfBcCMxr?K$&58-D7rRI0`K`JYLG)k;3a8zyVLn7)5t@YRFMMOo zdI&6(_Xc+#7IYm!F;GZQnL_L`R|Jt`exc*w-xi|N$aUJy)N0^X>1EUt+dFP@XMUMO z$>ET%Wjx<yP9>4N;IrmLU{EF-Omm+#CsYe9%Cq}SHV&5;d+E5^dfw?o69w<P!9Hl| zZR_!+TgO#){<MfGIN`pQfGB$RD0e?;DR=iBXGG4a6FFxoovx+h+6R}&aLZ`MoJ0oO z;N_G7@%89~?Ix*J2HP3teQXI@gAKzLM=Yd=jqLwjeeA)uvr(rImPv~>-s(w<Cs>$_ zu1=b)fwPho8FGL7DMI59f*z-)2jeUR&_izD@%Cr5P$X>5yMUI3M&~k-PL4YM9)m9F z2sz2UY&<adW^v|DD-(EwZ^%)*O!E;6*HdDBRLd^*vuj|izv`+PU6AvhOH3)L$LPYC zF+XGefjNM1EG4MJ;IXAME{71B?<IsUyOJwHPCLX3NG^wYT^qOr@w9`y1*pG|Sf$D1 zQe7I+7a>jpZgYm)@~4gud=YNzHcyx;)giM8Ce>R5qaN)~qUL-UODt>bFrTGc7IC_1 zJN@-m#^zjXnQaZco8K})MBq9G=B56Y(^ilpIaymD-kcAOsrge+U52NTWmX)pj=NoE zK1e~WGV5jKn=>29ObgNa-c+`Au+Nj5^Q|H3<!?Re6jYp$jS1KYoxxUPTYk$}k{&4~ z%&<bdPpX7SutVHI2q?1eN+H`vAZ1*~Me;JKJ;d?${8Ce7j?>wu)_McjiDoez4jAeW z#(5i;$Eq2w=G)2Gn|)!d!Ul!LkizSmUF5px)2@@0Io5~i=mT$2&2n&h{d&UXPhCWe z)e@uh0CLI~$~+6|N`Wf!r&fQVj1jQo7o_FDYNY5fwaCJKc$@whFj?h@7zPuIcpa`L zy@C`>a+9NXqbA1{kb?>^mWLWZC9VgRPGsFM=H9+g1uf%47m=xJjR@vocNH74t!GBD z46|N#9P&%sda}vqlvPs=z7|6ut-7onT+K3bW>G7@C36Sdy2DAjka@#0m<~G<OR;cF zNrgil57`q3r0*zmbF*eBL9$xDzVjd|00``Cg0>b$nf^T%H>CDy3+An?MQDL}SKhdn z{Lw{Rthe@LmQW}O`_`O*8~Qyd&DOvGj{2HaO~Ohi3$5u@-+={$%rN>h=5AiVm7(Nk z3<u(~#q#OAi}%C(u`E$Ch9Ax_r-P;p<(%R(hd-i=Ao49LF6W8eJZTH9uN-5-_-><w z-_FunTdx@+lf#~U5_`^HNPaR)VM9v}3eT@V#NF@Dc{AWMZ&=;Cf6xMg-9P*e%6PJw zbRNEzV`Ww>-E<|5NVeXXXl75XcLqku#DhC)A&(XDWf7Yrr$9rP)J&+ru-|0Y!?LR} zA_m3`Z}wzQHg0r19PN5!XZv5A2|L&UPm)8+p~qd1v~#J4HkP?nyIpJOAdZF;YH^*E ziCrx@ldN!s;-+mv|25pc&LOr}(Tc>>v|jcKAHQG{>)prSuK(V_U;0g3r)HfngPxJ} zu!&8LTZP#4AE8mA9{aK^_jLG!QBqku8nczLnVikl10^+CHx~WBWZ62Odw2)E!23A- z4THCPv4_CXnJEYf*$5AT4D%Fn*L&*GIINxP&QYv<u%S*H`j`n!PV9zeX68-r;D&2B z<bq-H3@_})o*WzMvxDnDY2>Jpm<w3vo9Mh73HA}fT0__3A?8j>!PfWf0IOV`zvXlA zW9$$#ufugWmNr&P;yJGvFZk9ipO}pSPO39ED(vkDdtFcNlFhv|{%{S(W^JkGo~CyW zvHuV%v)^xeKIF~W<8{s411q$XkrrmQ2Zoua=v)&?&h%=hbS<4T1cCLLx8c@{oDTE; z-9&0l@_Hohp4q`>T_$d3&GJNEFkax@7*7=0_vgg%%{bTPXZ80^+riCnyhwqr0eaUK zs7NGl(^Fw@^lN#o^BmsR$^)qRX7%??3mXd~0Z3sgDH!LXk5;fYKH^OrIs~E|lqgfd z-4Pfc`AD2;5@!T)GJ4`z5xyj<#F-YU7?Bs)Q>MuzPPAp%O%uVErRrTW;Fhww$+_M2 zn|L7<o$)n~;AF>T^63~D`7610Nd-%>8(q!I_y#)I{+8JcbvD4;c$JC|#5H0jA|@2u zSeE7d+Fy#I+8YJI_c%c;!?`Cv$8<GKqm$Owc)aUkGN)r6BOVVAhuo9&^{aW|EuA6g zCo8lbe|QHYf5Wgm){w9~8z1P8rP`=YORU@5`2^u8phip=5HlhApr4e|Qc@r}ySOiA zNpZ!r!qf@c^`oiG3XA|nEc`(@+`E8&<G9AhbwcsRiJrCNB6+N{juEc)P3#{!GcV_j zfGZL#5W6ipJ~Y{8Co5||wQh=y;z%HJdVfYZY`El3zt}(HByBpP{G75(k88C|+(NXZ z9zuI8dPar%3#~MHf+6p?4}}q2Yh>j)=VMp13H0iX)4XwS?T>EcOjPt+oeu~P244v! zH+>beG96^=2l3e({R%za%<RWi@)U<M-l1ch>3Xu+A#V^T)pT4H8E3rg*meGdw8L#V zn*tbF-h`3m(8ay+^BXy2)$~==T3W#Jly%V&Lg5RMrZ#;Q9XP^wnxr&tPbk$U)`8b@ z5mriHFekmp6ald{Klr$o@V(>Sc;4iQ8gh$>^OIlD7G&(rk~QPuQ|zM!28YwCn6olm zUA>%<R*-%dhVrpRHzfz<jM#?hVfI%oqIz8azCHTGmgQOgP9a#%E00N2HU?C9r_NKy zVBWJ^r;jaw&P_k+W?a@RGb@@7!n?WnRWR}=qvgSJv)Fl#vaTp-J@ZgE>qb>fP1dX% z)47TKI9A*F)zMg2W_uRvLUvBkZHcmZcL=4WtOK|&`4n-v*8H9T!oRNOJ8;2H>vQ_@ z@EN*r6;n6pgR#c!ik5LOu;dY`CShc}M8&6<*VITAuPw@&7Md@7o_bhPf!K<cLCiL+ zzSF;blMF2E5=EP}&m$QLNkQoAX&gX{WS$mEjQGDJ{w){^L=`aS1J~-`3)>$T$y555 zZnjV49t|jMkydlQuGR>HP%Cnr_*wHMUGv`@!k)o<Y`cf5!fEryvAxN~5yQ+0tfbgV z+dl1#1;5Ubh(=8Z7jXb2_(ACRaF3sFopM1ZqWDSXP~I4>K4WTR#qAlEb(NU?`C_R$ zEa;iUUL^Wf)|%we?DKF%xwg-vZO;rhA0~;(f942GYj-ZB*qH`PP5v`SVAsD5qB%2$ zT_pqWZXs&$gZ$tD+dj{5yuD5Djw-nPU2UL;W}NTVhG@o{7m^_9p4OeNAk|y(efCm~ zedljT6$1>GHB;C1ZA|^gnIo;(2MA*g)qP_pS+PSkNTO+PvNa<1eX!-?MqMNYV_jn4 zXP4Q)GziVWH1qd5AwAF9jI$-(GF{U|Oib6Dq`!mhHQmAb=6A~yi`GoiD@FQ~t@pzW z{8;Pb$@wjwbU&AO^%i_q?Q5irZ00`L=#>@o*S34^PRFOU*3q)`X4x9p!<)Zl>HWFQ z&v4Fq=|=Cv$)Pybl<R!!xZf;4v&j6-0BLhZFA3h_fj0tJqj>CnSAE)nZORje66LDp znMH~Wjp*F?&t<WjHA5vWuFX4U$78_8oLxrIxMz)N=#)(~AEaO{*-Z&ya~-ZeW@L39 z(B;;}LZ{BJkyd=D7iOSp>NK3>sL1g{@1IE36Jj0uE862;Uc8S>=h4)e%q<)I86$r( z<d3WAOHUx^%lRs}%eA4MJGO&6LJ6z@h57}b4Mhca1-Cs$l48HYKW3A0#tfNF8QC)w z$r&flP!z=&IYTTN$QzBwIAMkYDPus+CSzFV1o{APa9=3p329%U_$LU6?FbGTKq9C2 ziAG*UDWtGr<hs}ss}Z0&j%&^|@x8mz+nT$IwyTv!3Mrq*7>sF*4~O#S<K(8D+}BP# z!Hc948{*{~#trZztlNl__hF#~UXod;=4H74Xy&~Rd86e}%V;wXDq5r-g=@PK9xzjd zw5szqFqW00HbIdQ$nS@g9lS^tV6&EO8Aeh`bL@5@io(Ty`@*pj0uzm_NMeO=Js+ee zZSw}Vk7>u`#VoDk=V|UTrXHCpXdd9I5R%sElD?H_Qtw0qIsVcFv{tj2gC1^QIxpzk zs^sX+p>Wz|C+Okt8o1G%$)8|$=Q9wW8C*E+(D8cUD6rBom;SAEj??L|vNeN5Wd5`u zoOa%c#D6RBYqOL6z3nQA@`ZjblZJlY#^*et{!Is?12H(6<74xZ3zm-GBXbNv`bXWF z=>=3#x$(t+suB02cjH@YI1wr^<I&r0cBEX{jb8Mu{cC;LZ(MUVx#nW?vSkyj=xzSo zSQ<>=bdHEuchRj-1wN_d46_U*SBY_SjM9S37cbDIcQU-NW89;*>RF2pnE5gbW{jxm zY&v;{asevxua78C(f~-yXeS3*sxx!RKs@f(h0s`tHJV4Iy|4KskPN#NjcJ#|9v=+| zMJ03vw~cA%CJ-<<YX;k&D6jJdIG(pCWsKtukjYz&(szc$sKD5@8+0!e8uh4yRwhZn zJ_CJg@36d`k#5Rr^sZ*X1=jR=X)3NY_wokMQPZl8bd|@|EVoOGv(Z>C07aQ=@Ii>V zdZh%;*|&H=)3-5;vzxxfT4Xg|t|!;)ye!Ez__22!(;2r8yTi3c4zse!=?foX<doC0 zn*LB{rJT~BYix^<t42JeIW#ZtraRU{DU~u8vc9Z8iIpZ<wRQ{lTuz_q`}mK4;ucz8 ztLKn!ZL>zC^L3)QxW>^p<4~Bjuc5+QNEc=?>pr@tY)QxN$~z!4L(mG0(I~LxU|wg{ zp{w~zM)L>}JB5iNSk_q~LOD4fFTMh5xUT*Nl%R;~n!jqa;Vw$|%N@FOuI4u_Pt6eP z#gk$Lvh{L{kVUZfJ}za1(Mq=x8Fq{D`NnNE&%WO-^CECTD=z1~m4CKp2c-#~b@%GB zT1~*y_}<FMjf*|az~iiTX8TK7o9wNe$h~=6;giO)l<bx5W^&u!IHxZqTMifG2S)1w zV%Ra7R=(5e?#(Q)#;qXkZN@Co^*HQyfAJU!!<Off9hZpWJ)IZDcT2(Pzrtzf5=oN= zGbJyNCV?I1r**RaHVhj8`ZNH2fE)wR#hck!mhL=6wcgGYsdFZ4+`5=gX)V+*QJ{T+ zaQV;D#m2<TYUa(EI|RQ~TN)+5UJIz`&IGr#6zbtWzs2v?*4!5~vGCSZ{5twA=xyxu zqIn^fg~yt1FtWv(KI<*!X|-C;=(P0MnlmLM_T8MmpywcAvlzc9ycF5P7w#;TLr&7M zh?w9r7mL8tMG$`zEUk>Gtk8`0m(sz=S|CNB^vK1f4fH5nu4(HY>P|cqBZ{dAO*Jng z4C@!PUJ}g)Flxz?#h)nRH*HxUmiv0nH?t13$y(6kSk{?@J;oB!g`y)OsmzmAqnG^* zrEVE}7Km;J`x)3+*<tQ-T0PxvEE({H+6V6!^+^%)13f~rq9!LoDy|?k31eQUU8q0G z;cd}j64_U_g3^17V0v?4e}QG3GT6yZN?y)$)Wr2*)gxAG1v-1l>t4<~3%;F0=xTl0 z6AiA0+ig6@s#hL1Sho4HvyAq~E~F03#fWB)F`b8RpJi3wtl-_A3$s7AMpkF?at^uH z+=j#3I)5s`%sKl6f3D~tz*_vpZ~U#Ya{7wDbwRW&Bz`OelN|!~*cuRQsJ7}U67of% zQ~(_uFNpLK2sQTRGi(XvqY7&o5&vu3F@oJGJ4dZ6qC!dF#xf&1Oyqjdk6a9=w9cJi z-pW9WCWVyt1UjN*mafPU+xMVbpe<;Mp2ZjRDO8Boh%u{wp-Yh8S{y4&z^CdG=t4F> zN30$-phwz|fz|*)i)4=@rTo?@apo5+dKQd(-xtizYmJ%Cy=H|AL5u3GD+tD9a`&)Y z8(B$mFx8RwjsEE}rZ-}}$2>PdYedM+%lk`YUc1l9)L0gH>aKbyG}3G(pM2!6M(||r zKolQyuOU|HB!SPRFl=lfWjtqopi9O=)`fbvu4f{^UW)J_y|30g?|sJ&=k-KG#Em`3 z$spz9zABErwo{L?MkwQZA%0PEtF3ttzS@g3+i$Q?;b%qf$L*jNPP=WSaF>`2X`K%) zJM@O<*Tbc**f!lBm}qW-hPDFMBRGS6xlme7wFs4%Y?eJF<VAGPFOg$Cn;(<e0-1_6 zZC`LN3v_uoZ~22S=ei2E<9*-ldiY=+{6-6t6~jV*Hm@S(rtH{2f;m@bCsLW5L}u_K z&N!0dex4Ch=dj`qIY@90IELn3b&+(2OwOJ&w^3_SNLO<a?2X6HT~hf-j1Lm=z#jjw zu>ZhY{_rks-SK$yuT-Wb{+VH%a9ud<(_u&<ta>mBY92r;BrY>Q?kMg~T<&UMU0h$; zK;K~L*;zHA536&J<kRNalC_Me$!3$zMy86=Tg^dHmPF;OD~SD(G6WAwIA=I*F?q}O z1Dw~N78xX7h^n`bsjC_Ya+G80GK^f<M*&d!EN6Zx9r=izi==h!@Nz6akMnB<m$xmz ztn||}*ZCaTXSg1|(BX_~^R9Y_8dE;klO5jYzrq5L2T^YU5MM(q0*TBwRv==YTOb0S ze`aI8!`X;V|I>_mDti_03XR09KK`q<e^e-)P!8wHP;%ruNZ^y*$VH-oxQ&um$mKoo z+OW3cRhwci1`<*-Ck-I7r*NYAy(*z=S*BZbJfUN+jpx~wsE-a-BomK)GA3g!4md;a zALPs6pf?fb&g(g~ziQuJLQf6{J6q3;@wHyceDi>B-N(#k2XWrU7_cIRBbh7Wv>wev zjsoVX9&<OD(2nl|^hLm$KX1L1fgf>LjC**qvjYdc*-ITv=eD8OZ~46c$4au5;T6-= z>`Ix}=aMFS^}!J_U`@B224Devf*6+NBEvqDiI_HIBBv9Mc{=<Q^O)Dg?D1wA$f~ce zfSp`TkKlGaV(FMywC{~>%}<Z1Xjz{rtEcP>neT(Vzr|WLqlLSguO>pyTWEdKU&+Ki zpL>j3{V{p1MbR-U=A+CaHnmzuthiiQi4L;OYoDqqK%OaxPTlNXH`94{asXphd2Hge zM1|r!Yp42~;=>e~T_fykJM(0hqrF!SzG)vDle{^vcjtuF_II$Qxnc;bU3PSdsN-XO zWS{p*26ODvKwz26iXj`S0DA?D_gKemlTO?(FLg5L@j@5X%%OE?&AcL8e6qCOjtD#W z(xLc<(EMoi-vA{|DLg%vxd1MMvM7i>W5$qQsJ`jjsDNB!d0rv=VmTiN#)+^{$ZRc~ zb^xB!Z?aG?31hckyh<O}Z=wEr&nL$e1r*|h({`uBqg*#9%BLc7gwwX*BYTf7^E@`* ztiDzsI$E`5FDP{jhO!ptIcyKiK0^_V9eox_Sm!jBay0VirwDcSi>+XUxyszu3eG5Z zQZ=qeVz1_#w1@>2Ei;|#Vwdp>bFZDr1u9&yt``RO3!$<^0LT{C6a+F(Nm$whuUs!p zaI>>@c^p~`(TwK-69q1zC?cU$g4s+d@>=5L({XZW++0~6DVDiGJEbZ`80tjO7J&_o zKg??)7I;}O7dd29)4{>6HR}l0)6Oh`B&U=LF(iDYIa_dnhS}cM=`m8xg@|Fun3M63 zM%_YteB^4rK)3+42S&dTX4iI@1MNcOwwA?2O7Vd|nD*EOB3$ie#qf@wNYWkbmfxlQ zwgrad1zjlUnbY8if|l<~!8&CHDL44hA7=QnCmCbcMR5nsw9UpS^MQYt*lCv&HMg}o z){$4bmAh7w*Ezh?wgukE4StbV`fO-|C;JMAk=3{?YFgmr?DL}o$9r4Ph~d6TfAmvk zot45#It8O&Y#s*Vqo2yoFrM;?&e0o~to23j^|9&c@lOpX<3x)hQ*|`GHc*LzllcWw zE(6LOsWJc5$$?jW(I3Fpy1LBQ%PjIO@N<rWnZ#^LX#SAOgLNpOxdT$$BmWyXDg1UN zHP_jn4vuET1`Diwzbs&92|0Yo1Z>E`I&w*?U<Q*H=LJXQ2en~4z5ARk%PL3?Pn(X7 zTFgrAdr|KBC4!dAT(p4^xD7EOdXLs!3F=!kQKV-ZJuf(f;>qYZ?nQs}Zu6l>jv=xo z+KIVIOs68`eRW&38(k5(po3!nK`@rfXcugo6;|7#5!g=WaE7Z{w7ql3QCA|r`J>Zr zUI2HLzA2sdU+&XX@<)H2FVvsy4Ze;l84QLry~{uDmAvR7=4fy_s!YAKSPEF6%%DCE zu@#jbDdj;)DzMQvl@{k(a~-txmtL4zXtfVg4ZdhT_wX^2Jf0*OIxf&Xnc!fa{?IXk zeszge>)Fy)PSi#%bc6xNim+26M1LKUn?OXm$L{#)VwU^+TvjQ6gGo*ErP(}(t*#L^ zOL6DnX^Xmj<M0)(%}2cDL|6<X9+Td+l(4&RyO_?+vT=p!c8-diYF<XoHMx~JQ)*C; z`F&QCSx7#QVzc00cwp0)@JfKooc0XTQ$E>4J01lB+PcIyzm<S0bRxsl=(`=pi2a+R zjC3=OPupePSDCL9z+Mb|LCXzH|Fj&X&ryhcM{oTqwlU~<MDJrV`=CA$Lwfn1c`K2R zevi*X(C(-P5<)9wI-2dBx>Qs>5C^#<i&kZYEfrFAt9s01M-yEqb|W09c^nVdu1jd% zX$)+C+llf=LPyT00rYc!6vi$L_JRreb*Nv?Cw`ajYl1fK476pl%q)5*J!#6+9pS3D zm*NTY3`WsTCv>#SeXO(O93$8Ehnu8VwaD?jSvX539-@9B7U5Bzr@FNQ%Ymnnh-6QZ z<JE!brU5~Ex^z)=ciS`Mbr%b%m{lCEB10#^aVLE#I@&>h5?Wx`J-iumWIztDCwm;5 zcP#hMW*4{utrxykB<!g0=FCp6XBRYQ_P`}^72fFCsiBkPZE*c@0@9ZZ6VIWcRJ38V z(f(wk|4hy>q>GtZ*TX|#ZoG$DSxk^DUY0E4Dj+-GDiS(KX0DaRTq}#YRu*%uEaqBS z%+*<J>XpR?okc~?^MR8q*fYUw9!hta6w^M+{!3;UT2;V4sL**W9+<}38x`KsO`zU& zd6X0U`fU0X;$a?*YF+0*j`B`x3+%^cWgbV@VzN^LpJ%7!yL{~kbTY~8{`Ima*0hhM zkJL=GMKYZQVp^K3CiBO26u4%-Se_poemt{AP7=P@Fu20I>TT6k(0Y^VqSv7d#W%pt zAaO;8M+{FU50Bhrkfkp$C@3~JO{JJDvs|=U`_m!+wMlQOC@kb?S#JY_j!Z0jg%BAf z_<Yc5W;Y)3%{pFq$x$Me7LYp9XWCZ_MG#1R%DlzOoTR(UZJ{S<SP2b2N<zV;1+zrL zJ6RSp4#(_KnX;OHS$HH`iSl8`Q9kGx_jP};G3lm;HppcDTle?w4`u?5&C0$9dtBWC zpwi@>tFr0X+SnEg@~;=NQUOg@)v;8MKs(V&y>}%LnLEc<Wiym;Zg>N>>}549QVDkT zdCcf+jYA}+_y-FL&Bpelco*CA=ff)7I=X$o?%lhS*W{PocJqer4@c02wHIYB>He;Z zE%`sn8n`kqwmw7<^XTHTcKQ9LtNbD-mCnP9Y1Jls@$#;V88P}UUPcG!d4f-w547ph zcrMyZ%Kz(sZE|}Vzt?T}sSTZ}mj6&2PO_ojhQ&5qYQyz5++f4IZ1|uJx7l!y4d1un zK^r<npMc+B8;-Z(OdFnO!+INDYr{KixY33$*zkQD?zdsoU@QFrHXLfhOdDp|aHb9C z*l?i@>uk8fhHGtjqYZy=!^dp6&4#;ec*ut7GV1Zmvf)`aEVkj5HoVq`zp&v(8}6{- zn>IXX!+x^g#c!|;$J%hZ4fAcd(1!IkY_{R`HoV)0kJ)gW4PUb1yEgpFhVdCzzC&#| z)`rt;m~TVFhK)A7)`qv+P$U00{wy6T`;%BRnrp$kFR`Gr(t>@X?zq?Tzi`;mzemDX zlvGuhm${8v_od~AyL@St;V!K$D|c7a*Di9`)z_AmH#Cf=^Xds#T3=pbl=uGTKE6Tm zU;k#+2CB>4HMNpfd8vG{{Yz@Zv!be|%w4$5sI0Bg0Rl$J!s>E@N&hInF{A7B*YQNR z-nF-yWyP<pE3eU^Pi-izuc|Y~*DYJ31I((e&jtBH3uC1gsRmW5YE``|=ihi$rmFd; z)L0fB1KNF(jyJX@P+e^~^?N_1`mr|1;&F68)h{YJCO0=XR(_{tsX_@c)}39rAkL}2 zpOrPgkj~ldmT_G<iz|!yDYdk2DL*G6(9&=^0Z#tOtNtZtJ9ItXZ$n2^bWCi&IA{O( zgv6u)uH=+~gHqE54@u7$I&Aoek)zzBj~kPD{0S$HJ?Z3er<^)|Le|7dlc${az3*pF zot86w#t%;ScxTS?<(_e-KkuyB`2}a6Q+V#2xkc>iEI9vyA6|IT#g`P9EG#W6ueh|b z>axqL7uD3(T~Xg)1Qst@y6nmyEx&5TO1=Foh}8#bjH*TD?(+Kj+IqKANp^)4<)1Tm zuH~z}=H{J!X0KP}JEy>#cXp4@obP2#o{|*rt#Oys)m2xOmKar3b!AC|dr=8&Rf4}^ zlrO3?gypJhOJKdqa`!BEB>(EFh4m%%%iL8prM30-<)udTvhneS)#W7(<uGQAQBq1w zV)RP=#0GampsudAo-gGki`*3yU{P&-IceZrq%jyDDUaYcIVt{Bx3>q40BIM@&CBn_ z`9@_`gS(`mp?uN8>SgY-Kz&usrS2M%S}bT#kgA$0qpGC3>Pnq_e368Qx23@4#B?tV zT*|w9S#6-cH?HH|d4`*yi)tGTcXid}<)kjfsV{E`R2%Nv3U_Hqb+u#$r39x_OKTU^ z=_WdMLTPpVN$!e3O{u1-ZlNVTNYykL^?_1@!t-B$^i@|ElvLH|vP-!qNx5~?tf>uL zTIp`6D=DR=6TG^XY!4$?Z+cDaL$B_#ms^!Lr^uqWQ3=wuHKpa_zdJp8=aVJ*%px_x zu_u!<2?PF<vgLcAM)w$SPfrMUWqC=Rm6C+}{@*C)lB!-2b=~#E``$6*H5g@oBi?Be zuPy+`Ev~9J0wvWwl_a&PGZ4IJ7ssIgCABru^-h3!qzBfWVmDqBr%Jq@a_c^jw$M;Z zm6eq*t|~3J!b&?PpNTe|%9qyBe(2nVIz25^LRsN7odV=+hg$>-RvDG_?`6Ufm-mh% z=^mRtcBHZrqofBFolla*3cZ@E?hNY7uLzVk2y(*xbL`HCN;S&s7gf>FU`F8qX$FCs zK!Xr<Ny&d>S3r5PG+mF{9?EN|$=aGl<u!&~9tp4MderbG^_K=Da6@<LCA@BL6?Afj zH0Zk8sv4uar;=o(`zzPn&6KmMw7#~Xw!(0qSEWlkYuvbQy5w7(q7XEmwlIGDcr~4| z`O<oNyP6Vu?Lf`tHML7>en7q2q|B9md~|#~1EK_*=GL_#n^3Av<{FV7+lXywp>_XI zE;;PImG{WlC4qk2=bf_@hkd`c&pXx=4*Sj$;9>7S?epHRvGMB0RgDb5(N{NKy}B_q zHkJ{1&6+hJo|V;D*tk|X)z}lW3+Fd7zA^|G7On*?_t?g@jl@z6!<ChlPG{WGy1FHG zbw`Z91o>b6bF04p#v&70|N4G8+Pfdg=x_aNR!9CjJp3xv^UtBa+rQo^tX4h$qS(Iu zF8?C&-T$lW-YWc&wOaW<%>j;8-Txfl@fWE<fvX)o|Dqh<?O!DRk){8S`ux2XAUUP- zFOs9Y^|+JOcPy|StZ(@5R@$CW$*RX~xg6Gn)ouxmt5!EPueth~wJqy{>sx>PZ`c0h zx}R?N_v>%C@n=83>E>I0aqDfry!}^q+<Dip@BYni@45GPzrXMP|MS2f9(?HGM>anC z*dHH%;>ka?wQt(IW$U)>J9a+x^fS*sx2xm%7hZhn<=wCBdG)nFzy8LXZ|(id+wZ*l z-uoYzoqrAO`|zWWyFU5!v(LZSf8gMkUw!=zmP*xsbpmwk3C?$#0R6Me|Ig0<zfAwX zHvv8NcRd09XP4japSEbxw1&tsg(~BBio1ZHTO7;y>6TJZFrln$g7s2Zz$PD${Cwr5 z%n{4$tv994u3dcC`#H?W<n!F}I;Oo=KyTpEK!d>@<bi6P_*ux{65m@_UnOf41ts;R zm3D$>lrO9gFd?>I)mbGq`jvboFGc#2wjxbQkEe$C%OovHM-gA*sJSIZpuUU`{LZMa zvRz6QRR-!Cy5E$VUtU&I-piv1F<m|v)Yj-wa|1RkF(e&{FL4y%B#h#_M)l0{$Xd*N zrp2{O<{EmkrSPBEP+ot|!poSO<n>I@y><clo?p^nc$woaE-$RD3)ER3@VES|<WvFc zQYDv`&#YZ)#hf=cch2NV<9+%0R(S9L9k2p9a0FE-z$a({NuUe_f=-YNszE$x2q~ec z5SHJpbIv|zUQwnR&-`27BkNJ)7wTm2UsR_3FO<Jr^R$fF%%VB9wUWtq_&G)<s*y&5 z8d(;vMi%u~Bd0jk$Vo%@rgsc(%NP}_lBQg%k{s(*Kgz#xlv0HV>5e4vABF#L?LV4) zy0|UjIdpR}xsq1i#eF;59Lf5fNH6)7+LCv;|L}flIR2^lJIl^G{F^gMIg92TmTrc- zpBmtpt>U_3_eR%6WeGl6Z0x2Ck5$7Lrne2QODj&zQfluwQL9sGeTGu!4`t)`ZHo|& zjChqX#icUlq;(D2o6_NGOR7sOPAGKri&FjSqp}>SQ7ZL;<Sd6PM!BZ+Q?5w~b&mKL z6^}c9Qop*C;qhvCnM)0yGC&QlPwyJMH??D6TXJ0_zt2uo>YK4jEr{eN=}w9&>_0G0 z4J=Dn1E&m810AU<0a{8NP*+hWD>Z;e@VyVek8%G5cqM5Fbhs0hyDUYyi;|U_eBJfK zyR6ztt#c&zQ^`ggXLEs*65AZ;j`W`to8?G%s`N6RqBxb#xAaMbO?9eN{8I5t#V>VI za$Uwr32MlcGBw0;flBTgus5+IzRg(|SKP1As_Pvf*x#L`+*>k~+einGA>c4rxg7&l zM%R$NX&pVZesCHSC>|-tg&ZPr^p95k9gnLh>O<4r=&v%!KZE=;$UkFJTAL$19z1#A zyL9*tJT*NX@litWtQ09<S%1psRLOG^+ah$nb*557W+`<&G?HJ6)a#Z+l>r}TkY1#I zBQ*Y@PpMz>+-HYB4)>EhZ`tpTG^a{4c*^2b8n~rRN@+_u(yt?u|F6za>K&egk@%Xn z@zAzEw1viVlIt8U_@^uZK8jbadiW?YN+mi{R7R%o!h`U_AK-=iH7^Js*D<e5(YzL? zc`cIHz_XRQoG0}itE?HLpv4sAxcZ*jlK9!(bbtm1G=Ody-~uhW@m@6tWyHBXX{A{F znH9+^0i}}BJg3@uS@>AIAED)&eDCBr!wz!@_wnfNR7Bzoicy26#Hm4(T)JIEf!FHu zmAaoN5@##!Z+IecELtTiSCLD(9)MOuoN5U84=DnY){seq>U15wlt4YjQ%BU*oRqz~ z-g}pIQrg}@9Vy*>GN4$gT|6so+#E3u6*Ci_wqc~)XD+0@@!Uo@fqlRK48L1=gtrBz z42cK7WN>q-A@zg0Quew!lG+k<c_oaeLa7&d+U<OGdc=$5S9GaTr95x&U7%w`q8b73 zj(~SZz(XS_--t;Wdxvz;Mtbwn9B3oFZX{8^@Ou$;4S!|S6VB;S&Y7g8dB~}G2vn3K zE=t8YZc>hc{ouJ|HSmD}bxFmEg;u)#;ZLV>NxG4EbNbck{%}rIVT$et3B&gY?yoFX z>MuNDyKET~z<bIS(IXrc(MRh;+-P2>42xI8$_A)mQ<BuMIYYXvTC(^<=#{vVQ&~LY z-xZ7rpVCjIOi5HJbA+n##gV*6H9{|*A$B+m=R_5M9XRX0Bw3}yL+SLB>DO6(Nye#3 zxuc9!@*hNf4OD|>4R|2F%el8-M@(Ck-Os_k%A!XK^nedvNT|!0m~`40BUz22zaK_= zLnaTbAJCP!H@?H!7U>_Q%~|o_Tf%7G9T24kOp4F?du4w32HFu%q|A=N@oF%*4<?<# z^#k`NcMNDttV<}i>hB?&M^fOCWO&2{%?GFv*I7K0qT5Rn<x5mU=12?Zq3t`jvhj0U zFPhnHK7;+`m`(PWF6EFmfl`+)4}ElG{ImL2`Vxb_g#OX)yE`IvGW$;YC!X9$-RZt~ z0O8?L@PRk=SS#V9$Y;@AO8u1QVmo{)?ybMZVxRr4@uICrpT<zCGEPj$&6t%+&zaPf zu(y9lTw82iOmTEpr0(h>xD!X0VKw}t`)>LP`VhOX=<XAq{~f0>f3MUHy?Ll8Ma91W z52eZ&$vheQrb1t20jnP`N`xNt<@NAIX8dV`C#P)ci;du``AGN>9!j5++SOBw@pgMl zA|2AYPTDavz5Q@GB%ZPI@A1vPZAy*Y-ivQW$E(p(GSui#hjyj!9o&)HHn1+GI5{HI z6sDv`tJK?*>s-Y>{m-sl^uIj!M`$2CF$ekQ=>1SvPe0Vd7mnB{6+4Ahv*G>KaOA*V zB`Hjx92sL65Bt_yp(V2|l{(Y3hQ>un&^l42UYA^#l_I@?^{bHm=&s1yk?>#o5*Dqp zY<-4*=}TDj_-E-$%ypbuUQ=GrhS4l*M{Jf+U!A*{y%^NF`DTb#z$|ubyEOyqW9FAs z8E4ei&t+Gpy4;$Hs_WG(t=C`&^D6aV^xSe{>TNbj)L&9lR?STQ3rV%0wk%Lxeg+$} zXS4r8=s&C68uqSc)w3<krr%s<w`_bX^-)xQdCB7PBmBSWNySPSd2T|?-0E`X^2bGy zgCOE9D`R7rwTXU?-pUPENZeVqixz=VepL<GPnQ@>vDtmBlS#E#{UUmfQ9Z9_36t;K zrRsAji<J)w8bX^NSTV{hPo-X!G^IR6%j(Ki8|xa?<<PWGadKjcBKvdQ^t?x76JWEx zCNkw$`7!fqDmA^xy_BU7XhGr-2n~-Ia5?7Zj;Oo_Upc$ymzLKTQh2GzTcs@LSzD`C zk(9bo{PJsSFAvn6Veg1j0kTf=6ZtZ$q>l9t;R$wB4fTQGDC-J(TTH3DqWtWMo>5=U zy36g_?X70VQ(dIXQYa);MdJ3(DnxD<TAh<yAnw<|?>zSX%QR210-;`^=0zo-Q1<sI z;G?o8)a%{jIHS6O1c=2NiC5krfc18|ylFHJN)7eG@V;JDEz(=Ed1cg^gtt&tH^t1S zb~F#FuBd$W676k5xbd;5yoi26-#YZxl+CTHs<GH0-yxaj_Uv}fHAK^)!K>OO|06%B zf@8#(uhz!QuPQ5_RasJBR9hfB$upN3<!bZM(}CN6tLaXud#wT~b%*w~+9Ine(dP!r z>z5Ul*K17<R0}lTQ28>clcK89%WZzXw->!^)`VblHJ9t9nIg1XybYSeajD<veCCu} z#9X6e+ijg%zM<DUO&u<o1?2+`l@fnuprWF@o>sXxDt}f%Nu5PAsGbqsUGAdV2r<;# zy+cuMkJa*o&eGP1H|ua8!gNah`C2K%YR+n(@Q36cVKa4)MZc;m!Oo{<Ro6C@+l~2J zi!<!L%d2kcRhn}GMqR)VPX75}q2{Z2X_s@2?jGSvyGN8vy=tza!>KE&FYhkxd58Oe z^&5g?FP=HCq`pd&HN0we?wqr8^I4xOt7d_-GI|aw29hrA$%<2UPKEV;g3!XQKxv~& zJuTR4Bn+5yVF3LaX!hUr+na0YV@1-7ydSnpk{tPZY$!6e<Jg~%_#)xu`Pc7X6!;ef z{__-=bo*PU{){>9vlqEvsK7$Wg(q41uH9|xbL+k9GYfJgMgJPnqxnbtqz_;TUbk(* zA=-Aw0MmJ5d6Ibg@yG%CIG#ivrwzqV-UU7RmcSGFCh1CCfi50NU%DpoOW|P|K|kU@ znn(Ok<B@miGUa`i{muZO<FGWT{aK#WkZxS3&oZITo9<fsF9N!G=#UjhveB!x@RxE3 zK8-wr^C}yz21;3)c;tICkK~U&kP>y<U)b-z1PXq4@JLx%lF;EE0ZN&k<B{*L@W}Uc zh$8ff&<v;kIU<f@y!ZKhL|@%E{(m(5e>DC-I{m)*^nLG}|G(b<5fn&1=FiH_eazoK z0-OK&G>@&EVc~LY<$(WrT>nuy9+L%Zsq&aC;QmKp^iNIq|8<raYt0uNQ86+st2-Fr zi&rmOJ=!MfU2j>AU*2iKRk!Z_MqHj1jT+uf`1W7D_A9sb`G~)(4q09v8$R?M!+Y)U z4-<aZ?eE?`RK0h*dHWBKo&Jhn>KNxDkevJ4#jm;5C9hrf+N2}Hzqseky<aLdafOB1 z=Z7pgietE82|TM$jQ^=|#&hc7^R_-{sDJi%p~K&zMd75Q<KOj-Mc+n;{XN=(9a$DE zw96eyJMyk<z7*lMH!VbVlHUSMAW0m}w7{|UyU1wrJNTvbJt7tt+wXQKrN-LtB9qDQ z;6W?A$ei-)u-^w+uj)4YU1VPQRod?v)~oW^@2H9BpVNM4+fx5J4p`}ntSP^{?e~$^ zt6FQnv;CugZu{MBznlB5_@nLjt}m?j<LviB`(5@#<ma*9SwPgkEc^XR``vB7>qd-U zy8Rv@w$px3zsbtyzYEfw^*rD<pwvyIK5*(^gkL_j+ht*_#V7eT^xM#9Lyrxo+c4XP zSvDMNL$?i+ZK!Pcd5o35X~TDIxYvfS+i;H!U$S9`4WF^$4jXQ<VVeyfx8X(`-fzR( zY`DRO>unfGzuA6YZbQR{l{PH4VWAB@Hq5r+6dR7UVX_UC4f`{Ji?lf*e55^&x2mE0 zug7lJ)iW(R{a4{i`xogi1P948f{XA+q>T#_jZDzwTh}L6KTtTgNWA~kze3-CE&g7c z9`4B&J^J=fecxqVkzWLgTiSdM&jmcvUT@%ei037q&v<0}GK=SIo<&l4evx>nMk$%g zF5$VJ=Ruwqc|PSyChP>B0v@rh`~So5?`fAu_4!5Hzew4$`&sprWy7&Hblb2uuSMeg zKMm<nKj2x~&!M`2=QE&fz+DWyhrvwz?+3obQ<mURdx1`LF7L%Z8TcX3=jZ_S*2C<r zgDJY0moNx^PI!U$@w|>(;3GWG;1>8Y&*Qic0v9nTPLFda&U~v27!WH5I27l&RTGck z&<uRX_J0?c!XPPOQh}H8NSJEiPi^-G;LAJ`ricOa5gu`i?!?PH5`GUb%ro6ZLvSl~ zCj(^}INS~V-Wc{e@UH`AWLj~D1Aoqg#WZy@@U-Ju<H7Ab0XL7NpAEdib{oKTw)+m? zD?IB7zXzCdBKvu`Q-Pap_ZHyUEEL^=|61V3Jd$P?a3|}1ujBs=@J$|FFTho&GA>gW z&A@qdl2dRm0Jie@a9<02g-6oa13YPhQu+9w0{kscG46YTKcUkwaBl#vLZ|XZ+|59_ z`%dVy1=#rm#sK{H0k1fny6f*yj{{%l5qt!GW4i^;^jP`&fcNuAUIHh3iGzCz@KM|S zIM6rK;wyoxcoIp!88~GY`;oW>{*LE1I<fnK2Y94h2Z8&1;7OQ+z}30bk;DbYonhtc z20G8gmH_?&^Ld2+0>9>I#7NjTz&UwVxr%_hcsdCG4KVpEiw*)Wm<?~>e<AQA9w}EB z@Wlemmf-&q@Y=I6ugUd60^R3WJR|UibCE;wzY&OC1Lc!2z>PdYLxGd#S!FcNV<(75 z%J>Y>JD)ltd@*nhkAz<foVI}Wi~n?B8;_Jr;JZ8$S762kO6?%baNsRG;(r_PH$SA# z@V^&0^&)6an$v+Lmw-3!GT^UyBrohQsK4?^+<m}Lim4m?KL;k1SYZ-@J|4kA;Bwn7 z@B!QHSxEizR1>!u_-mf^l0I+?kL0xjczu~g+bzJ;E~Wp$zYw^F=XKoI0ypspK3jmX zl~!ErLnycH7WgwB!RKb+(^XdeJ_Eeza>`CRHv_L@(Kj6)*Z@4EhC0IS2X5f;h(GYm zTC4@(E(SL9EWo`5I2rjv+Q<~(G9Kw4mIF82?%S?_{~IU^;RSBtk?_v|R~uGcHv{Jf zEcXK7r#y9p{~UPLVv9c;f%|zj;C~Q!-U|2z_X1$cN@#+6J@D2>>M@D>1zxa<I>KEB zOlYPoxD$bSE#QwkANV#;Bkp&BXRn7ZaTfw#<=Kck^IG)AuY-SZCj%GoNZS<nq3z!V zT=rASPTO1#Ja>cTE&^_~-IdpKT{n-^g$Oj?zmfJun%Tf0kJRIOVB^mf89FrVz%8^A zIQS;ZoeA8^lTMf&z_WfqedEptF6WW(0<&+m@)B5h8~%h5cny!_wHA2uFQGGTfl0qY zh6H~%a2JoX>ki=ZJCs^W7=h|eD}8}?@!W`i2XNo7p$~3>r{7Iq0}dYG*586B?&0^K z>wK@3eiksuBY3U{Zs+mg#(s&4{+-3cF~B={q_4Xh_~+l#XA$Ogf%h{;;}-bC{{t`L zE(4zT0Qlfu0G#v)^GDoMfKTv9J+=W~-e|e^0M|Ya&V&(ofJgZ4An>Cntg$ciNn}VK z!E-6_z*g|beGqurcFG8D)xgVkL2GdX&+mXga9;@ggh%+{b70^_%0;~|1tz}?&iD(w zi$|9cxOg}11plSLM|dRPjliZ?!5RN%VDX#q3~qs4Jd(b^H{P;vHi7s2#iDZ;@CR?h zPt=Q?%aF4Y>!rN_<;=rN;3H6U`^7C#^!CLq@MYWm7Etu>#b2Q4$BSE_=&y@g;2E}C z;3c-Z0w_A+5=P)pZMW!ux7%)kqMt3e2^4*22`^CekHuf0=<kYKpy<GgTcGH-N_c@w eZ1)PF=$(qcK+(UH@B+W#DTHqS`u*>u!2bmiE2a|w literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/gui.exe b/backend/venv/venv/lib/python3.7/site-packages/setuptools/gui.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/launch.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/launch.py new file mode 100644 index 0000000..308283e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/launch.py @@ -0,0 +1,35 @@ +""" +Launch the Python script on the command line after +setuptools is bootstrapped via import. +""" + +# Note that setuptools gets imported implicitly by the +# invocation of this script using python -m setuptools.launch + +import tokenize +import sys + + +def run(): + """ + Run the script in sys.argv[1] as if it had + been invoked naturally. + """ + __builtins__ + script_name = sys.argv[1] + namespace = dict( + __file__=script_name, + __name__='__main__', + __doc__=None, + ) + sys.argv[:] = sys.argv[1:] + + open_ = getattr(tokenize, 'open', open) + script = open_(script_name).read() + norm_script = script.replace('\\r\\n', '\\n') + code = compile(norm_script, script_name, 'exec') + exec(code, namespace) + + +if __name__ == '__main__': + run() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py new file mode 100644 index 0000000..4b1a73f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py @@ -0,0 +1,62 @@ +""" +Customized Mixin2to3 support: + + - adds support for converting doctests + + +This module raises an ImportError on Python 2. +""" + +from distutils.util import Mixin2to3 as _Mixin2to3 +from distutils import log +from lib2to3.refactor import RefactoringTool, get_fixers_from_package + +import setuptools + + +class DistutilsRefactoringTool(RefactoringTool): + def log_error(self, msg, *args, **kw): + log.error(msg, *args) + + def log_message(self, msg, *args): + log.info(msg, *args) + + def log_debug(self, msg, *args): + log.debug(msg, *args) + + +class Mixin2to3(_Mixin2to3): + def run_2to3(self, files, doctests=False): + # See of the distribution option has been set, otherwise check the + # setuptools default. + if self.distribution.use_2to3 is not True: + return + if not files: + return + log.info("Fixing " + " ".join(files)) + self.__build_fixer_names() + self.__exclude_fixers() + if doctests: + if setuptools.run_2to3_on_doctests: + r = DistutilsRefactoringTool(self.fixer_names) + r.refactor(files, write=True, doctests_only=True) + else: + _Mixin2to3.run_2to3(self, files) + + def __build_fixer_names(self): + if self.fixer_names: + return + self.fixer_names = [] + for p in setuptools.lib2to3_fixer_packages: + self.fixer_names.extend(get_fixers_from_package(p)) + if self.distribution.use_2to3_fixers is not None: + for p in self.distribution.use_2to3_fixers: + self.fixer_names.extend(get_fixers_from_package(p)) + + def __exclude_fixers(self): + excluded_fixers = getattr(self, 'exclude_fixers', []) + if self.distribution.use_2to3_exclude_fixers is not None: + excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) + for fixer_name in excluded_fixers: + if fixer_name in self.fixer_names: + self.fixer_names.remove(fixer_name) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/monkey.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/monkey.py new file mode 100644 index 0000000..3c77f8c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/monkey.py @@ -0,0 +1,179 @@ +""" +Monkey patching of distutils. +""" + +import sys +import distutils.filelist +import platform +import types +import functools +from importlib import import_module +import inspect + +from setuptools.extern import six + +import setuptools + +__all__ = [] +""" +Everything is private. Contact the project team +if you think you need this functionality. +""" + + +def _get_mro(cls): + """ + Returns the bases classes for cls sorted by the MRO. + + Works around an issue on Jython where inspect.getmro will not return all + base classes if multiple classes share the same name. Instead, this + function will return a tuple containing the class itself, and the contents + of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. + """ + if platform.python_implementation() == "Jython": + return (cls,) + cls.__bases__ + return inspect.getmro(cls) + + +def get_unpatched(item): + lookup = ( + get_unpatched_class if isinstance(item, six.class_types) else + get_unpatched_function if isinstance(item, types.FunctionType) else + lambda item: None + ) + return lookup(item) + + +def get_unpatched_class(cls): + """Protect against re-patching the distutils if reloaded + + Also ensures that no other distutils extension monkeypatched the distutils + first. + """ + external_bases = ( + cls + for cls in _get_mro(cls) + if not cls.__module__.startswith('setuptools') + ) + base = next(external_bases) + if not base.__module__.startswith('distutils'): + msg = "distutils has already been patched by %r" % cls + raise AssertionError(msg) + return base + + +def patch_all(): + # we can't patch distutils.cmd, alas + distutils.core.Command = setuptools.Command + + has_issue_12885 = sys.version_info <= (3, 5, 3) + + if has_issue_12885: + # fix findall bug in distutils (http://bugs.python.org/issue12885) + distutils.filelist.findall = setuptools.findall + + needs_warehouse = ( + sys.version_info < (2, 7, 13) + or + (3, 4) < sys.version_info < (3, 4, 6) + or + (3, 5) < sys.version_info <= (3, 5, 3) + ) + + if needs_warehouse: + warehouse = 'https://upload.pypi.org/legacy/' + distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse + + _patch_distribution_metadata() + + # Install Distribution throughout the distutils + for module in distutils.dist, distutils.core, distutils.cmd: + module.Distribution = setuptools.dist.Distribution + + # Install the patched Extension + distutils.core.Extension = setuptools.extension.Extension + distutils.extension.Extension = setuptools.extension.Extension + if 'distutils.command.build_ext' in sys.modules: + sys.modules['distutils.command.build_ext'].Extension = ( + setuptools.extension.Extension + ) + + patch_for_msvc_specialized_compiler() + + +def _patch_distribution_metadata(): + """Patch write_pkg_file and read_pkg_file for higher metadata standards""" + for attr in ('write_pkg_file', 'read_pkg_file', 'get_metadata_version'): + new_val = getattr(setuptools.dist, attr) + setattr(distutils.dist.DistributionMetadata, attr, new_val) + + +def patch_func(replacement, target_mod, func_name): + """ + Patch func_name in target_mod with replacement + + Important - original must be resolved by name to avoid + patching an already patched function. + """ + original = getattr(target_mod, func_name) + + # set the 'unpatched' attribute on the replacement to + # point to the original. + vars(replacement).setdefault('unpatched', original) + + # replace the function in the original module + setattr(target_mod, func_name, replacement) + + +def get_unpatched_function(candidate): + return getattr(candidate, 'unpatched') + + +def patch_for_msvc_specialized_compiler(): + """ + Patch functions in distutils to use standalone Microsoft Visual C++ + compilers. + """ + # import late to avoid circular imports on Python < 3.5 + msvc = import_module('setuptools.msvc') + + if platform.system() != 'Windows': + # Compilers only availables on Microsoft Windows + return + + def patch_params(mod_name, func_name): + """ + Prepare the parameters for patch_func to patch indicated function. + """ + repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' + repl_name = repl_prefix + func_name.lstrip('_') + repl = getattr(msvc, repl_name) + mod = import_module(mod_name) + if not hasattr(mod, func_name): + raise ImportError(func_name) + return repl, mod, func_name + + # Python 2.7 to 3.4 + msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') + + # Python 3.5+ + msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') + + try: + # Patch distutils.msvc9compiler + patch_func(*msvc9('find_vcvarsall')) + patch_func(*msvc9('query_vcvarsall')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler._get_vc_env + patch_func(*msvc14('_get_vc_env')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler.gen_lib_options for Numpy + patch_func(*msvc14('gen_lib_options')) + except ImportError: + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/msvc.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/msvc.py new file mode 100644 index 0000000..b9c472f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/msvc.py @@ -0,0 +1,1301 @@ +""" +Improved support for Microsoft Visual C++ compilers. + +Known supported compilers: +-------------------------- +Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + +Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + +Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) +""" + +import os +import sys +import platform +import itertools +import distutils.errors +from setuptools.extern.packaging.version import LegacyVersion + +from setuptools.extern.six.moves import filterfalse + +from .monkey import get_unpatched + +if platform.system() == 'Windows': + from setuptools.extern.six.moves import winreg + safe_env = os.environ +else: + """ + Mock winreg and environ so the module can be imported + on this platform. + """ + + class winreg: + HKEY_USERS = None + HKEY_CURRENT_USER = None + HKEY_LOCAL_MACHINE = None + HKEY_CLASSES_ROOT = None + + safe_env = dict() + +_msvc9_suppress_errors = ( + # msvc9compiler isn't available on some platforms + ImportError, + + # msvc9compiler raises DistutilsPlatformError in some + # environments. See #1118. + distutils.errors.DistutilsPlatformError, +) + +try: + from distutils.msvc9compiler import Reg +except _msvc9_suppress_errors: + pass + + +def msvc9_find_vcvarsall(version): + """ + Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone + compiler build for Python (VCForPython). Fall back to original behavior + when the standalone compiler is not available. + + Redirect the path of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + + Parameters + ---------- + version: float + Required Microsoft Visual C++ version. + + Return + ------ + vcvarsall.bat path: str + """ + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = VC_BASE % ('', version) + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(key, "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + key = VC_BASE % ('Wow6432Node\\', version) + productdir = Reg.get_value(key, "installdir") + except KeyError: + productdir = None + + if productdir: + vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return get_unpatched(msvc9_find_vcvarsall)(version) + + +def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): + """ + Patched "distutils.msvc9compiler.query_vcvarsall" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + + Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + + Parameters + ---------- + ver: float + Required Microsoft Visual C++ version. + arch: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environement from vcvarsall.bat (Classical way) + try: + orig = get_unpatched(msvc9_query_vcvarsall) + return orig(ver, arch, *args, **kwargs) + except distutils.errors.DistutilsPlatformError: + # Pass error if Vcvarsall.bat is missing + pass + except ValueError: + # Pass error if environment not set after executing vcvarsall.bat + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(arch, ver).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, ver, arch) + raise + + +def msvc14_get_vc_env(plat_spec): + """ + Patched "distutils._msvccompiler._get_vc_env" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) + + Parameters + ---------- + plat_spec: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environment from vcvarsall.bat (Classical way) + try: + return get_unpatched(msvc14_get_vc_env)(plat_spec) + except distutils.errors.DistutilsPlatformError: + # Pass error Vcvarsall.bat is missing + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, 14.0) + raise + + +def msvc14_gen_lib_options(*args, **kwargs): + """ + Patched "distutils._msvccompiler.gen_lib_options" for fix + compatibility between "numpy.distutils" and "distutils._msvccompiler" + (for Numpy < 1.11.2) + """ + if "numpy.distutils" in sys.modules: + import numpy as np + if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): + return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) + return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) + + +def _augment_exception(exc, version, arch=''): + """ + Add details to the exception message to help guide the user + as to what action will resolve it. + """ + # Error if MSVC++ directory not found or environment not set + message = exc.args[0] + + if "vcvarsall" in message.lower() or "visual c" in message.lower(): + # Special error message if MSVC++ not installed + tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' + message = tmpl.format(**locals()) + msdownload = 'www.microsoft.com/download/details.aspx?id=%d' + if version == 9.0: + if arch.lower().find('ia64') > -1: + # For VC++ 9.0, if IA64 support is needed, redirect user + # to Windows SDK 7.0 + message += ' Get it with "Microsoft Windows SDK 7.0": ' + message += msdownload % 3138 + else: + # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + message += ' Get it from http://aka.ms/vcpython27' + elif version == 10.0: + # For VC++ 10.0 Redirect user to Windows SDK 7.1 + message += ' Get it with "Microsoft Windows SDK 7.1": ' + message += msdownload % 8279 + elif version >= 14.0: + # For VC++ 14.0 Redirect user to Visual C++ Build Tools + message += (' Get it with "Microsoft Visual C++ Build Tools": ' + r'https://visualstudio.microsoft.com/downloads/') + + exc.args = (message, ) + + +class PlatformInfo: + """ + Current and Target Architectures informations. + + Parameters + ---------- + arch: str + Target architecture. + """ + current_cpu = safe_env.get('processor_architecture', '').lower() + + def __init__(self, arch): + self.arch = arch.lower().replace('x64', 'amd64') + + @property + def target_cpu(self): + return self.arch[self.arch.find('_') + 1:] + + def target_is_x86(self): + return self.target_cpu == 'x86' + + def current_is_x86(self): + return self.current_cpu == 'x86' + + def current_dir(self, hidex86=False, x64=False): + """ + Current platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\target', or '' (see hidex86 parameter) + """ + return ( + '' if (self.current_cpu == 'x86' and hidex86) else + r'\x64' if (self.current_cpu == 'amd64' and x64) else + r'\%s' % self.current_cpu + ) + + def target_dir(self, hidex86=False, x64=False): + r""" + Target platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\current', or '' (see hidex86 parameter) + """ + return ( + '' if (self.target_cpu == 'x86' and hidex86) else + r'\x64' if (self.target_cpu == 'amd64' and x64) else + r'\%s' % self.target_cpu + ) + + def cross_dir(self, forcex86=False): + r""" + Cross platform specific subfolder. + + Parameters + ---------- + forcex86: bool + Use 'x86' as current architecture even if current acritecture is + not x86. + + Return + ------ + subfolder: str + '' if target architecture is current architecture, + '\current_target' if not. + """ + current = 'x86' if forcex86 else self.current_cpu + return ( + '' if self.target_cpu == current else + self.target_dir().replace('\\', '\\%s_' % current) + ) + + +class RegistryInfo: + """ + Microsoft Visual Studio related registry informations. + + Parameters + ---------- + platform_info: PlatformInfo + "PlatformInfo" instance. + """ + HKEYS = (winreg.HKEY_USERS, + winreg.HKEY_CURRENT_USER, + winreg.HKEY_LOCAL_MACHINE, + winreg.HKEY_CLASSES_ROOT) + + def __init__(self, platform_info): + self.pi = platform_info + + @property + def visualstudio(self): + """ + Microsoft Visual Studio root registry key. + """ + return 'VisualStudio' + + @property + def sxs(self): + """ + Microsoft Visual Studio SxS registry key. + """ + return os.path.join(self.visualstudio, 'SxS') + + @property + def vc(self): + """ + Microsoft Visual C++ VC7 registry key. + """ + return os.path.join(self.sxs, 'VC7') + + @property + def vs(self): + """ + Microsoft Visual Studio VS7 registry key. + """ + return os.path.join(self.sxs, 'VS7') + + @property + def vc_for_python(self): + """ + Microsoft Visual C++ for Python registry key. + """ + return r'DevDiv\VCForPython' + + @property + def microsoft_sdk(self): + """ + Microsoft SDK registry key. + """ + return 'Microsoft SDKs' + + @property + def windows_sdk(self): + """ + Microsoft Windows/Platform SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'Windows') + + @property + def netfx_sdk(self): + """ + Microsoft .NET Framework SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'NETFXSDK') + + @property + def windows_kits_roots(self): + """ + Microsoft Windows Kits Roots registry key. + """ + return r'Windows Kits\Installed Roots' + + def microsoft(self, key, x86=False): + """ + Return key in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + x86: str + Force x86 software registry. + + Return + ------ + str: value + """ + node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' + return os.path.join('Software', node64, 'Microsoft', key) + + def lookup(self, key, name): + """ + Look for values in registry in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + name: str + Value name to find. + + Return + ------ + str: value + """ + KEY_READ = winreg.KEY_READ + openkey = winreg.OpenKey + ms = self.microsoft + for hkey in self.HKEYS: + try: + bkey = openkey(hkey, ms(key), 0, KEY_READ) + except (OSError, IOError): + if not self.pi.current_is_x86(): + try: + bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + except (OSError, IOError): + continue + else: + continue + try: + return winreg.QueryValueEx(bkey, name)[0] + except (OSError, IOError): + pass + + +class SystemInfo: + """ + Microsoft Windows and Visual Studio related system inormations. + + Parameters + ---------- + registry_info: RegistryInfo + "RegistryInfo" instance. + vc_ver: float + Required Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + WinDir = safe_env.get('WinDir', '') + ProgramFiles = safe_env.get('ProgramFiles', '') + ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) + + def __init__(self, registry_info, vc_ver=None): + self.ri = registry_info + self.pi = self.ri.pi + self.vc_ver = vc_ver or self._find_latest_available_vc_ver() + + def _find_latest_available_vc_ver(self): + try: + return self.find_available_vc_vers()[-1] + except IndexError: + err = 'No Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + def find_available_vc_vers(self): + """ + Find all available Microsoft Visual C++ versions. + """ + ms = self.ri.microsoft + vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) + vc_vers = [] + for hkey in self.ri.HKEYS: + for key in vckeys: + try: + bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) + except (OSError, IOError): + continue + subkeys, values, _ = winreg.QueryInfoKey(bkey) + for i in range(values): + try: + ver = float(winreg.EnumValue(bkey, i)[0]) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + for i in range(subkeys): + try: + ver = float(winreg.EnumKey(bkey, i)) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + return sorted(vc_vers) + + @property + def VSInstallDir(self): + """ + Microsoft Visual Studio directory. + """ + # Default path + name = 'Microsoft Visual Studio %0.1f' % self.vc_ver + default = os.path.join(self.ProgramFilesx86, name) + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default + + @property + def VCInstallDir(self): + """ + Microsoft Visual C++ directory. + """ + self.VSInstallDir + + guess_vc = self._guess_vc() or self._guess_vc_legacy() + + # Try to get "VC++ for Python" path from registry as default path + reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + python_vc = self.ri.lookup(reg_path, 'installdir') + default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc + + # Try to get path from registry, if fail use default path + path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc + + if not os.path.isdir(path): + msg = 'Microsoft Visual C++ directory not found' + raise distutils.errors.DistutilsPlatformError(msg) + + return path + + def _guess_vc(self): + """ + Locate Visual C for 2017 + """ + if self.vc_ver <= 14.0: + return + + default = r'VC\Tools\MSVC' + guess_vc = os.path.join(self.VSInstallDir, default) + # Subdir with VC exact version as name + try: + vc_exact_ver = os.listdir(guess_vc)[-1] + return os.path.join(guess_vc, vc_exact_ver) + except (OSError, IOError, IndexError): + pass + + def _guess_vc_legacy(self): + """ + Locate Visual C for versions prior to 2017 + """ + default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver + return os.path.join(self.ProgramFilesx86, default) + + @property + def WindowsSdkVersion(self): + """ + Microsoft Windows SDK versions for specified MSVC++ version. + """ + if self.vc_ver <= 9.0: + return ('7.0', '6.1', '6.0a') + elif self.vc_ver == 10.0: + return ('7.1', '7.0a') + elif self.vc_ver == 11.0: + return ('8.0', '8.0a') + elif self.vc_ver == 12.0: + return ('8.1', '8.1a') + elif self.vc_ver >= 14.0: + return ('10.0', '8.1') + + @property + def WindowsSdkLastVersion(self): + """ + Microsoft Windows SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.WindowsSdkDir, 'lib')) + + @property + def WindowsSdkDir(self): + """ + Microsoft Windows SDK directory. + """ + sdkdir = '' + for ver in self.WindowsSdkVersion: + # Try to get it from registry + loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) + sdkdir = self.ri.lookup(loc, 'installationfolder') + if sdkdir: + break + if not sdkdir or not os.path.isdir(sdkdir): + # Try to get "VC++ for Python" version from registry + path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + install_base = self.ri.lookup(path, 'installdir') + if install_base: + sdkdir = os.path.join(install_base, 'WinSDK') + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default new path + for ver in self.WindowsSdkVersion: + intver = ver[:ver.rfind('.')] + path = r'Microsoft SDKs\Windows Kits\%s' % (intver) + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default old path + for ver in self.WindowsSdkVersion: + path = r'Microsoft SDKs\Windows\v%s' % ver + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir: + # If fail, use Platform SDK + sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') + return sdkdir + + @property + def WindowsSDKExecutablePath(self): + """ + Microsoft Windows SDK executable directory. + """ + # Find WinSDK NetFx Tools registry dir name + if self.vc_ver <= 11.0: + netfxver = 35 + arch = '' + else: + netfxver = 40 + hidex86 = True if self.vc_ver <= 12.0 else False + arch = self.pi.current_dir(x64=True, hidex86=hidex86) + fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) + + # liste all possibles registry paths + regpaths = [] + if self.vc_ver >= 14.0: + for ver in self.NetFxSdkVersion: + regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] + + for ver in self.WindowsSdkVersion: + regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] + + # Return installation folder from the more recent path + for path in regpaths: + execpath = self.ri.lookup(path, 'installationfolder') + if execpath: + break + return execpath + + @property + def FSharpInstallDir(self): + """ + Microsoft Visual F# directory. + """ + path = r'%0.1f\Setup\F#' % self.vc_ver + path = os.path.join(self.ri.visualstudio, path) + return self.ri.lookup(path, 'productdir') or '' + + @property + def UniversalCRTSdkDir(self): + """ + Microsoft Universal CRT SDK directory. + """ + # Set Kit Roots versions for specified MSVC++ version + if self.vc_ver >= 14.0: + vers = ('10', '81') + else: + vers = () + + # Find path of the more recent Kit + for ver in vers: + sdkdir = self.ri.lookup(self.ri.windows_kits_roots, + 'kitsroot%s' % ver) + if sdkdir: + break + return sdkdir or '' + + @property + def UniversalCRTSdkLastVersion(self): + """ + Microsoft Universal C Runtime SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.UniversalCRTSdkDir, 'lib')) + + @property + def NetFxSdkVersion(self): + """ + Microsoft .NET Framework SDK versions. + """ + # Set FxSdk versions for specified MSVC++ version + if self.vc_ver >= 14.0: + return ('4.6.1', '4.6') + else: + return () + + @property + def NetFxSdkDir(self): + """ + Microsoft .NET Framework SDK directory. + """ + for ver in self.NetFxSdkVersion: + loc = os.path.join(self.ri.netfx_sdk, ver) + sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') + if sdkdir: + break + return sdkdir or '' + + @property + def FrameworkDir32(self): + """ + Microsoft .NET Framework 32bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw + + @property + def FrameworkDir64(self): + """ + Microsoft .NET Framework 64bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw + + @property + def FrameworkVersion32(self): + """ + Microsoft .NET Framework 32bit versions. + """ + return self._find_dot_net_versions(32) + + @property + def FrameworkVersion64(self): + """ + Microsoft .NET Framework 64bit versions. + """ + return self._find_dot_net_versions(64) + + def _find_dot_net_versions(self, bits): + """ + Find Microsoft .NET Framework versions. + + Parameters + ---------- + bits: int + Platform number of bits: 32 or 64. + """ + # Find actual .NET version in registry + reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) + dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) + ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' + + # Set .NET versions for specified MSVC++ version + if self.vc_ver >= 12.0: + frameworkver = (ver, 'v4.0') + elif self.vc_ver >= 10.0: + frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, + 'v3.5') + elif self.vc_ver == 9.0: + frameworkver = ('v3.5', 'v2.0.50727') + if self.vc_ver == 8.0: + frameworkver = ('v3.0', 'v2.0.50727') + return frameworkver + + def _use_last_dir_name(self, path, prefix=''): + """ + Return name of the last dir in path or '' if no dir found. + + Parameters + ---------- + path: str + Use dirs in this path + prefix: str + Use only dirs startings by this prefix + """ + matching_dirs = ( + dir_name + for dir_name in reversed(os.listdir(path)) + if os.path.isdir(os.path.join(path, dir_name)) and + dir_name.startswith(prefix) + ) + return next(matching_dirs, None) or '' + + +class EnvironmentInfo: + """ + Return environment variables for specified Microsoft Visual C++ version + and platform : Lib, Include, Path and libpath. + + This function is compatible with Microsoft Visual C++ 9.0 to 14.0. + + Script created by analysing Microsoft environment configuration files like + "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... + + Parameters + ---------- + arch: str + Target architecture. + vc_ver: float + Required Microsoft Visual C++ version. If not set, autodetect the last + version. + vc_min_ver: float + Minimum Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + + def __init__(self, arch, vc_ver=None, vc_min_ver=0): + self.pi = PlatformInfo(arch) + self.ri = RegistryInfo(self.pi) + self.si = SystemInfo(self.ri, vc_ver) + + if self.vc_ver < vc_min_ver: + err = 'No suitable Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + @property + def vc_ver(self): + """ + Microsoft Visual C++ version. + """ + return self.si.vc_ver + + @property + def VSTools(self): + """ + Microsoft Visual Studio Tools + """ + paths = [r'Common7\IDE', r'Common7\Tools'] + + if self.vc_ver >= 14.0: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] + paths += [r'Team Tools\Performance Tools'] + paths += [r'Team Tools\Performance Tools%s' % arch_subdir] + + return [os.path.join(self.si.VSInstallDir, path) for path in paths] + + @property + def VCIncludes(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Includes + """ + return [os.path.join(self.si.VCInstallDir, 'Include'), + os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] + + @property + def VCLibraries(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Libraries + """ + if self.vc_ver >= 15.0: + arch_subdir = self.pi.target_dir(x64=True) + else: + arch_subdir = self.pi.target_dir(hidex86=True) + paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] + + if self.vc_ver >= 14.0: + paths += [r'Lib\store%s' % arch_subdir] + + return [os.path.join(self.si.VCInstallDir, path) for path in paths] + + @property + def VCStoreRefs(self): + """ + Microsoft Visual C++ store references Libraries + """ + if self.vc_ver < 14.0: + return [] + return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] + + @property + def VCTools(self): + """ + Microsoft Visual C++ Tools + """ + si = self.si + tools = [os.path.join(si.VCInstallDir, 'VCPackages')] + + forcex86 = True if self.vc_ver <= 10.0 else False + arch_subdir = self.pi.cross_dir(forcex86) + if arch_subdir: + tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] + + if self.vc_ver == 14.0: + path = 'Bin%s' % self.pi.current_dir(hidex86=True) + tools += [os.path.join(si.VCInstallDir, path)] + + elif self.vc_ver >= 15.0: + host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else + r'bin\HostX64%s') + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] + + if self.pi.current_cpu != self.pi.target_cpu: + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] + + else: + tools += [os.path.join(si.VCInstallDir, 'Bin')] + + return tools + + @property + def OSLibraries(self): + """ + Microsoft Windows SDK Libraries + """ + if self.vc_ver <= 10.0: + arch_subdir = self.pi.target_dir(hidex86=True, x64=True) + return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] + + else: + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.WindowsSdkDir, 'lib') + libver = self._sdk_subdir + return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] + + @property + def OSIncludes(self): + """ + Microsoft Windows SDK Include + """ + include = os.path.join(self.si.WindowsSdkDir, 'include') + + if self.vc_ver <= 10.0: + return [include, os.path.join(include, 'gl')] + + else: + if self.vc_ver >= 14.0: + sdkver = self._sdk_subdir + else: + sdkver = '' + return [os.path.join(include, '%sshared' % sdkver), + os.path.join(include, '%sum' % sdkver), + os.path.join(include, '%swinrt' % sdkver)] + + @property + def OSLibpath(self): + """ + Microsoft Windows SDK Libraries Paths + """ + ref = os.path.join(self.si.WindowsSdkDir, 'References') + libpath = [] + + if self.vc_ver <= 9.0: + libpath += self.OSLibraries + + if self.vc_ver >= 11.0: + libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] + + if self.vc_ver >= 14.0: + libpath += [ + ref, + os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), + os.path.join( + ref, + 'Windows.Foundation.UniversalApiContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Foundation.FoundationContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Networking.Connectivity.WwanContract', + '1.0.0.0', + ), + os.path.join( + self.si.WindowsSdkDir, + 'ExtensionSDKs', + 'Microsoft.VCLibs', + '%0.1f' % self.vc_ver, + 'References', + 'CommonConfiguration', + 'neutral', + ), + ] + return libpath + + @property + def SdkTools(self): + """ + Microsoft Windows SDK Tools + """ + return list(self._sdk_tools()) + + def _sdk_tools(self): + """ + Microsoft Windows SDK Tools paths generator + """ + if self.vc_ver < 15.0: + bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' + yield os.path.join(self.si.WindowsSdkDir, bin_dir) + + if not self.pi.current_is_x86(): + arch_subdir = self.pi.current_dir(x64=True) + path = 'Bin%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + if self.vc_ver == 10.0 or self.vc_ver == 11.0: + if self.pi.target_is_x86(): + arch_subdir = '' + else: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + elif self.vc_ver >= 15.0: + path = os.path.join(self.si.WindowsSdkDir, 'Bin') + arch_subdir = self.pi.current_dir(x64=True) + sdkver = self.si.WindowsSdkLastVersion + yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) + + if self.si.WindowsSDKExecutablePath: + yield self.si.WindowsSDKExecutablePath + + @property + def _sdk_subdir(self): + """ + Microsoft Windows SDK version subdir + """ + ucrtver = self.si.WindowsSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def SdkSetup(self): + """ + Microsoft Windows SDK Setup + """ + if self.vc_ver > 9.0: + return [] + + return [os.path.join(self.si.WindowsSdkDir, 'Setup')] + + @property + def FxTools(self): + """ + Microsoft .NET Framework Tools + """ + pi = self.pi + si = self.si + + if self.vc_ver <= 10.0: + include32 = True + include64 = not pi.target_is_x86() and not pi.current_is_x86() + else: + include32 = pi.target_is_x86() or pi.current_is_x86() + include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' + + tools = [] + if include32: + tools += [os.path.join(si.FrameworkDir32, ver) + for ver in si.FrameworkVersion32] + if include64: + tools += [os.path.join(si.FrameworkDir64, ver) + for ver in si.FrameworkVersion64] + return tools + + @property + def NetFxSDKLibraries(self): + """ + Microsoft .Net Framework SDK Libraries + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] + + @property + def NetFxSDKIncludes(self): + """ + Microsoft .Net Framework SDK Includes + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + return [os.path.join(self.si.NetFxSdkDir, r'include\um')] + + @property + def VsTDb(self): + """ + Microsoft Visual Studio Team System Database + """ + return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] + + @property + def MSBuild(self): + """ + Microsoft Build Engine + """ + if self.vc_ver < 12.0: + return [] + elif self.vc_ver < 15.0: + base_path = self.si.ProgramFilesx86 + arch_subdir = self.pi.current_dir(hidex86=True) + else: + base_path = self.si.VSInstallDir + arch_subdir = '' + + path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) + build = [os.path.join(base_path, path)] + + if self.vc_ver >= 15.0: + # Add Roslyn C# & Visual Basic Compiler + build += [os.path.join(base_path, path, 'Roslyn')] + + return build + + @property + def HTMLHelpWorkshop(self): + """ + Microsoft HTML Help Workshop + """ + if self.vc_ver < 11.0: + return [] + + return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] + + @property + def UCRTLibraries(self): + """ + Microsoft Universal C Runtime SDK Libraries + """ + if self.vc_ver < 14.0: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') + ucrtver = self._ucrt_subdir + return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] + + @property + def UCRTIncludes(self): + """ + Microsoft Universal C Runtime SDK Include + """ + if self.vc_ver < 14.0: + return [] + + include = os.path.join(self.si.UniversalCRTSdkDir, 'include') + return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] + + @property + def _ucrt_subdir(self): + """ + Microsoft Universal C Runtime SDK version subdir + """ + ucrtver = self.si.UniversalCRTSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def FSharp(self): + """ + Microsoft Visual F# + """ + if self.vc_ver < 11.0 and self.vc_ver > 12.0: + return [] + + return self.si.FSharpInstallDir + + @property + def VCRuntimeRedist(self): + """ + Microsoft Visual C++ runtime redistribuable dll + """ + arch_subdir = self.pi.target_dir(x64=True) + if self.vc_ver < 15: + redist_path = self.si.VCInstallDir + vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + else: + redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') + vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + + # Visual Studio 2017 is still Visual C++ 14.0 + dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver + + vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) + return os.path.join(redist_path, vcruntime) + + def return_env(self, exists=True): + """ + Return environment dict. + + Parameters + ---------- + exists: bool + It True, only return existing paths. + """ + env = dict( + include=self._build_paths('include', + [self.VCIncludes, + self.OSIncludes, + self.UCRTIncludes, + self.NetFxSDKIncludes], + exists), + lib=self._build_paths('lib', + [self.VCLibraries, + self.OSLibraries, + self.FxTools, + self.UCRTLibraries, + self.NetFxSDKLibraries], + exists), + libpath=self._build_paths('libpath', + [self.VCLibraries, + self.FxTools, + self.VCStoreRefs, + self.OSLibpath], + exists), + path=self._build_paths('path', + [self.VCTools, + self.VSTools, + self.VsTDb, + self.SdkTools, + self.SdkSetup, + self.FxTools, + self.MSBuild, + self.HTMLHelpWorkshop, + self.FSharp], + exists), + ) + if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): + env['py_vcruntime_redist'] = self.VCRuntimeRedist + return env + + def _build_paths(self, name, spec_path_lists, exists): + """ + Given an environment variable name and specified paths, + return a pathsep-separated string of paths containing + unique, extant, directories from those paths and from + the environment variable. Raise an error if no paths + are resolved. + """ + # flatten spec_path_lists + spec_paths = itertools.chain.from_iterable(spec_path_lists) + env_paths = safe_env.get(name, '').split(os.pathsep) + paths = itertools.chain(spec_paths, env_paths) + extant_paths = list(filter(os.path.isdir, paths)) if exists else paths + if not extant_paths: + msg = "%s environment variable is empty" % name.upper() + raise distutils.errors.DistutilsPlatformError(msg) + unique_paths = self._unique_everseen(extant_paths) + return os.pathsep.join(unique_paths) + + # from Python docs + def _unique_everseen(self, iterable, key=None): + """ + List unique elements, preserving order. + Remember all elements ever seen. + + _unique_everseen('AAAABBBCCDAABBB') --> A B C D + + _unique_everseen('ABBCcAD', str.lower) --> A B C D + """ + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/namespaces.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/namespaces.py new file mode 100644 index 0000000..dc16106 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/namespaces.py @@ -0,0 +1,107 @@ +import os +from distutils import log +import itertools + +from setuptools.extern.six.moves import map + + +flatten = itertools.chain.from_iterable + + +class Installer: + + nspkg_ext = '-nspkg.pth' + + def install_namespaces(self): + nsp = self._get_all_ns_packages() + if not nsp: + return + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + self.outputs.append(filename) + log.info("Installing %s", filename) + lines = map(self._gen_nspkg_line, nsp) + + if self.dry_run: + # always generate the lines, even in dry run + list(lines) + return + + with open(filename, 'wt') as f: + f.writelines(lines) + + def uninstall_namespaces(self): + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + if not os.path.exists(filename): + return + log.info("Removing %s", filename) + os.remove(filename) + + def _get_target(self): + return self.target + + _nspkg_tmpl = ( + "import sys, types, os", + "has_mfs = sys.version_info > (3, 5)", + "p = os.path.join(%(root)s, *%(pth)r)", + "importlib = has_mfs and __import__('importlib.util')", + "has_mfs and __import__('importlib.machinery')", + "m = has_mfs and " + "sys.modules.setdefault(%(pkg)r, " + "importlib.util.module_from_spec(" + "importlib.machinery.PathFinder.find_spec(%(pkg)r, " + "[os.path.dirname(p)])))", + "m = m or " + "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", + "mp = (m or []) and m.__dict__.setdefault('__path__',[])", + "(p not in mp) and mp.append(p)", + ) + "lines for the namespace installer" + + _nspkg_tmpl_multi = ( + 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', + ) + "additional line(s) when a parent package is indicated" + + def _get_root(self): + return "sys._getframe(1).f_locals['sitedir']" + + def _gen_nspkg_line(self, pkg): + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + root = self._get_root() + tmpl_lines = self._nspkg_tmpl + parent, sep, child = pkg.rpartition('.') + if parent: + tmpl_lines += self._nspkg_tmpl_multi + return ';'.join(tmpl_lines) % locals() + '\n' + + def _get_all_ns_packages(self): + """Return sorted list of all package namespaces""" + pkgs = self.distribution.namespace_packages or [] + return sorted(flatten(map(self._pkg_names, pkgs))) + + @staticmethod + def _pkg_names(pkg): + """ + Given a namespace package, yield the components of that + package. + + >>> names = Installer._pkg_names('a.b.c') + >>> set(names) == set(['a', 'a.b', 'a.b.c']) + True + """ + parts = pkg.split('.') + while parts: + yield '.'.join(parts) + parts.pop() + + +class DevelopInstaller(Installer): + def _get_root(self): + return repr(str(self.egg_path)) + + def _get_target(self): + return self.egg_link diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/package_index.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/package_index.py new file mode 100644 index 0000000..6b06f2c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/package_index.py @@ -0,0 +1,1136 @@ +"""PyPI and direct package downloading""" +import sys +import os +import re +import shutil +import socket +import base64 +import hashlib +import itertools +import warnings +from functools import wraps + +from setuptools.extern import six +from setuptools.extern.six.moves import urllib, http_client, configparser, map + +import setuptools +from pkg_resources import ( + CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, + Environment, find_distributions, safe_name, safe_version, + to_filename, Requirement, DEVELOP_DIST, EGG_DIST, +) +from setuptools import ssl_support +from distutils import log +from distutils.errors import DistutilsError +from fnmatch import translate +from setuptools.py27compat import get_all_headers +from setuptools.py33compat import unescape +from setuptools.wheel import Wheel + +__metaclass__ = type + +EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') +HREF = re.compile(r"""href\s*=\s*['"]?([^'"> ]+)""", re.I) +PYPI_MD5 = re.compile( + r'<a href="([^"#]+)">([^<]+)</a>\n\s+\(<a (?:title="MD5 hash"\n\s+)' + r'href="[^?]+\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\)' +) +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match +EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() + +__all__ = [ + 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', + 'interpret_distro_name', +] + +_SOCKET_TIMEOUT = 15 + +_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" +user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) + + +def parse_requirement_arg(spec): + try: + return Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % (spec,) + ) + + +def parse_bdist_wininst(name): + """Return (base,pyversion) or (None,None) for possible .exe name""" + + lower = name.lower() + base, py_ver, plat = None, None, None + + if lower.endswith('.exe'): + if lower.endswith('.win32.exe'): + base = name[:-10] + plat = 'win32' + elif lower.startswith('.win32-py', -16): + py_ver = name[-7:-4] + base = name[:-16] + plat = 'win32' + elif lower.endswith('.win-amd64.exe'): + base = name[:-14] + plat = 'win-amd64' + elif lower.startswith('.win-amd64-py', -20): + py_ver = name[-7:-4] + base = name[:-20] + plat = 'win-amd64' + return base, py_ver, plat + + +def egg_info_for_url(url): + parts = urllib.parse.urlparse(url) + scheme, server, path, parameters, query, fragment = parts + base = urllib.parse.unquote(path.split('/')[-1]) + if server == 'sourceforge.net' and base == 'download': # XXX Yuck + base = urllib.parse.unquote(path.split('/')[-2]) + if '#' in base: + base, fragment = base.split('#', 1) + return base, fragment + + +def distros_for_url(url, metadata=None): + """Yield egg or source distribution objects that might be found at a URL""" + base, fragment = egg_info_for_url(url) + for dist in distros_for_location(url, base, metadata): + yield dist + if fragment: + match = EGG_FRAGMENT.match(fragment) + if match: + for dist in interpret_distro_name( + url, match.group(1), metadata, precedence=CHECKOUT_DIST + ): + yield dist + + +def distros_for_location(location, basename, metadata=None): + """Yield egg or source distribution objects based on basename""" + if basename.endswith('.egg.zip'): + basename = basename[:-4] # strip the .zip + if basename.endswith('.egg') and '-' in basename: + # only one, unambiguous interpretation + return [Distribution.from_location(location, basename, metadata)] + if basename.endswith('.whl') and '-' in basename: + wheel = Wheel(basename) + if not wheel.is_compatible(): + return [] + return [Distribution( + location=location, + project_name=wheel.project_name, + version=wheel.version, + # Increase priority over eggs. + precedence=EGG_DIST + 1, + )] + if basename.endswith('.exe'): + win_base, py_ver, platform = parse_bdist_wininst(basename) + if win_base is not None: + return interpret_distro_name( + location, win_base, metadata, py_ver, BINARY_DIST, platform + ) + # Try source distro extensions (.zip, .tgz, etc.) + # + for ext in EXTENSIONS: + if basename.endswith(ext): + basename = basename[:-len(ext)] + return interpret_distro_name(location, basename, metadata) + return [] # no extension matched + + +def distros_for_filename(filename, metadata=None): + """Yield possible egg or source distribution objects based on a filename""" + return distros_for_location( + normalize_path(filename), os.path.basename(filename), metadata + ) + + +def interpret_distro_name( + location, basename, metadata, py_version=None, precedence=SOURCE_DIST, + platform=None +): + """Generate alternative interpretations of a source distro name + + Note: if `location` is a filesystem filename, you should call + ``pkg_resources.normalize_path()`` on it before passing it to this + routine! + """ + # Generate alternative interpretations of a source distro name + # Because some packages are ambiguous as to name/versions split + # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. + # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" + # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, + # the spurious interpretations should be ignored, because in the event + # there's also an "adns" package, the spurious "python-1.1.0" version will + # compare lower than any numeric version number, and is therefore unlikely + # to match a request for it. It's still a potential problem, though, and + # in the long run PyPI and the distutils should go for "safe" names and + # versions in distribution archive names (sdist and bdist). + + parts = basename.split('-') + if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): + # it is a bdist_dumb, not an sdist -- bail out + return + + for p in range(1, len(parts) + 1): + yield Distribution( + location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), + py_version=py_version, precedence=precedence, + platform=platform + ) + + +# From Python 2.7 docs +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in six.moves.filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def unique_values(func): + """ + Wrap a function returning an iterable such that the resulting iterable + only ever yields unique items. + """ + + @wraps(func) + def wrapper(*args, **kwargs): + return unique_everseen(func(*args, **kwargs)) + + return wrapper + + +REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) +# this line is here to fix emacs' cruddy broken syntax highlighting + + +@unique_values +def find_external_links(url, page): + """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" + + for match in REL.finditer(page): + tag, rel = match.groups() + rels = set(map(str.strip, rel.lower().split(','))) + if 'homepage' in rels or 'download' in rels: + for match in HREF.finditer(tag): + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + for tag in ("<th>Home Page", "<th>Download URL"): + pos = page.find(tag) + if pos != -1: + match = HREF.search(page, pos) + if match: + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + +class ContentChecker: + """ + A null content checker that defines the interface for checking content + """ + + def feed(self, block): + """ + Feed a block of data to the hash. + """ + return + + def is_valid(self): + """ + Check the hash. Return False if validation fails. + """ + return True + + def report(self, reporter, template): + """ + Call reporter with information about the checker (hash name) + substituted into the template. + """ + return + + +class HashChecker(ContentChecker): + pattern = re.compile( + r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' + r'(?P<expected>[a-f0-9]+)' + ) + + def __init__(self, hash_name, expected): + self.hash_name = hash_name + self.hash = hashlib.new(hash_name) + self.expected = expected + + @classmethod + def from_url(cls, url): + "Construct a (possibly null) ContentChecker from a URL" + fragment = urllib.parse.urlparse(url)[-1] + if not fragment: + return ContentChecker() + match = cls.pattern.search(fragment) + if not match: + return ContentChecker() + return cls(**match.groupdict()) + + def feed(self, block): + self.hash.update(block) + + def is_valid(self): + return self.hash.hexdigest() == self.expected + + def report(self, reporter, template): + msg = template % self.hash_name + return reporter(msg) + + +class PackageIndex(Environment): + """A distribution index that scans web pages for download URLs""" + + def __init__( + self, index_url="https://pypi.org/simple/", hosts=('*',), + ca_bundle=None, verify_ssl=True, *args, **kw + ): + Environment.__init__(self, *args, **kw) + self.index_url = index_url + "/" [:not index_url.endswith('/')] + self.scanned_urls = {} + self.fetched_urls = {} + self.package_pages = {} + self.allows = re.compile('|'.join(map(translate, hosts))).match + self.to_scan = [] + use_ssl = ( + verify_ssl + and ssl_support.is_available + and (ca_bundle or ssl_support.find_ca_bundle()) + ) + if use_ssl: + self.opener = ssl_support.opener_for(ca_bundle) + else: + self.opener = urllib.request.urlopen + + def process_url(self, url, retrieve=False): + """Evaluate a URL as a possible download, and maybe retrieve it""" + if url in self.scanned_urls and not retrieve: + return + self.scanned_urls[url] = True + if not URL_SCHEME(url): + self.process_filename(url) + return + else: + dists = list(distros_for_url(url)) + if dists: + if not self.url_ok(url): + return + self.debug("Found link: %s", url) + + if dists or not retrieve or url in self.fetched_urls: + list(map(self.add, dists)) + return # don't need the actual page + + if not self.url_ok(url): + self.fetched_urls[url] = True + return + + self.info("Reading %s", url) + self.fetched_urls[url] = True # prevent multiple fetch attempts + tmpl = "Download error on %s: %%s -- Some packages may not be found!" + f = self.open_url(url, tmpl % url) + if f is None: + return + self.fetched_urls[f.url] = True + if 'html' not in f.headers.get('content-type', '').lower(): + f.close() # not html, we can't process it + return + + base = f.url # handle redirects + page = f.read() + if not isinstance(page, str): + # In Python 3 and got bytes but want str. + if isinstance(f, urllib.error.HTTPError): + # Errors have no charset, assume latin1: + charset = 'latin-1' + else: + charset = f.headers.get_param('charset') or 'latin-1' + page = page.decode(charset, "ignore") + f.close() + for match in HREF.finditer(page): + link = urllib.parse.urljoin(base, htmldecode(match.group(1))) + self.process_url(link) + if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: + page = self.process_index(url, page) + + def process_filename(self, fn, nested=False): + # process filenames or directories + if not os.path.exists(fn): + self.warn("Not found: %s", fn) + return + + if os.path.isdir(fn) and not nested: + path = os.path.realpath(fn) + for item in os.listdir(path): + self.process_filename(os.path.join(path, item), True) + + dists = distros_for_filename(fn) + if dists: + self.debug("Found: %s", fn) + list(map(self.add, dists)) + + def url_ok(self, url, fatal=False): + s = URL_SCHEME(url) + is_file = s and s.group(1).lower() == 'file' + if is_file or self.allows(urllib.parse.urlparse(url)[1]): + return True + msg = ( + "\nNote: Bypassing %s (disallowed host; see " + "http://bit.ly/2hrImnY for details).\n") + if fatal: + raise DistutilsError(msg % url) + else: + self.warn(msg, url) + + def scan_egg_links(self, search_path): + dirs = filter(os.path.isdir, search_path) + egg_links = ( + (path, entry) + for path in dirs + for entry in os.listdir(path) + if entry.endswith('.egg-link') + ) + list(itertools.starmap(self.scan_egg_link, egg_links)) + + def scan_egg_link(self, path, entry): + with open(os.path.join(path, entry)) as raw_lines: + # filter non-empty lines + lines = list(filter(None, map(str.strip, raw_lines))) + + if len(lines) != 2: + # format is not recognized; punt + return + + egg_path, setup_path = lines + + for dist in find_distributions(os.path.join(path, egg_path)): + dist.location = os.path.join(path, *lines) + dist.precedence = SOURCE_DIST + self.add(dist) + + def process_index(self, url, page): + """Process the contents of a PyPI page""" + + def scan(link): + # Process a URL to see if it's for a package page + if link.startswith(self.index_url): + parts = list(map( + urllib.parse.unquote, link[len(self.index_url):].split('/') + )) + if len(parts) == 2 and '#' not in parts[1]: + # it's a package page, sanitize and index it + pkg = safe_name(parts[0]) + ver = safe_version(parts[1]) + self.package_pages.setdefault(pkg.lower(), {})[link] = True + return to_filename(pkg), to_filename(ver) + return None, None + + # process an index page into the package-page index + for match in HREF.finditer(page): + try: + scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) + except ValueError: + pass + + pkg, ver = scan(url) # ensure this page is in the page index + if pkg: + # process individual package page + for new_url in find_external_links(url, page): + # Process the found URL + base, frag = egg_info_for_url(new_url) + if base.endswith('.py') and not frag: + if ver: + new_url += '#egg=%s-%s' % (pkg, ver) + else: + self.need_version_info(url) + self.scan_url(new_url) + + return PYPI_MD5.sub( + lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page + ) + else: + return "" # no sense double-scanning non-package pages + + def need_version_info(self, url): + self.scan_all( + "Page at %s links to .py file(s) without version info; an index " + "scan is required.", url + ) + + def scan_all(self, msg=None, *args): + if self.index_url not in self.fetched_urls: + if msg: + self.warn(msg, *args) + self.info( + "Scanning index of all packages (this may take a while)" + ) + self.scan_url(self.index_url) + + def find_packages(self, requirement): + self.scan_url(self.index_url + requirement.unsafe_name + '/') + + if not self.package_pages.get(requirement.key): + # Fall back to safe version of the name + self.scan_url(self.index_url + requirement.project_name + '/') + + if not self.package_pages.get(requirement.key): + # We couldn't find the target package, so search the index page too + self.not_found_in_index(requirement) + + for url in list(self.package_pages.get(requirement.key, ())): + # scan each page that might be related to the desired package + self.scan_url(url) + + def obtain(self, requirement, installer=None): + self.prescan() + self.find_packages(requirement) + for dist in self[requirement.key]: + if dist in requirement: + return dist + self.debug("%s does not match %s", requirement, dist) + return super(PackageIndex, self).obtain(requirement, installer) + + def check_hash(self, checker, filename, tfp): + """ + checker is a ContentChecker + """ + checker.report( + self.debug, + "Validating %%s checksum for %s" % filename) + if not checker.is_valid(): + tfp.close() + os.unlink(filename) + raise DistutilsError( + "%s validation failed for %s; " + "possible download problem?" + % (checker.hash.name, os.path.basename(filename)) + ) + + def add_find_links(self, urls): + """Add `urls` to the list that will be prescanned for searches""" + for url in urls: + if ( + self.to_scan is None # if we have already "gone online" + or not URL_SCHEME(url) # or it's a local file/directory + or url.startswith('file:') + or list(distros_for_url(url)) # or a direct package link + ): + # then go ahead and process it now + self.scan_url(url) + else: + # otherwise, defer retrieval till later + self.to_scan.append(url) + + def prescan(self): + """Scan urls scheduled for prescanning (e.g. --find-links)""" + if self.to_scan: + list(map(self.scan_url, self.to_scan)) + self.to_scan = None # from now on, go ahead and process immediately + + def not_found_in_index(self, requirement): + if self[requirement.key]: # we've seen at least one distro + meth, msg = self.info, "Couldn't retrieve index page for %r" + else: # no distros seen for this name, might be misspelled + meth, msg = ( + self.warn, + "Couldn't find index page for %r (maybe misspelled?)") + meth(msg, requirement.unsafe_name) + self.scan_all() + + def download(self, spec, tmpdir): + """Locate and/or download `spec` to `tmpdir`, returning a local path + + `spec` may be a ``Requirement`` object, or a string containing a URL, + an existing local filename, or a project/version requirement spec + (i.e. the string form of a ``Requirement`` object). If it is the URL + of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one + that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is + automatically created alongside the downloaded file. + + If `spec` is a ``Requirement`` object or a string containing a + project/version requirement spec, this method returns the location of + a matching distribution (possibly after downloading it to `tmpdir`). + If `spec` is a locally existing file or directory name, it is simply + returned unchanged. If `spec` is a URL, it is downloaded to a subpath + of `tmpdir`, and the local filename is returned. Various errors may be + raised if a problem occurs during downloading. + """ + if not isinstance(spec, Requirement): + scheme = URL_SCHEME(spec) + if scheme: + # It's a url, download it to tmpdir + found = self._download_url(scheme.group(1), spec, tmpdir) + base, fragment = egg_info_for_url(spec) + if base.endswith('.py'): + found = self.gen_setup(found, fragment, tmpdir) + return found + elif os.path.exists(spec): + # Existing file or directory, just return it + return spec + else: + spec = parse_requirement_arg(spec) + return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) + + def fetch_distribution( + self, requirement, tmpdir, force_scan=False, source=False, + develop_ok=False, local_index=None): + """Obtain a distribution suitable for fulfilling `requirement` + + `requirement` must be a ``pkg_resources.Requirement`` instance. + If necessary, or if the `force_scan` flag is set, the requirement is + searched for in the (online) package index as well as the locally + installed packages. If a distribution matching `requirement` is found, + the returned distribution's ``location`` is the value you would have + gotten from calling the ``download()`` method with the matching + distribution's URL or filename. If no matching distribution is found, + ``None`` is returned. + + If the `source` flag is set, only source distributions and source + checkout links will be considered. Unless the `develop_ok` flag is + set, development and system eggs (i.e., those using the ``.egg-info`` + format) will be ignored. + """ + # process a Requirement + self.info("Searching for %s", requirement) + skipped = {} + dist = None + + def find(req, env=None): + if env is None: + env = self + # Find a matching distribution; may be called more than once + + for dist in env[req.key]: + + if dist.precedence == DEVELOP_DIST and not develop_ok: + if dist not in skipped: + self.warn( + "Skipping development or system egg: %s", dist, + ) + skipped[dist] = 1 + continue + + test = ( + dist in req + and (dist.precedence <= SOURCE_DIST or not source) + ) + if test: + loc = self.download(dist.location, tmpdir) + dist.download_location = loc + if os.path.exists(dist.download_location): + return dist + + if force_scan: + self.prescan() + self.find_packages(requirement) + dist = find(requirement) + + if not dist and local_index is not None: + dist = find(requirement, local_index) + + if dist is None: + if self.to_scan is not None: + self.prescan() + dist = find(requirement) + + if dist is None and not force_scan: + self.find_packages(requirement) + dist = find(requirement) + + if dist is None: + self.warn( + "No local packages or working download links found for %s%s", + (source and "a source distribution of " or ""), + requirement, + ) + else: + self.info("Best match: %s", dist) + return dist.clone(location=dist.download_location) + + def fetch(self, requirement, tmpdir, force_scan=False, source=False): + """Obtain a file suitable for fulfilling `requirement` + + DEPRECATED; use the ``fetch_distribution()`` method now instead. For + backward compatibility, this routine is identical but returns the + ``location`` of the downloaded distribution instead of a distribution + object. + """ + dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) + if dist is not None: + return dist.location + return None + + def gen_setup(self, filename, fragment, tmpdir): + match = EGG_FRAGMENT.match(fragment) + dists = match and [ + d for d in + interpret_distro_name(filename, match.group(1), None) if d.version + ] or [] + + if len(dists) == 1: # unambiguous ``#egg`` fragment + basename = os.path.basename(filename) + + # Make sure the file has been downloaded to the temp dir. + if os.path.dirname(filename) != tmpdir: + dst = os.path.join(tmpdir, basename) + from setuptools.command.easy_install import samefile + if not samefile(filename, dst): + shutil.copy2(filename, dst) + filename = dst + + with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: + file.write( + "from setuptools import setup\n" + "setup(name=%r, version=%r, py_modules=[%r])\n" + % ( + dists[0].project_name, dists[0].version, + os.path.splitext(basename)[0] + ) + ) + return filename + + elif match: + raise DistutilsError( + "Can't unambiguously interpret project/version identifier %r; " + "any dashes in the name or version should be escaped using " + "underscores. %r" % (fragment, dists) + ) + else: + raise DistutilsError( + "Can't process plain .py files without an '#egg=name-version'" + " suffix to enable automatic setup script generation." + ) + + dl_blocksize = 8192 + + def _download_to(self, url, filename): + self.info("Downloading %s", url) + # Download the file + fp = None + try: + checker = HashChecker.from_url(url) + fp = self.open_url(url) + if isinstance(fp, urllib.error.HTTPError): + raise DistutilsError( + "Can't download %s: %s %s" % (url, fp.code, fp.msg) + ) + headers = fp.info() + blocknum = 0 + bs = self.dl_blocksize + size = -1 + if "content-length" in headers: + # Some servers return multiple Content-Length headers :( + sizes = get_all_headers(headers, 'Content-Length') + size = max(map(int, sizes)) + self.reporthook(url, filename, blocknum, bs, size) + with open(filename, 'wb') as tfp: + while True: + block = fp.read(bs) + if block: + checker.feed(block) + tfp.write(block) + blocknum += 1 + self.reporthook(url, filename, blocknum, bs, size) + else: + break + self.check_hash(checker, filename, tfp) + return headers + finally: + if fp: + fp.close() + + def reporthook(self, url, filename, blocknum, blksize, size): + pass # no-op + + def open_url(self, url, warning=None): + if url.startswith('file:'): + return local_open(url) + try: + return open_with_auth(url, self.opener) + except (ValueError, http_client.InvalidURL) as v: + msg = ' '.join([str(arg) for arg in v.args]) + if warning: + self.warn(warning, msg) + else: + raise DistutilsError('%s %s' % (url, msg)) + except urllib.error.HTTPError as v: + return v + except urllib.error.URLError as v: + if warning: + self.warn(warning, v.reason) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v.reason)) + except http_client.BadStatusLine as v: + if warning: + self.warn(warning, v.line) + else: + raise DistutilsError( + '%s returned a bad status line. The server might be ' + 'down, %s' % + (url, v.line) + ) + except (http_client.HTTPException, socket.error) as v: + if warning: + self.warn(warning, v) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v)) + + def _download_url(self, scheme, url, tmpdir): + # Determine download filename + # + name, fragment = egg_info_for_url(url) + if name: + while '..' in name: + name = name.replace('..', '.').replace('\\', '_') + else: + name = "__downloaded__" # default if URL has no path contents + + if name.endswith('.egg.zip'): + name = name[:-4] # strip the extra .zip before download + + filename = os.path.join(tmpdir, name) + + # Download the file + # + if scheme == 'svn' or scheme.startswith('svn+'): + return self._download_svn(url, filename) + elif scheme == 'git' or scheme.startswith('git+'): + return self._download_git(url, filename) + elif scheme.startswith('hg+'): + return self._download_hg(url, filename) + elif scheme == 'file': + return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) + else: + self.url_ok(url, True) # raises error if not allowed + return self._attempt_download(url, filename) + + def scan_url(self, url): + self.process_url(url, True) + + def _attempt_download(self, url, filename): + headers = self._download_to(url, filename) + if 'html' in headers.get('content-type', '').lower(): + return self._download_html(url, headers, filename) + else: + return filename + + def _download_html(self, url, headers, filename): + file = open(filename) + for line in file: + if line.strip(): + # Check for a subversion index page + if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): + # it's a subversion index page: + file.close() + os.unlink(filename) + return self._download_svn(url, filename) + break # not an index page + file.close() + os.unlink(filename) + raise DistutilsError("Unexpected HTML page found at " + url) + + def _download_svn(self, url, filename): + warnings.warn("SVN download support is deprecated", UserWarning) + url = url.split('#', 1)[0] # remove any fragment for svn's sake + creds = '' + if url.lower().startswith('svn:') and '@' in url: + scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) + if not netloc and path.startswith('//') and '/' in path[2:]: + netloc, path = path[2:].split('/', 1) + auth, host = _splituser(netloc) + if auth: + if ':' in auth: + user, pw = auth.split(':', 1) + creds = " --username=%s --password=%s" % (user, pw) + else: + creds = " --username=" + auth + netloc = host + parts = scheme, netloc, url, p, q, f + url = urllib.parse.urlunparse(parts) + self.info("Doing subversion checkout from %s to %s", url, filename) + os.system("svn checkout%s -q %s %s" % (creds, url, filename)) + return filename + + @staticmethod + def _vcs_split_rev_from_url(url, pop_prefix=False): + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + + scheme = scheme.split('+', 1)[-1] + + # Some fragment identification fails + path = path.split('#', 1)[0] + + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + + # Also, discard fragment + url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) + + return url, rev + + def _download_git(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing git clone from %s to %s", url, filename) + os.system("git clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Checking out %s", rev) + os.system("git -C %s checkout --quiet %s" % ( + filename, + rev, + )) + + return filename + + def _download_hg(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing hg clone from %s to %s", url, filename) + os.system("hg clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Updating to %s", rev) + os.system("hg --cwd %s up -C -r %s -q" % ( + filename, + rev, + )) + + return filename + + def debug(self, msg, *args): + log.debug(msg, *args) + + def info(self, msg, *args): + log.info(msg, *args) + + def warn(self, msg, *args): + log.warn(msg, *args) + + +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + + +def decode_entity(match): + what = match.group(0) + return unescape(what) + + +def htmldecode(text): + """ + Decode HTML entities in the given text. + + >>> htmldecode( + ... 'https://../package_name-0.1.2.tar.gz' + ... '?tokena=A&tokenb=B">package_name-0.1.2.tar.gz') + 'https://../package_name-0.1.2.tar.gz?tokena=A&tokenb=B">package_name-0.1.2.tar.gz' + """ + return entity_sub(decode_entity, text) + + +def socket_timeout(timeout=15): + def _socket_timeout(func): + def _socket_timeout(*args, **kwargs): + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(timeout) + try: + return func(*args, **kwargs) + finally: + socket.setdefaulttimeout(old_timeout) + + return _socket_timeout + + return _socket_timeout + + +def _encode_auth(auth): + """ + A function compatible with Python 2.3-3.3 that will encode + auth from a URL suitable for an HTTP header. + >>> str(_encode_auth('username%3Apassword')) + 'dXNlcm5hbWU6cGFzc3dvcmQ=' + + Long auth strings should not cause a newline to be inserted. + >>> long_auth = 'username:' + 'password'*10 + >>> chr(10) in str(_encode_auth(long_auth)) + False + """ + auth_s = urllib.parse.unquote(auth) + # convert to bytes + auth_bytes = auth_s.encode() + encoded_bytes = base64.b64encode(auth_bytes) + # convert back to a string + encoded = encoded_bytes.decode() + # strip the trailing carriage return + return encoded.replace('\n', '') + + +class Credential: + """ + A username/password pair. Use like a namedtuple. + """ + + def __init__(self, username, password): + self.username = username + self.password = password + + def __iter__(self): + yield self.username + yield self.password + + def __str__(self): + return '%(username)s:%(password)s' % vars(self) + + +class PyPIConfig(configparser.RawConfigParser): + def __init__(self): + """ + Load from ~/.pypirc + """ + defaults = dict.fromkeys(['username', 'password', 'repository'], '') + configparser.RawConfigParser.__init__(self, defaults) + + rc = os.path.join(os.path.expanduser('~'), '.pypirc') + if os.path.exists(rc): + self.read(rc) + + @property + def creds_by_repository(self): + sections_with_repositories = [ + section for section in self.sections() + if self.get(section, 'repository').strip() + ] + + return dict(map(self._get_repo_cred, sections_with_repositories)) + + def _get_repo_cred(self, section): + repo = self.get(section, 'repository').strip() + return repo, Credential( + self.get(section, 'username').strip(), + self.get(section, 'password').strip(), + ) + + def find_credential(self, url): + """ + If the URL indicated appears to be a repository defined in this + config, return the credential for that repository. + """ + for repository, cred in self.creds_by_repository.items(): + if url.startswith(repository): + return cred + + +def open_with_auth(url, opener=urllib.request.urlopen): + """Open a urllib2 request, handling HTTP authentication""" + + parsed = urllib.parse.urlparse(url) + scheme, netloc, path, params, query, frag = parsed + + # Double scheme does not raise on Mac OS X as revealed by a + # failing test. We would expect "nonnumeric port". Refs #20. + if netloc.endswith(':'): + raise http_client.InvalidURL("nonnumeric port: ''") + + if scheme in ('http', 'https'): + auth, address = _splituser(netloc) + else: + auth = None + + if not auth: + cred = PyPIConfig().find_credential(url) + if cred: + auth = str(cred) + info = cred.username, url + log.info('Authenticating as %s for %s (from .pypirc)', *info) + + if auth: + auth = "Basic " + _encode_auth(auth) + parts = scheme, address, path, params, query, frag + new_url = urllib.parse.urlunparse(parts) + request = urllib.request.Request(new_url) + request.add_header("Authorization", auth) + else: + request = urllib.request.Request(url) + + request.add_header('User-Agent', user_agent) + fp = opener(request) + + if auth: + # Put authentication info back into request URL if same host, + # so that links found on the page will work + s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) + if s2 == scheme and h2 == address: + parts = s2, netloc, path2, param2, query2, frag2 + fp.url = urllib.parse.urlunparse(parts) + + return fp + + +# copy of urllib.parse._splituser from Python 3.8 +def _splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + user, delim, host = host.rpartition('@') + return (user if delim else None), host + + +# adding a timeout to avoid freezing package_index +open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) + + +def fix_sf_url(url): + return url # backward compatibility + + +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urllib.parse.urlparse(url) + filename = urllib.request.url2pathname(path) + if os.path.isfile(filename): + return urllib.request.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + filepath = os.path.join(filename, f) + if f == 'index.html': + with open(filepath, 'r') as fp: + body = fp.read() + break + elif os.path.isdir(filepath): + f += '/' + files.append('<a href="{name}">{name}</a>'.format(name=f)) + else: + tmpl = ( + "<html><head><title>{url}" + "{files}") + body = tmpl.format(url=url, files='\n'.join(files)) + status, message = 200, "OK" + else: + status, message, body = 404, "Path not found", "Not found" + + headers = {'content-type': 'text/html'} + body_stream = six.StringIO(body) + return urllib.error.HTTPError(url, status, message, headers, body_stream) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/pep425tags.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/pep425tags.py new file mode 100644 index 0000000..48745a2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/pep425tags.py @@ -0,0 +1,319 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +from distutils import log +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +from .extern import six + +from . import glibc + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + log.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + six.PY2)) \ + and six.PY2: + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of a macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/py27compat.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/py27compat.py new file mode 100644 index 0000000..2985011 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/py27compat.py @@ -0,0 +1,28 @@ +""" +Compatibility Support for Python 2.7 and earlier +""" + +import platform + +from setuptools.extern import six + + +def get_all_headers(message, key): + """ + Given an HTTPMessage, return all headers matching a given key. + """ + return message.get_all(key) + + +if six.PY2: + def get_all_headers(message, key): + return message.getheaders(key) + + +linux_py2_ascii = ( + platform.system() == 'Linux' and + six.PY2 +) + +rmtree_safe = str if linux_py2_ascii else lambda x: x +"""Workaround for http://bugs.python.org/issue24672""" diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/py31compat.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/py31compat.py new file mode 100644 index 0000000..e1da7ee --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/py31compat.py @@ -0,0 +1,32 @@ +__all__ = [] + +__metaclass__ = type + + +try: + # Python >=3.2 + from tempfile import TemporaryDirectory +except ImportError: + import shutil + import tempfile + + class TemporaryDirectory: + """ + Very simple temporary directory context manager. + Will try to delete afterward, but will also ignore OS and similar + errors on deletion. + """ + + def __init__(self, **kwargs): + self.name = None # Handle mkdtemp raising an exception + self.name = tempfile.mkdtemp(**kwargs) + + def __enter__(self): + return self.name + + def __exit__(self, exctype, excvalue, exctrace): + try: + shutil.rmtree(self.name, True) + except OSError: # removal errors are not the only possible + pass + self.name = None diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/py33compat.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/py33compat.py new file mode 100644 index 0000000..87cf539 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/py33compat.py @@ -0,0 +1,55 @@ +import dis +import array +import collections + +try: + import html +except ImportError: + html = None + +from setuptools.extern import six +from setuptools.extern.six.moves import html_parser + +__metaclass__ = type + +OpArg = collections.namedtuple('OpArg', 'opcode arg') + + +class Bytecode_compat: + def __init__(self, code): + self.code = code + + def __iter__(self): + """Yield '(op,arg)' pair for each operation in code object 'code'""" + + bytes = array.array('b', self.code.co_code) + eof = len(self.code.co_code) + + ptr = 0 + extended_arg = 0 + + while ptr < eof: + + op = bytes[ptr] + + if op >= dis.HAVE_ARGUMENT: + + arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg + ptr += 3 + + if op == dis.EXTENDED_ARG: + long_type = six.integer_types[-1] + extended_arg = arg * long_type(65536) + continue + + else: + arg = None + ptr += 1 + + yield OpArg(op, arg) + + +Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) + + +unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/sandbox.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/sandbox.py new file mode 100644 index 0000000..685f3f7 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/sandbox.py @@ -0,0 +1,491 @@ +import os +import sys +import tempfile +import operator +import functools +import itertools +import re +import contextlib +import pickle +import textwrap + +from setuptools.extern import six +from setuptools.extern.six.moves import builtins, map + +import pkg_resources.py31compat + +if sys.platform.startswith('java'): + import org.python.modules.posix.PosixModule as _os +else: + _os = sys.modules[os.name] +try: + _file = file +except NameError: + _file = None +_open = open +from distutils.errors import DistutilsError +from pkg_resources import working_set + + +__all__ = [ + "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", +] + + +def _execfile(filename, globals, locals=None): + """ + Python 3 implementation of execfile. + """ + mode = 'rb' + with open(filename, mode) as stream: + script = stream.read() + if locals is None: + locals = globals + code = compile(script, filename, 'exec') + exec(code, globals, locals) + + +@contextlib.contextmanager +def save_argv(repl=None): + saved = sys.argv[:] + if repl is not None: + sys.argv[:] = repl + try: + yield saved + finally: + sys.argv[:] = saved + + +@contextlib.contextmanager +def save_path(): + saved = sys.path[:] + try: + yield saved + finally: + sys.path[:] = saved + + +@contextlib.contextmanager +def override_temp(replacement): + """ + Monkey-patch tempfile.tempdir with replacement, ensuring it exists + """ + pkg_resources.py31compat.makedirs(replacement, exist_ok=True) + + saved = tempfile.tempdir + + tempfile.tempdir = replacement + + try: + yield + finally: + tempfile.tempdir = saved + + +@contextlib.contextmanager +def pushd(target): + saved = os.getcwd() + os.chdir(target) + try: + yield saved + finally: + os.chdir(saved) + + +class UnpickleableException(Exception): + """ + An exception representing another Exception that could not be pickled. + """ + + @staticmethod + def dump(type, exc): + """ + Always return a dumped (pickled) type and exc. If exc can't be pickled, + wrap it in UnpickleableException first. + """ + try: + return pickle.dumps(type), pickle.dumps(exc) + except Exception: + # get UnpickleableException inside the sandbox + from setuptools.sandbox import UnpickleableException as cls + return cls.dump(cls, cls(repr(exc))) + + +class ExceptionSaver: + """ + A Context Manager that will save an exception, serialized, and restore it + later. + """ + + def __enter__(self): + return self + + def __exit__(self, type, exc, tb): + if not exc: + return + + # dump the exception + self._saved = UnpickleableException.dump(type, exc) + self._tb = tb + + # suppress the exception + return True + + def resume(self): + "restore and re-raise any exception" + + if '_saved' not in vars(self): + return + + type, exc = map(pickle.loads, self._saved) + six.reraise(type, exc, self._tb) + + +@contextlib.contextmanager +def save_modules(): + """ + Context in which imported modules are saved. + + Translates exceptions internal to the context into the equivalent exception + outside the context. + """ + saved = sys.modules.copy() + with ExceptionSaver() as saved_exc: + yield saved + + sys.modules.update(saved) + # remove any modules imported since + del_modules = ( + mod_name for mod_name in sys.modules + if mod_name not in saved + # exclude any encodings modules. See #285 + and not mod_name.startswith('encodings.') + ) + _clear_modules(del_modules) + + saved_exc.resume() + + +def _clear_modules(module_names): + for mod_name in list(module_names): + del sys.modules[mod_name] + + +@contextlib.contextmanager +def save_pkg_resources_state(): + saved = pkg_resources.__getstate__() + try: + yield saved + finally: + pkg_resources.__setstate__(saved) + + +@contextlib.contextmanager +def setup_context(setup_dir): + temp_dir = os.path.join(setup_dir, 'temp') + with save_pkg_resources_state(): + with save_modules(): + hide_setuptools() + with save_path(): + with save_argv(): + with override_temp(temp_dir): + with pushd(setup_dir): + # ensure setuptools commands are available + __import__('setuptools') + yield + + +def _needs_hiding(mod_name): + """ + >>> _needs_hiding('setuptools') + True + >>> _needs_hiding('pkg_resources') + True + >>> _needs_hiding('setuptools_plugin') + False + >>> _needs_hiding('setuptools.__init__') + True + >>> _needs_hiding('distutils') + True + >>> _needs_hiding('os') + False + >>> _needs_hiding('Cython') + True + """ + pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') + return bool(pattern.match(mod_name)) + + +def hide_setuptools(): + """ + Remove references to setuptools' modules from sys.modules to allow the + invocation to import the most appropriate setuptools. This technique is + necessary to avoid issues such as #315 where setuptools upgrading itself + would fail to find a function declared in the metadata. + """ + modules = filter(_needs_hiding, sys.modules) + _clear_modules(modules) + + +def run_setup(setup_script, args): + """Run a distutils setup script, sandboxed in its directory""" + setup_dir = os.path.abspath(os.path.dirname(setup_script)) + with setup_context(setup_dir): + try: + sys.argv[:] = [setup_script] + list(args) + sys.path.insert(0, setup_dir) + # reset to include setup dir, w/clean callback list + working_set.__init__() + working_set.callbacks.append(lambda dist: dist.activate()) + + # __file__ should be a byte string on Python 2 (#712) + dunder_file = ( + setup_script + if isinstance(setup_script, str) else + setup_script.encode(sys.getfilesystemencoding()) + ) + + with DirectorySandbox(setup_dir): + ns = dict(__file__=dunder_file, __name__='__main__') + _execfile(setup_script, ns) + except SystemExit as v: + if v.args and v.args[0]: + raise + # Normal exit, just return + + +class AbstractSandbox: + """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" + + _active = False + + def __init__(self): + self._attrs = [ + name for name in dir(_os) + if not name.startswith('_') and hasattr(self, name) + ] + + def _copy(self, source): + for name in self._attrs: + setattr(os, name, getattr(source, name)) + + def __enter__(self): + self._copy(self) + if _file: + builtins.file = self._file + builtins.open = self._open + self._active = True + + def __exit__(self, exc_type, exc_value, traceback): + self._active = False + if _file: + builtins.file = _file + builtins.open = _open + self._copy(_os) + + def run(self, func): + """Run 'func' under os sandboxing""" + with self: + return func() + + def _mk_dual_path_wrapper(name): + original = getattr(_os, name) + + def wrap(self, src, dst, *args, **kw): + if self._active: + src, dst = self._remap_pair(name, src, dst, *args, **kw) + return original(src, dst, *args, **kw) + + return wrap + + for name in ["rename", "link", "symlink"]: + if hasattr(_os, name): + locals()[name] = _mk_dual_path_wrapper(name) + + def _mk_single_path_wrapper(name, original=None): + original = original or getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return original(path, *args, **kw) + + return wrap + + if _file: + _file = _mk_single_path_wrapper('file', _file) + _open = _mk_single_path_wrapper('open', _open) + for name in [ + "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", + "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", + "startfile", "mkfifo", "mknod", "pathconf", "access" + ]: + if hasattr(_os, name): + locals()[name] = _mk_single_path_wrapper(name) + + def _mk_single_with_return(name): + original = getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return self._remap_output(name, original(path, *args, **kw)) + return original(path, *args, **kw) + + return wrap + + for name in ['readlink', 'tempnam']: + if hasattr(_os, name): + locals()[name] = _mk_single_with_return(name) + + def _mk_query(name): + original = getattr(_os, name) + + def wrap(self, *args, **kw): + retval = original(*args, **kw) + if self._active: + return self._remap_output(name, retval) + return retval + + return wrap + + for name in ['getcwd', 'tmpnam']: + if hasattr(_os, name): + locals()[name] = _mk_query(name) + + def _validate_path(self, path): + """Called to remap or validate any path, whether input or output""" + return path + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + return self._validate_path(path) + + def _remap_output(self, operation, path): + """Called for path outputs""" + return self._validate_path(path) + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + return ( + self._remap_input(operation + '-from', src, *args, **kw), + self._remap_input(operation + '-to', dst, *args, **kw) + ) + + +if hasattr(os, 'devnull'): + _EXCEPTIONS = [os.devnull,] +else: + _EXCEPTIONS = [] + + +class DirectorySandbox(AbstractSandbox): + """Restrict operations to a single subdirectory - pseudo-chroot""" + + write_ops = dict.fromkeys([ + "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", + "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", + ]) + + _exception_patterns = [ + # Allow lib2to3 to attempt to save a pickled grammar object (#121) + r'.*lib2to3.*\.pickle$', + ] + "exempt writing to paths that match the pattern" + + def __init__(self, sandbox, exceptions=_EXCEPTIONS): + self._sandbox = os.path.normcase(os.path.realpath(sandbox)) + self._prefix = os.path.join(self._sandbox, '') + self._exceptions = [ + os.path.normcase(os.path.realpath(path)) + for path in exceptions + ] + AbstractSandbox.__init__(self) + + def _violation(self, operation, *args, **kw): + from setuptools.sandbox import SandboxViolation + raise SandboxViolation(operation, args, kw) + + if _file: + + def _file(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("file", path, mode, *args, **kw) + return _file(path, mode, *args, **kw) + + def _open(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("open", path, mode, *args, **kw) + return _open(path, mode, *args, **kw) + + def tmpnam(self): + self._violation("tmpnam") + + def _ok(self, path): + active = self._active + try: + self._active = False + realpath = os.path.normcase(os.path.realpath(path)) + return ( + self._exempted(realpath) + or realpath == self._sandbox + or realpath.startswith(self._prefix) + ) + finally: + self._active = active + + def _exempted(self, filepath): + start_matches = ( + filepath.startswith(exception) + for exception in self._exceptions + ) + pattern_matches = ( + re.match(pattern, filepath) + for pattern in self._exception_patterns + ) + candidates = itertools.chain(start_matches, pattern_matches) + return any(candidates) + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + if operation in self.write_ops and not self._ok(path): + self._violation(operation, os.path.realpath(path), *args, **kw) + return path + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + if not self._ok(src) or not self._ok(dst): + self._violation(operation, src, dst, *args, **kw) + return (src, dst) + + def open(self, file, flags, mode=0o777, *args, **kw): + """Called for low-level os.open()""" + if flags & WRITE_FLAGS and not self._ok(file): + self._violation("os.open", file, flags, mode, *args, **kw) + return _os.open(file, flags, mode, *args, **kw) + + +WRITE_FLAGS = functools.reduce( + operator.or_, [getattr(_os, a, 0) for a in + "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] +) + + +class SandboxViolation(DistutilsError): + """A setup script attempted to modify the filesystem outside the sandbox""" + + tmpl = textwrap.dedent(""" + SandboxViolation: {cmd}{args!r} {kwargs} + + The package setup script has attempted to modify files on your system + that are not within the EasyInstall build area, and has been aborted. + + This package cannot be safely installed by EasyInstall, and may not + support alternate installation locations even if you run its setup + script by hand. Please inform the package's author and the EasyInstall + maintainers to find out if a fix or workaround is available. + """).lstrip() + + def __str__(self): + cmd, args, kwargs = self.args + return self.tmpl.format(**locals()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl b/backend/venv/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl new file mode 100644 index 0000000..39a24b0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/script (dev).tmpl @@ -0,0 +1,6 @@ +# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').require(%(spec)r) +__file__ = %(dev_path)r +with open(__file__) as f: + exec(compile(f.read(), __file__, 'exec')) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/script.tmpl b/backend/venv/venv/lib/python3.7/site-packages/setuptools/script.tmpl new file mode 100644 index 0000000..ff5efbc --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/script.tmpl @@ -0,0 +1,3 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/site-patch.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/site-patch.py new file mode 100644 index 0000000..40b00de --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/site-patch.py @@ -0,0 +1,74 @@ +def __boot(): + import sys + import os + PYTHONPATH = os.environ.get('PYTHONPATH') + if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): + PYTHONPATH = [] + else: + PYTHONPATH = PYTHONPATH.split(os.pathsep) + + pic = getattr(sys, 'path_importer_cache', {}) + stdpath = sys.path[len(PYTHONPATH):] + mydir = os.path.dirname(__file__) + + for item in stdpath: + if item == mydir or not item: + continue # skip if current dir. on Windows, or my own directory + importer = pic.get(item) + if importer is not None: + loader = importer.find_module('site') + if loader is not None: + # This should actually reload the current module + loader.load_module('site') + break + else: + try: + import imp # Avoid import loop in Python 3 + stream, path, descr = imp.find_module('site', [item]) + except ImportError: + continue + if stream is None: + continue + try: + # This should actually reload the current module + imp.load_module('site', stream, path, descr) + finally: + stream.close() + break + else: + raise ImportError("Couldn't find the real 'site' module") + + known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp + + oldpos = getattr(sys, '__egginsert', 0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + + for item in PYTHONPATH: + addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position + + d, nd = makepath(stdpath[0]) + insert_at = None + new_path = [] + + for item in sys.path: + p, np = makepath(item) + + if np == nd and insert_at is None: + # We've hit the first 'system' path entry, so added entries go here + insert_at = len(new_path) + + if np in known_paths or insert_at is None: + new_path.append(item) + else: + # new path after the insert point, back-insert it + new_path.insert(insert_at, item) + insert_at += 1 + + sys.path[:] = new_path + + +if __name__ == 'site': + __boot() + del __boot diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/ssl_support.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/ssl_support.py new file mode 100644 index 0000000..226db69 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/ssl_support.py @@ -0,0 +1,260 @@ +import os +import socket +import atexit +import re +import functools + +from setuptools.extern.six.moves import urllib, http_client, map, filter + +from pkg_resources import ResolutionError, ExtractionError + +try: + import ssl +except ImportError: + ssl = None + +__all__ = [ + 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', + 'opener_for' +] + +cert_paths = """ +/etc/pki/tls/certs/ca-bundle.crt +/etc/ssl/certs/ca-certificates.crt +/usr/share/ssl/certs/ca-bundle.crt +/usr/local/share/certs/ca-root.crt +/etc/ssl/cert.pem +/System/Library/OpenSSL/certs/cert.pem +/usr/local/share/certs/ca-root-nss.crt +/etc/ssl/ca-bundle.pem +""".strip().split() + +try: + HTTPSHandler = urllib.request.HTTPSHandler + HTTPSConnection = http_client.HTTPSConnection +except AttributeError: + HTTPSHandler = HTTPSConnection = object + +is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) + + +try: + from ssl import CertificateError, match_hostname +except ImportError: + try: + from backports.ssl_match_hostname import CertificateError + from backports.ssl_match_hostname import match_hostname + except ImportError: + CertificateError = None + match_hostname = None + +if not CertificateError: + + class CertificateError(ValueError): + pass + + +if not match_hostname: + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + https://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +class VerifyingHTTPSHandler(HTTPSHandler): + """Simple verifying handler: no auth, subclasses, timeouts, etc.""" + + def __init__(self, ca_bundle): + self.ca_bundle = ca_bundle + HTTPSHandler.__init__(self) + + def https_open(self, req): + return self.do_open( + lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req + ) + + +class VerifyingHTTPSConn(HTTPSConnection): + """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + + def __init__(self, host, ca_bundle, **kw): + HTTPSConnection.__init__(self, host, **kw) + self.ca_bundle = ca_bundle + + def connect(self): + sock = socket.create_connection( + (self.host, self.port), getattr(self, 'source_address', None) + ) + + # Handle the socket if a (proxy) tunnel is present + if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): + self.sock = sock + self._tunnel() + # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 + # change self.host to mean the proxy server host when tunneling is + # being used. Adapt, since we are interested in the destination + # host for the match_hostname() comparison. + actual_host = self._tunnel_host + else: + actual_host = self.host + + if hasattr(ssl, 'create_default_context'): + ctx = ssl.create_default_context(cafile=self.ca_bundle) + self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) + else: + # This is for python < 2.7.9 and < 3.4? + self.sock = ssl.wrap_socket( + sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle + ) + try: + match_hostname(self.sock.getpeercert(), actual_host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + +def opener_for(ca_bundle=None): + """Get a urlopen() replacement that uses ca_bundle for verification""" + return urllib.request.build_opener( + VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) + ).open + + +# from jaraco.functools +def once(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(func, 'always_returns'): + func.always_returns = func(*args, **kwargs) + return func.always_returns + return wrapper + + +@once +def get_win_certfile(): + try: + import wincertstore + except ImportError: + return None + + class CertFile(wincertstore.CertFile): + def __init__(self): + super(CertFile, self).__init__() + atexit.register(self.close) + + def close(self): + try: + super(CertFile, self).close() + except OSError: + pass + + _wincerts = CertFile() + _wincerts.addstore('CA') + _wincerts.addstore('ROOT') + return _wincerts.name + + +def find_ca_bundle(): + """Return an existing CA bundle path, or None""" + extant_cert_paths = filter(os.path.isfile, cert_paths) + return ( + get_win_certfile() + or next(extant_cert_paths, None) + or _certifi_where() + ) + + +def _certifi_where(): + try: + return __import__('certifi').where() + except (ImportError, ResolutionError, ExtractionError): + pass diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py new file mode 100644 index 0000000..7c63efd --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/unicode_utils.py @@ -0,0 +1,44 @@ +import unicodedata +import sys + +from setuptools.extern import six + + +# HFS Plus uses decomposed UTF-8 +def decompose(path): + if isinstance(path, six.text_type): + return unicodedata.normalize('NFD', path) + try: + path = path.decode('utf-8') + path = unicodedata.normalize('NFD', path) + path = path.encode('utf-8') + except UnicodeError: + pass # Not UTF-8 + return path + + +def filesys_decode(path): + """ + Ensure that the given path is decoded, + NONE when no expected encoding works + """ + + if isinstance(path, six.text_type): + return path + + fs_enc = sys.getfilesystemencoding() or 'utf-8' + candidates = fs_enc, 'utf-8' + + for enc in candidates: + try: + return path.decode(enc) + except UnicodeDecodeError: + continue + + +def try_encode(string, enc): + "turn unicode encoding into a functional routine" + try: + return string.encode(enc) + except UnicodeEncodeError: + return None diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/version.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/version.py new file mode 100644 index 0000000..95e1869 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/version.py @@ -0,0 +1,6 @@ +import pkg_resources + +try: + __version__ = pkg_resources.get_distribution('setuptools').version +except Exception: + __version__ = 'unknown' diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/wheel.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/wheel.py new file mode 100644 index 0000000..e11f0a1 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/wheel.py @@ -0,0 +1,211 @@ +"""Wheels support.""" + +from distutils.util import get_platform +import email +import itertools +import os +import posixpath +import re +import zipfile + +import pkg_resources +import setuptools +from pkg_resources import parse_version +from setuptools.extern.packaging.utils import canonicalize_name +from setuptools.extern.six import PY3 +from setuptools import pep425tags +from setuptools.command.egg_info import write_requirements + + +__metaclass__ = type + + +WHEEL_NAME = re.compile( + r"""^(?P.+?)-(?P\d.*?) + ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) + )\.whl$""", + re.VERBOSE).match + +NAMESPACE_PACKAGE_INIT = '''\ +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + __path__ = __import__('pkgutil').extend_path(__path__, __name__) +''' + + +def unpack(src_dir, dst_dir): + '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' + for dirpath, dirnames, filenames in os.walk(src_dir): + subdir = os.path.relpath(dirpath, src_dir) + for f in filenames: + src = os.path.join(dirpath, f) + dst = os.path.join(dst_dir, subdir, f) + os.renames(src, dst) + for n, d in reversed(list(enumerate(dirnames))): + src = os.path.join(dirpath, d) + dst = os.path.join(dst_dir, subdir, d) + if not os.path.exists(dst): + # Directory does not exist in destination, + # rename it and prune it from os.walk list. + os.renames(src, dst) + del dirnames[n] + # Cleanup. + for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True): + assert not filenames + os.rmdir(dirpath) + + +class Wheel: + + def __init__(self, filename): + match = WHEEL_NAME(os.path.basename(filename)) + if match is None: + raise ValueError('invalid wheel name: %r' % filename) + self.filename = filename + for k, v in match.groupdict().items(): + setattr(self, k, v) + + def tags(self): + '''List tags (py_version, abi, platform) supported by this wheel.''' + return itertools.product( + self.py_version.split('.'), + self.abi.split('.'), + self.platform.split('.'), + ) + + def is_compatible(self): + '''Is the wheel is compatible with the current platform?''' + supported_tags = pep425tags.get_supported() + return next((True for t in self.tags() if t in supported_tags), False) + + def egg_name(self): + return pkg_resources.Distribution( + project_name=self.project_name, version=self.version, + platform=(None if self.platform == 'any' else get_platform()), + ).egg_name() + '.egg' + + def get_dist_info(self, zf): + # find the correct name of the .dist-info dir in the wheel file + for member in zf.namelist(): + dirname = posixpath.dirname(member) + if (dirname.endswith('.dist-info') and + canonicalize_name(dirname).startswith( + canonicalize_name(self.project_name))): + return dirname + raise ValueError("unsupported wheel format. .dist-info not found") + + def install_as_egg(self, destination_eggdir): + '''Install wheel as an egg directory.''' + with zipfile.ZipFile(self.filename) as zf: + self._install_as_egg(destination_eggdir, zf) + + def _install_as_egg(self, destination_eggdir, zf): + dist_basename = '%s-%s' % (self.project_name, self.version) + dist_info = self.get_dist_info(zf) + dist_data = '%s.data' % dist_basename + egg_info = os.path.join(destination_eggdir, 'EGG-INFO') + + self._convert_metadata(zf, destination_eggdir, dist_info, egg_info) + self._move_data_entries(destination_eggdir, dist_data) + self._fix_namespace_packages(egg_info, destination_eggdir) + + @staticmethod + def _convert_metadata(zf, destination_eggdir, dist_info, egg_info): + def get_metadata(name): + with zf.open(posixpath.join(dist_info, name)) as fp: + value = fp.read().decode('utf-8') if PY3 else fp.read() + return email.parser.Parser().parsestr(value) + + wheel_metadata = get_metadata('WHEEL') + # Check wheel format version is supported. + wheel_version = parse_version(wheel_metadata.get('Wheel-Version')) + wheel_v1 = ( + parse_version('1.0') <= wheel_version < parse_version('2.0dev0') + ) + if not wheel_v1: + raise ValueError( + 'unsupported wheel format version: %s' % wheel_version) + # Extract to target directory. + os.mkdir(destination_eggdir) + zf.extractall(destination_eggdir) + # Convert metadata. + dist_info = os.path.join(destination_eggdir, dist_info) + dist = pkg_resources.Distribution.from_location( + destination_eggdir, dist_info, + metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info), + ) + + # Note: Evaluate and strip markers now, + # as it's difficult to convert back from the syntax: + # foobar; "linux" in sys_platform and extra == 'test' + def raw_req(req): + req.marker = None + return str(req) + install_requires = list(sorted(map(raw_req, dist.requires()))) + extras_require = { + extra: sorted( + req + for req in map(raw_req, dist.requires((extra,))) + if req not in install_requires + ) + for extra in dist.extras + } + os.rename(dist_info, egg_info) + os.rename( + os.path.join(egg_info, 'METADATA'), + os.path.join(egg_info, 'PKG-INFO'), + ) + setup_dist = setuptools.Distribution( + attrs=dict( + install_requires=install_requires, + extras_require=extras_require, + ), + ) + write_requirements( + setup_dist.get_command_obj('egg_info'), + None, + os.path.join(egg_info, 'requires.txt'), + ) + + @staticmethod + def _move_data_entries(destination_eggdir, dist_data): + """Move data entries to their correct location.""" + dist_data = os.path.join(destination_eggdir, dist_data) + dist_data_scripts = os.path.join(dist_data, 'scripts') + if os.path.exists(dist_data_scripts): + egg_info_scripts = os.path.join( + destination_eggdir, 'EGG-INFO', 'scripts') + os.mkdir(egg_info_scripts) + for entry in os.listdir(dist_data_scripts): + # Remove bytecode, as it's not properly handled + # during easy_install scripts install phase. + if entry.endswith('.pyc'): + os.unlink(os.path.join(dist_data_scripts, entry)) + else: + os.rename( + os.path.join(dist_data_scripts, entry), + os.path.join(egg_info_scripts, entry), + ) + os.rmdir(dist_data_scripts) + for subdir in filter(os.path.exists, ( + os.path.join(dist_data, d) + for d in ('data', 'headers', 'purelib', 'platlib') + )): + unpack(subdir, destination_eggdir) + if os.path.exists(dist_data): + os.rmdir(dist_data) + + @staticmethod + def _fix_namespace_packages(egg_info, destination_eggdir): + namespace_packages = os.path.join( + egg_info, 'namespace_packages.txt') + if os.path.exists(namespace_packages): + with open(namespace_packages) as fp: + namespace_packages = fp.read().split() + for mod in namespace_packages: + mod_dir = os.path.join(destination_eggdir, *mod.split('.')) + mod_init = os.path.join(mod_dir, '__init__.py') + if os.path.exists(mod_dir) and not os.path.exists(mod_init): + with open(mod_init, 'w') as fp: + fp.write(NAMESPACE_PACKAGE_INIT) diff --git a/backend/venv/venv/lib/python3.7/site-packages/setuptools/windows_support.py b/backend/venv/venv/lib/python3.7/site-packages/setuptools/windows_support.py new file mode 100644 index 0000000..cb977cf --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/setuptools/windows_support.py @@ -0,0 +1,29 @@ +import platform +import ctypes + + +def windows_only(func): + if platform.system() != 'Windows': + return lambda *args, **kwargs: None + return func + + +@windows_only +def hide_file(path): + """ + Set the hidden attribute on a file or directory. + + From http://stackoverflow.com/questions/19622133/ + + `path` must be text. + """ + __import__('ctypes.wintypes') + SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW + SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD + SetFileAttributes.restype = ctypes.wintypes.BOOL + + FILE_ATTRIBUTE_HIDDEN = 0x02 + + ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) + if not ret: + raise ctypes.WinError() diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt new file mode 100644 index 0000000..c3441e6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/LICENSE.txt @@ -0,0 +1,22 @@ +"wheel" copyright (c) 2012-2014 Daniel Holth and +contributors. + +The MIT License + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA new file mode 100644 index 0000000..3685e11 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/METADATA @@ -0,0 +1,60 @@ +Metadata-Version: 2.1 +Name: wheel +Version: 0.33.4 +Summary: A built-package format for Python. +Home-page: https://github.com/pypa/wheel +Author: Daniel Holth +Author-email: dholth@fastmail.fm +Maintainer: Alex Grönholm +Maintainer-email: alex.gronholm@nextday.fi +License: MIT +Project-URL: Documentation, https://wheel.readthedocs.io/ +Project-URL: Changelog, https://wheel.readthedocs.io/en/stable/news.html +Project-URL: Issue Tracker, https://github.com/pypa/wheel/issues +Keywords: wheel,packaging +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.* +Provides-Extra: test +Requires-Dist: pytest (>=3.0.0) ; extra == 'test' +Requires-Dist: pytest-cov ; extra == 'test' + +wheel +===== + +This library is the reference implementation of the Python wheel packaging +standard, as defined in `PEP 427`_. + +It has two different roles: + +#. A setuptools_ extension for building wheels that provides the + ``bdist_wheel`` setuptools command +#. A command line tool for working with wheel files + +It should be noted that wheel is **not** intended to be used as a library, and +as such there is no stable, public API. + +.. _PEP 427: https://www.python.org/dev/peps/pep-0427/ +.. _setuptools: https://pypi.org/project/setuptools/ + + +Code of Conduct +--------------- + +Everyone interacting in the wheel project's codebases, issue trackers, chat +rooms, and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD new file mode 100644 index 0000000..4b5b152 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/RECORD @@ -0,0 +1,32 @@ +../../../bin/wheel,sha256=Jf6ceOz_cqNCVsU1pB3aw8Ks1GdQ10IypORuRI6Ikqo,282 +wheel-0.33.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +wheel-0.33.4.dist-info/LICENSE.txt,sha256=zKniDGrx_Pv2lAjzd3aShsvuvN7TNhAMm0o_NfvmNeQ,1125 +wheel-0.33.4.dist-info/METADATA,sha256=wyJg2oitG9m-Uh5ia99JynhzPDzo2cJmrCSsqYpRMtc,2082 +wheel-0.33.4.dist-info/RECORD,, +wheel-0.33.4.dist-info/WHEEL,sha256=h_aVn5OB2IERUjMbi2pucmR_zzWJtk303YXvhh60NJ8,110 +wheel-0.33.4.dist-info/entry_points.txt,sha256=N8HbYFST3yrNQYeB2wXWBEPUhFsEtKNRPaCFGJPyqyc,108 +wheel-0.33.4.dist-info/top_level.txt,sha256=HxSBIbgEstMPe4eFawhA66Mq-QYHMopXVoAncfjb_1c,6 +wheel/__init__.py,sha256=gdfDa6ufU3P8afREFDBD26jo-ncuKtumgvlnZIGSmKc,96 +wheel/__main__.py,sha256=lF-YLO4hdQmoWuh4eWZd8YL1U95RSdm76sNLBXa0vjE,417 +wheel/__pycache__/__init__.cpython-37.pyc,, +wheel/__pycache__/__main__.cpython-37.pyc,, +wheel/__pycache__/bdist_wheel.cpython-37.pyc,, +wheel/__pycache__/metadata.cpython-37.pyc,, +wheel/__pycache__/pep425tags.cpython-37.pyc,, +wheel/__pycache__/pkginfo.cpython-37.pyc,, +wheel/__pycache__/util.cpython-37.pyc,, +wheel/__pycache__/wheelfile.cpython-37.pyc,, +wheel/bdist_wheel.py,sha256=U3ljAOGgc8UGMKqxOf5YEKE1W-nt99X6RemMi-poBB8,14757 +wheel/cli/__init__.py,sha256=GWSoGUpRabTf8bk3FsNTPrc5Fsr8YOv2dX55iY2W7eY,2572 +wheel/cli/__pycache__/__init__.cpython-37.pyc,, +wheel/cli/__pycache__/convert.cpython-37.pyc,, +wheel/cli/__pycache__/pack.cpython-37.pyc,, +wheel/cli/__pycache__/unpack.cpython-37.pyc,, +wheel/cli/convert.py,sha256=me0l6G4gSw-EBVhzjSr7yWYWBp9spMz7mnXlyJTiXso,9497 +wheel/cli/pack.py,sha256=vkvZc4-rRZyWiwc6sHjpqIjzwDRMEF5u3JUNU9NY_jA,2263 +wheel/cli/unpack.py,sha256=0VWzT7U_xyenTPwEVavxqvdee93GPvAFHnR3Uu91aRc,673 +wheel/metadata.py,sha256=uBv2aOz4U2sERF834C8DeNo235drcsp3ypTzT7MTWEA,4699 +wheel/pep425tags.py,sha256=Jdjbnq17kqwPRKJCMb2E1VccNgnC3H6iQL7VGaxkPao,5908 +wheel/pkginfo.py,sha256=GR76kupQzn1x9sKDaXuE6B6FsZ4OkfRtG7pndlXPvQ4,1257 +wheel/util.py,sha256=zwVIk-9qWVQLRMgkgQTMp4TRE4HY03-tCUxLrtCpsfU,924 +wheel/wheelfile.py,sha256=Mtt6mUaea-wABqtN5SW3Rn6bVvw-bdcSKaR2SjWZLG4,7222 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL new file mode 100644 index 0000000..78e6f69 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt new file mode 100644 index 0000000..b27acad --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/entry_points.txt @@ -0,0 +1,6 @@ +[console_scripts] +wheel = wheel.cli:main + +[distutils.commands] +bdist_wheel = wheel.bdist_wheel:bdist_wheel + diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt new file mode 100644 index 0000000..2309722 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel-0.33.4.dist-info/top_level.txt @@ -0,0 +1 @@ +wheel diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/__init__.py new file mode 100644 index 0000000..0f8ca70 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/__init__.py @@ -0,0 +1,2 @@ +# __variables__ with double-quoted values will be available in setup.py: +__version__ = "0.33.4" diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/__main__.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/__main__.py new file mode 100644 index 0000000..b3773a2 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/__main__.py @@ -0,0 +1,19 @@ +""" +Wheel command line tool (enable python -m wheel syntax) +""" + +import sys + + +def main(): # needed for console script + if __package__ == '': + # To be able to run 'python wheel-0.9.whl/wheel': + import os.path + path = os.path.dirname(os.path.dirname(__file__)) + sys.path[0:0] = [path] + import wheel.cli + sys.exit(wheel.cli.main()) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9399abe8d7e39ec5679801a3961b84c6082deeaa GIT binary patch literal 210 zcmZ?b<>g`kf<1{+u?ax>F^B^Lj6jA15EpX*i4=w?h7`tN22G|aHUm9lV?7f;O~zZ? z@$qG;Ma7x2KczG$)edBHF%UBV00Kif8vp;_LIMe?60*Fp+a~Kck!`x|sy!|I zkLJjK;FtKyiNC;!aSDi$=4od9?Ds}~b99s-i0|ylrw$|Z!#95;fZ{czc?!VM6miUn z#8b=z9)3YnA_5-W5Pc%>E)?V*br>T~-lOc`ZjyXl2qDv=scWWqDoZ6&+cYvg5sF<) zk+y5QXjD3?)7zeD*2=O~miz=UbX9ot;Y~!4Zz0V)01Gxi^pq2hB;KM8s>m+bqYXRU z;Vs_aIkr(nfJ45LOE3l8gDtVqZm=O$yc>3Vvk1%vR}N{|9c76-q_kzl4Vw!}-Jmh! zmf3|1dmQjmD^?2^Q#vc9X9Q+#ro-OuZAQJ;v~ku0THj9D*ylh literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/bdist_wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..919fe5f220d70dd93729236be8b1ac459ffa01f3 GIT binary patch literal 10095 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 Icm3)A0pg_os{jB1 literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/pep425tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c73f15f133993f1dd1b0673a39f81cdaf692ace4 GIT binary patch literal 4721 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 N2+FWG;!eBX{{V``jYt3h literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/wheel/__pycache__/pkginfo.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..871e8f6418e398020fa1d62ed330945eda40f831 GIT binary patch literal 1581 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 z zYj}$wwo=suc!YSM*Nz35k@64STePUtA_;Qu!!*w5V14X^>mLqOa{)Z%Plek0TKS*fTp{4xzCjrYh;715W-Esa*u^{ z3ulkoIwMzFo8H*hvQk)uJ2Am*o-S7l4=lc{^R>dm{3aNVSh@}mDjqF^>8CjQi{BRJ zxPcyi2PI~p#TZXhc>5QbPxkx^F&KQvS{;6)jmSn4 zm0bE(eo2Qd5$8u`nKctRtR6E|Yeu<<=+|SRY{Fkb;n@ND??mYqAPtnGT#_-@c&Gdx z0A1s>y_qFF-`VZRQy=RP(vC8(r~gGUM=CjFHLVhX(J%5BVo~_Bw7_0Xu$N8j1ywl| zSr;~WRRPKXYgwX)WA+R3TEwH9U@r-EjO!Cn%RzhyhFUgcqrgQDW2UKeNFB8kJ_Q|6 zWFz_{-X}qeEDz)!Y2X8`I#5i+0=-ODG-yshZKp zNJx6%1j^C(;_}3u4*7+0bSzSOhCXl&p0u|A#*>rLkXw*r)Zq$Mc9EToBM#Mibl0VD zg7#zK$^QsJ99+^la_|Nn6aYp+@75mJS>ieeFG0A#ZSH(-k4yjh3i_~hF_U%H`SITSN-1Gg;ej6ReC@lMD35KQsNZwv#IdN7BXjmBX5n(>01~Th``z9y4ex z(Do*JR3y6+Q#7@YPXgN%QkP-AqnFvT%kAaV?Uy7Z3EJ)9&b4{|3KhS_Q*yg`Uh}%m zs?H1mVICzHVed&$C}(E}mnogB(xs|}P-cqm7~~6KsH!0$+aRTUJq#ZWqV%A}3qzi@ zaSfrM1@yKN;X8mBprC{F5?0r!NH|q)l$LqIvyPM|E}(%7O}m$G*`{k&U#VX37pnN_ zR$5q-meU!?fxvPEX;%D#gkFJ{<%^m-HI$no7Ms*|8iMYcX^JosSIxY<4OQsAG>}P} z3vy6#kGgsIB170;DoHDjfGMc#(0820cADsbEvS}d8m{j=I^a72L8MQi?ZqR|r~8lh y;mZAY?><-&m#9r!0`2+V9ftCk%Ok%|pR_a&*TJ^Oe|_n}HK%FYrip7z)%zzn1A%$~ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py new file mode 100644 index 0000000..c79307b --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/bdist_wheel.py @@ -0,0 +1,372 @@ +""" +Create a wheel (.whl) distribution. + +A wheel is a built archive format. +""" + +import os +import shutil +import sys +import re +from email.generator import Generator +from distutils.core import Command +from distutils.sysconfig import get_python_version +from distutils import log as logger +from glob import iglob +from shutil import rmtree +from warnings import warn + +import pkg_resources + +from .pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag, get_platform +from .pkginfo import write_pkg_info +from .metadata import pkginfo_to_metadata +from .wheelfile import WheelFile +from . import pep425tags +from . import __version__ as wheel_version + + +safe_name = pkg_resources.safe_name +safe_version = pkg_resources.safe_version + +PY_LIMITED_API_PATTERN = r'cp3\d' + + +def safer_name(name): + return safe_name(name).replace('-', '_') + + +def safer_version(version): + return safe_version(version).replace('-', '_') + + +class bdist_wheel(Command): + + description = 'create a wheel distribution' + + user_options = [('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', + "platform name to embed in generated filenames " + "(default: %s)" % get_platform()), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ('relative', None, + "build the archive using relative paths " + "(default: false)"), + ('owner=', 'u', + "Owner name used when creating a tar file" + " [default: current user]"), + ('group=', 'g', + "Group name used when creating a tar file" + " [default: current group]"), + ('universal', None, + "make a universal wheel" + " (default: false)"), + ('python-tag=', None, + "Python implementation compatibility tag" + " (default: py%s)" % get_impl_ver()[0]), + ('build-number=', None, + "Build number for this particular version. " + "As specified in PEP-0427, this must start with a digit. " + "[default: None]"), + ('py-limited-api=', None, + "Python tag (cp32|cp33|cpNN) for abi3 wheel tag" + " (default: false)"), + ] + + boolean_options = ['keep-temp', 'skip-build', 'relative', 'universal'] + + def initialize_options(self): + self.bdist_dir = None + self.data_dir = None + self.plat_name = None + self.plat_tag = None + self.format = 'zip' + self.keep_temp = False + self.dist_dir = None + self.egginfo_dir = None + self.root_is_pure = None + self.skip_build = None + self.relative = False + self.owner = None + self.group = None + self.universal = False + self.python_tag = 'py' + get_impl_ver()[0] + self.build_number = None + self.py_limited_api = False + self.plat_name_supplied = False + + def finalize_options(self): + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'wheel') + + self.data_dir = self.wheel_dist_name + '.data' + self.plat_name_supplied = self.plat_name is not None + + need_options = ('dist_dir', 'plat_name', 'skip_build') + + self.set_undefined_options('bdist', + *zip(need_options, need_options)) + + self.root_is_pure = not (self.distribution.has_ext_modules() + or self.distribution.has_c_libraries()) + + if self.py_limited_api and not re.match(PY_LIMITED_API_PATTERN, self.py_limited_api): + raise ValueError("py-limited-api must match '%s'" % PY_LIMITED_API_PATTERN) + + # Support legacy [wheel] section for setting universal + wheel = self.distribution.get_option_dict('wheel') + if 'universal' in wheel: + # please don't define this in your global configs + logger.warn('The [wheel] section is deprecated. Use [bdist_wheel] instead.') + val = wheel['universal'][1].strip() + if val.lower() in ('1', 'true', 'yes'): + self.universal = True + + if self.build_number is not None and not self.build_number[:1].isdigit(): + raise ValueError("Build tag (build-number) must start with a digit.") + + @property + def wheel_dist_name(self): + """Return distribution full name with - replaced with _""" + components = (safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + if self.build_number: + components += (self.build_number,) + return '-'.join(components) + + def get_tag(self): + # bdist sets self.plat_name if unset, we should only use it for purepy + # wheels if the user supplied it. + if self.plat_name_supplied: + plat_name = self.plat_name + elif self.root_is_pure: + plat_name = 'any' + else: + plat_name = self.plat_name or get_platform() + if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: + plat_name = 'linux_i686' + plat_name = plat_name.replace('-', '_').replace('.', '_') + + if self.root_is_pure: + if self.universal: + impl = 'py2.py3' + else: + impl = self.python_tag + tag = (impl, 'none', plat_name) + else: + impl_name = get_abbr_impl() + impl_ver = get_impl_ver() + impl = impl_name + impl_ver + # We don't work on CPython 3.1, 3.0. + if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'): + impl = self.py_limited_api + abi_tag = 'abi3' + else: + abi_tag = str(get_abi_tag()).lower() + tag = (impl, abi_tag, plat_name) + supported_tags = pep425tags.get_supported( + supplied_platform=plat_name if self.plat_name_supplied else None) + # XXX switch to this alternate implementation for non-pure: + if not self.py_limited_api: + assert tag == supported_tags[0], "%s != %s" % (tag, supported_tags[0]) + assert tag in supported_tags, "would build wheel with unsupported tag {}".format(tag) + return tag + + def run(self): + build_scripts = self.reinitialize_command('build_scripts') + build_scripts.executable = 'python' + build_scripts.force = True + + build_ext = self.reinitialize_command('build_ext') + build_ext.inplace = False + + if not self.skip_build: + self.run_command('build') + + install = self.reinitialize_command('install', + reinit_subcommands=True) + install.root = self.bdist_dir + install.compile = False + install.skip_build = self.skip_build + install.warn_dir = False + + # A wheel without setuptools scripts is more cross-platform. + # Use the (undocumented) `no_ep` option to setuptools' + # install_scripts command to avoid creating entry point scripts. + install_scripts = self.reinitialize_command('install_scripts') + install_scripts.no_ep = True + + # Use a custom scheme for the archive, because we have to decide + # at installation time which scheme to use. + for key in ('headers', 'scripts', 'data', 'purelib', 'platlib'): + setattr(install, + 'install_' + key, + os.path.join(self.data_dir, key)) + + basedir_observed = '' + + if os.name == 'nt': + # win32 barfs if any of these are ''; could be '.'? + # (distutils.command.install:change_roots bug) + basedir_observed = os.path.normpath(os.path.join(self.data_dir, '..')) + self.install_libbase = self.install_lib = basedir_observed + + setattr(install, + 'install_purelib' if self.root_is_pure else 'install_platlib', + basedir_observed) + + logger.info("installing to %s", self.bdist_dir) + + self.run_command('install') + + impl_tag, abi_tag, plat_tag = self.get_tag() + archive_basename = "{}-{}-{}-{}".format(self.wheel_dist_name, impl_tag, abi_tag, plat_tag) + if not self.relative: + archive_root = self.bdist_dir + else: + archive_root = os.path.join( + self.bdist_dir, + self._ensure_relative(install.install_base)) + + self.set_undefined_options('install_egg_info', ('target', 'egginfo_dir')) + distinfo_dirname = '{}-{}.dist-info'.format( + safer_name(self.distribution.get_name()), + safer_version(self.distribution.get_version())) + distinfo_dir = os.path.join(self.bdist_dir, distinfo_dirname) + self.egg2dist(self.egginfo_dir, distinfo_dir) + + self.write_wheelfile(distinfo_dir) + + # Make the archive + if not os.path.exists(self.dist_dir): + os.makedirs(self.dist_dir) + + wheel_path = os.path.join(self.dist_dir, archive_basename + '.whl') + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(archive_root) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_wheel', get_python_version(), wheel_path)) + + if not self.keep_temp: + logger.info('removing %s', self.bdist_dir) + if not self.dry_run: + rmtree(self.bdist_dir) + + def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): + from email.message import Message + msg = Message() + msg['Wheel-Version'] = '1.0' # of the spec + msg['Generator'] = generator + msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() + if self.build_number is not None: + msg['Build'] = self.build_number + + # Doesn't work for bdist_wininst + impl_tag, abi_tag, plat_tag = self.get_tag() + for impl in impl_tag.split('.'): + for abi in abi_tag.split('.'): + for plat in plat_tag.split('.'): + msg['Tag'] = '-'.join((impl, abi, plat)) + + wheelfile_path = os.path.join(wheelfile_base, 'WHEEL') + logger.info('creating %s', wheelfile_path) + with open(wheelfile_path, 'w') as f: + Generator(f, maxheaderlen=0).flatten(msg) + + def _ensure_relative(self, path): + # copied from dir_util, deleted + drive, path = os.path.splitdrive(path) + if path[0:1] == os.sep: + path = drive + path[1:] + return path + + @property + def license_paths(self): + metadata = self.distribution.get_option_dict('metadata') + files = set() + patterns = sorted({ + option for option in metadata.get('license_files', ('', ''))[1].split() + }) + + if 'license_file' in metadata: + warn('The "license_file" option is deprecated. Use "license_files" instead.', + DeprecationWarning) + files.add(metadata['license_file'][1]) + + if 'license_file' not in metadata and 'license_files' not in metadata: + patterns = ('LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*') + + for pattern in patterns: + for path in iglob(pattern): + if path not in files and os.path.isfile(path): + logger.info('adding license file "%s" (matched pattern "%s")', path, pattern) + files.add(path) + + return files + + def egg2dist(self, egginfo_path, distinfo_path): + """Convert an .egg-info directory into a .dist-info directory""" + def adios(p): + """Appropriately delete directory, file or link.""" + if os.path.exists(p) and not os.path.islink(p) and os.path.isdir(p): + shutil.rmtree(p) + elif os.path.exists(p): + os.unlink(p) + + adios(distinfo_path) + + if not os.path.exists(egginfo_path): + # There is no egg-info. This is probably because the egg-info + # file/directory is not named matching the distribution name used + # to name the archive file. Check for this case and report + # accordingly. + import glob + pat = os.path.join(os.path.dirname(egginfo_path), '*.egg-info') + possible = glob.glob(pat) + err = "Egg metadata expected at %s but not found" % (egginfo_path,) + if possible: + alt = os.path.basename(possible[0]) + err += " (%s found - possible misnamed archive file?)" % (alt,) + + raise ValueError(err) + + if os.path.isfile(egginfo_path): + # .egg-info is a single file + pkginfo_path = egginfo_path + pkg_info = pkginfo_to_metadata(egginfo_path, egginfo_path) + os.mkdir(distinfo_path) + else: + # .egg-info is a directory + pkginfo_path = os.path.join(egginfo_path, 'PKG-INFO') + pkg_info = pkginfo_to_metadata(egginfo_path, pkginfo_path) + + # ignore common egg metadata that is useless to wheel + shutil.copytree(egginfo_path, distinfo_path, + ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt', + 'not-zip-safe'} + ) + + # delete dependency_links if it is only whitespace + dependency_links_path = os.path.join(distinfo_path, 'dependency_links.txt') + with open(dependency_links_path, 'r') as dependency_links_file: + dependency_links = dependency_links_file.read().strip() + if not dependency_links: + adios(dependency_links_path) + + write_pkg_info(os.path.join(distinfo_path, 'METADATA'), pkg_info) + + for license_path in self.license_paths: + filename = os.path.basename(license_path) + shutil.copy(license_path, os.path.join(distinfo_path, filename)) + + adios(egginfo_path) diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__init__.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__init__.py new file mode 100644 index 0000000..95740bf --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__init__.py @@ -0,0 +1,88 @@ +""" +Wheel command-line utility. +""" + +from __future__ import print_function + +import argparse +import os +import sys + + +def require_pkgresources(name): + try: + import pkg_resources # noqa: F401 + except ImportError: + raise RuntimeError("'{0}' needs pkg_resources (part of setuptools).".format(name)) + + +class WheelError(Exception): + pass + + +def unpack_f(args): + from .unpack import unpack + unpack(args.wheelfile, args.dest) + + +def pack_f(args): + from .pack import pack + pack(args.directory, args.dest_dir, args.build_number) + + +def convert_f(args): + from .convert import convert + convert(args.files, args.dest_dir, args.verbose) + + +def version_f(args): + from .. import __version__ + print("wheel %s" % __version__) + + +def parser(): + p = argparse.ArgumentParser() + s = p.add_subparsers(help="commands") + + unpack_parser = s.add_parser('unpack', help='Unpack wheel') + unpack_parser.add_argument('--dest', '-d', help='Destination directory', + default='.') + unpack_parser.add_argument('wheelfile', help='Wheel file') + unpack_parser.set_defaults(func=unpack_f) + + repack_parser = s.add_parser('pack', help='Repack wheel') + repack_parser.add_argument('directory', help='Root directory of the unpacked wheel') + repack_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store the wheel (default %(default)s)") + repack_parser.add_argument('--build-number', help="Build tag to use in the wheel name") + repack_parser.set_defaults(func=pack_f) + + convert_parser = s.add_parser('convert', help='Convert egg or wininst to wheel') + convert_parser.add_argument('files', nargs='*', help='Files to convert') + convert_parser.add_argument('--dest-dir', '-d', default=os.path.curdir, + help="Directory to store wheels (default %(default)s)") + convert_parser.add_argument('--verbose', '-v', action='store_true') + convert_parser.set_defaults(func=convert_f) + + version_parser = s.add_parser('version', help='Print version and exit') + version_parser.set_defaults(func=version_f) + + help_parser = s.add_parser('help', help='Show this help') + help_parser.set_defaults(func=lambda args: p.print_help()) + + return p + + +def main(): + p = parser() + args = p.parse_args() + if not hasattr(args, 'func'): + p.print_help() + else: + try: + args.func(args) + return 0 + except WheelError as e: + print(e, file=sys.stderr) + + return 1 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3273692cbfc86e9d323642da5371867b20ce5955 GIT binary patch literal 3052 zcmb_e-EtH~6z-mx-JRXcEY!V`u&Q$-O?*97xeBGb7+bsg$U(wkg1E~Ft zjrr$6(8~IOR@4C(gj3Sa%b5;M&p~c($w!YTV=jU9L3 zbDuY%zsXyC0m>E+cpJ(E-r>if4EQ2H4rQCa#!o=m;qC*{T`JycJ=_o?35VHa5~aMC z#Hk2#9VfBgT4}uiV5Cb;XDZ`Vvr(Q7b)2QELy80NIgorvcOa?jkZlD3lq6)EJ|yX~ zM>KuZk}H(puO03@cV}de?$F=p4|=E!{b-Y4AF}D@hgbFJ6(3hX%AmC3?*eJLVrM=r$yUvVsgi%L9i~(4J#T8`@*8c3tB$h9_jqv>2OY zJWsG5F!pmECFO`c_Mxl^i^>JaPT&^Ss?@e$vNWp9TKa9MfSsL$Ou*8V%;=1aF*!Tv zx}{BDAY^c!dY(?B;iIlA7oo#6t#(FnB8xnU$ci5YTgRo?=uH?ufO;BQ{}a^4FiSUu)Ll=WL9{hgqLQc@(}01sOo=%@6gY~n zS4k6jE4ml=-sNMw+)8skbBY%)*;Cu*mmu?d@ zHFtq2on2>}&gd986WJ0ua@Rw5g&yEZ9Jj5SuJd3Q9T{h~firQYGjl-h7%*okhppqh zt{Y>2+(aI=YhmvaKe;bc)4;v^Yn|e++qK-83v#FV8Ge?(u?uc!+Xt(?S*?arZ}GSJ zIUZJ0HN9|Xz4Lt8uIJ6XaZLw@MlSG+cBD3|jcdP?5#^WoJ5T*m;u(hI1|gkB;lobt*g2K^Ac=ku@;?P&&G1EjOAkabBydzN9(v=u0$B8hZeNg1O`%Z z?oJtbp;%uJGZ{VxJ_pjrS$1!E7NiV)w^;lNLlXPvvFeywYUvHNRrFtR0=oj-aIb=2 zG<&@&vcVjirezP!w9HYz^~hewHuy2}ic|OSo(`)(3gJQz#gkZ9r+=`KJ%;1ODn!fg zM?BIr2C=1nyo8>S=VT8ZhOWXUt@7^2DP3yG4?5|zj9$DqjDItUCTl#pbr)I+5-Co@ zb*+S4xtV0cC{eedQi^oj#s_uSVbl3cuICex>U&mt(1|!_Dqkxnt3eCfWy1tmhnZI1 z1n>-CmBN(04vdp2By+uC>cd=uyGW#7i4-Q0Lb`QB)u3HnDCMeywzO_pZ8GT08L}Gg z%qgjAFQ67GVXFYpNDnu#dI0{%L%#MCS}`ZRDlv;}3y);dtm>x;I&X!}uW$&nwy zoPDN4hQn9D9Y|^fnI<~~xefVln`&o9Io)y8GW586@VrWIZ*^w$xi_PGNYBm#0?)4+ zJimUTWE*&{cum)54zd?_k@p?~g>xAB6`o<$W6T4i*H$I+uYHl(7zU3nFUzI{2o8bA zL|Z7+*oai5wUqDU6gv-J5i*3#xN1w8y3+8Nl5qQ5MWK@!Dvol$H;Ll(8yHh~wG&zg zHMMBVaUl2TA`KmR3;MgqOoK6=4a>L9DAzf>q?knam3_>vVfHCzs5{gA^2tz4k-Y3{ t#(K&Tzp#h0s~-Y|VNe>?zgfPZZlOICx|HVxjt}^J*KaI(ey#e?{|h;2-Yx(D literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/convert.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d066303624ed994c4e2b5b76479544fbae2316a GIT binary patch literal 6221 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 J7fOa>{tMgLjKKf^ literal 0 HcmV?d00001 diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/__pycache__/unpack.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b593d1ad2ced7f670fab148628a07119c487d0d6 GIT binary patch literal 955 zcmYjPOK%e~5VpOKJen57Q{vFSRzvRH>8L)l?LJ&by zGNN5d@y=4#b*j_ty224|>W%!a4}W#xi`p03tqJyyv>O-TOWM?K6e`I~FD|plBzd-f z0ohRBI2=fs?j@77cmT9^_WONSgwban z@?(V5X*M}f1&>F0W@KjgagwI|Nb<5Wm4cg`PlVKF7EH2mBxjqGu~f4=7(z+D)Kzg3 z&CNh^%n-uDF`9#;hR&?=?iQg6M__LTyZoT?Gy_bBQC0vE-^va#?DCf& zlPtsrbCD<+nOvRn+d{@+nHuztN~N%nf4}Wc1<%$H5kNS*x@<#|^}&9ZPiCD?$Ks?M znTdVNUcYL$lnW#2UIK_(ie3!ELvQQ#RbCdB<=VOk+`7X&$*fn6-uiK_Mxn8eKGoLO zM&zZjUYwSCV4L#9s4y~NnzlXFg6P)8lDh0TRz47>rbKH0<@Z^;Y(HEFMO^VtoIuiMRVhmEMcDc6Ne;ph$|%B-5C0^Q6d*A4J2m zpz7*MMrjf(hukSnt-rkDM(Pa^q|u};x.+?)-(?P.+?) + (-(?Ppy\d\.\d) + (-(?P.+?))? + )?.egg$''', re.VERBOSE) + + +class _bdist_wheel_tag(bdist_wheel): + # allow the client to override the default generated wheel tag + # The default bdist_wheel implementation uses python and abi tags + # of the running python process. This is not suitable for + # generating/repackaging prebuild binaries. + + full_tag_supplied = False + full_tag = None # None or a (pytag, soabitag, plattag) triple + + def get_tag(self): + if self.full_tag_supplied and self.full_tag is not None: + return self.full_tag + else: + return bdist_wheel.get_tag(self) + + +def egg2wheel(egg_path, dest_dir): + filename = os.path.basename(egg_path) + match = egg_info_re.match(filename) + if not match: + raise WheelError('Invalid egg file name: {}'.format(filename)) + + egg_info = match.groupdict() + dir = tempfile.mkdtemp(suffix="_e2w") + if os.path.isfile(egg_path): + # assume we have a bdist_egg otherwise + with zipfile.ZipFile(egg_path) as egg: + egg.extractall(dir) + else: + # support buildout-style installed eggs directories + for pth in os.listdir(egg_path): + src = os.path.join(egg_path, pth) + if os.path.isfile(src): + shutil.copy2(src, dir) + else: + shutil.copytree(src, os.path.join(dir, pth)) + + pyver = egg_info['pyver'] + if pyver: + pyver = egg_info['pyver'] = pyver.replace('.', '') + + arch = (egg_info['arch'] or 'any').replace('.', '_').replace('-', '_') + + # assume all binary eggs are for CPython + abi = 'cp' + pyver[2:] if arch != 'any' else 'none' + + root_is_purelib = egg_info['arch'] is None + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = egg_info['arch'] or 'any' + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '{name}-{ver}.dist-info'.format(**egg_info)) + bw.egg2dist(os.path.join(dir, 'EGG-INFO'), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='egg2wheel') + wheel_name = '{name}-{ver}-{pyver}-{}-{}.whl'.format(abi, arch, **egg_info) + with WheelFile(os.path.join(dest_dir, wheel_name), 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def parse_wininst_info(wininfo_name, egginfo_name): + """Extract metadata from filenames. + + Extracts the 4 metadataitems needed (name, version, pyversion, arch) from + the installer filename and the name of the egg-info directory embedded in + the zipfile (if any). + + The egginfo filename has the format:: + + name-ver(-pyver)(-arch).egg-info + + The installer filename has the format:: + + name-ver.arch(-pyver).exe + + Some things to note: + + 1. The installer filename is not definitive. An installer can be renamed + and work perfectly well as an installer. So more reliable data should + be used whenever possible. + 2. The egg-info data should be preferred for the name and version, because + these come straight from the distutils metadata, and are mandatory. + 3. The pyver from the egg-info data should be ignored, as it is + constructed from the version of Python used to build the installer, + which is irrelevant - the installer filename is correct here (even to + the point that when it's not there, any version is implied). + 4. The architecture must be taken from the installer filename, as it is + not included in the egg-info data. + 5. Architecture-neutral installers still have an architecture because the + installer format itself (being executable) is architecture-specific. We + should therefore ignore the architecture if the content is pure-python. + """ + + egginfo = None + if egginfo_name: + egginfo = egg_info_re.search(egginfo_name) + if not egginfo: + raise ValueError("Egg info filename %s is not valid" % (egginfo_name,)) + + # Parse the wininst filename + # 1. Distribution name (up to the first '-') + w_name, sep, rest = wininfo_name.partition('-') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + # Strip '.exe' + rest = rest[:-4] + # 2. Python version (from the last '-', must start with 'py') + rest2, sep, w_pyver = rest.rpartition('-') + if sep and w_pyver.startswith('py'): + rest = rest2 + w_pyver = w_pyver.replace('.', '') + else: + # Not version specific - use py2.py3. While it is possible that + # pure-Python code is not compatible with both Python 2 and 3, there + # is no way of knowing from the wininst format, so we assume the best + # here (the user can always manually rename the wheel to be more + # restrictive if needed). + w_pyver = 'py2.py3' + # 3. Version and architecture + w_ver, sep, w_arch = rest.rpartition('.') + if not sep: + raise ValueError("Installer filename %s is not valid" % (wininfo_name,)) + + if egginfo: + w_name = egginfo.group('name') + w_ver = egginfo.group('ver') + + return {'name': w_name, 'ver': w_ver, 'arch': w_arch, 'pyver': w_pyver} + + +def wininst2wheel(path, dest_dir): + with zipfile.ZipFile(path) as bdw: + # Search for egg-info in the archive + egginfo_name = None + for filename in bdw.namelist(): + if '.egg-info' in filename: + egginfo_name = filename + break + + info = parse_wininst_info(os.path.basename(path), egginfo_name) + + root_is_purelib = True + for zipinfo in bdw.infolist(): + if zipinfo.filename.startswith('PLATLIB'): + root_is_purelib = False + break + if root_is_purelib: + paths = {'purelib': ''} + else: + paths = {'platlib': ''} + + dist_info = "%(name)s-%(ver)s" % info + datadir = "%s.data/" % dist_info + + # rewrite paths to trick ZipFile into extracting an egg + # XXX grab wininst .ini - between .exe, padding, and first zip file. + members = [] + egginfo_name = '' + for zipinfo in bdw.infolist(): + key, basename = zipinfo.filename.split('/', 1) + key = key.lower() + basepath = paths.get(key, None) + if basepath is None: + basepath = datadir + key.lower() + '/' + oldname = zipinfo.filename + newname = basepath + basename + zipinfo.filename = newname + del bdw.NameToInfo[oldname] + bdw.NameToInfo[newname] = zipinfo + # Collect member names, but omit '' (from an entry like "PLATLIB/" + if newname: + members.append(newname) + # Remember egg-info name for the egg2dist call below + if not egginfo_name: + if newname.endswith('.egg-info'): + egginfo_name = newname + elif '.egg-info/' in newname: + egginfo_name, sep, _ = newname.rpartition('/') + dir = tempfile.mkdtemp(suffix="_b2w") + bdw.extractall(dir, members) + + # egg2wheel + abi = 'none' + pyver = info['pyver'] + arch = (info['arch'] or 'any').replace('.', '_').replace('-', '_') + # Wininst installers always have arch even if they are not + # architecture-specific (because the format itself is). + # So, assume the content is architecture-neutral if root is purelib. + if root_is_purelib: + arch = 'any' + # If the installer is architecture-specific, it's almost certainly also + # CPython-specific. + if arch != 'any': + pyver = pyver.replace('py', 'cp') + wheel_name = '-'.join((dist_info, pyver, abi, arch)) + if root_is_purelib: + bw = bdist_wheel(dist.Distribution()) + else: + bw = _bdist_wheel_tag(dist.Distribution()) + + bw.root_is_pure = root_is_purelib + bw.python_tag = pyver + bw.plat_name_supplied = True + bw.plat_name = info['arch'] or 'any' + + if not root_is_purelib: + bw.full_tag_supplied = True + bw.full_tag = (pyver, abi, arch) + + dist_info_dir = os.path.join(dir, '%s.dist-info' % dist_info) + bw.egg2dist(os.path.join(dir, egginfo_name), dist_info_dir) + bw.write_wheelfile(dist_info_dir, generator='wininst2wheel') + + wheel_path = os.path.join(dest_dir, wheel_name) + with WheelFile(wheel_path, 'w') as wf: + wf.write_files(dir) + + shutil.rmtree(dir) + + +def convert(files, dest_dir, verbose): + # Only support wheel convert if pkg_resources is present + require_pkgresources('wheel convert') + + for pat in files: + for installer in iglob(pat): + if os.path.splitext(installer)[1] == '.egg': + conv = egg2wheel + else: + conv = wininst2wheel + + if verbose: + print("{}... ".format(installer)) + sys.stdout.flush() + + conv(installer, dest_dir) + if verbose: + print("OK") diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/pack.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/pack.py new file mode 100644 index 0000000..af6e81c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/pack.py @@ -0,0 +1,58 @@ +from __future__ import print_function + +import os.path +import re +import sys + +from wheel.cli import WheelError +from wheel.wheelfile import WheelFile + +DIST_INFO_RE = re.compile(r"^(?P(?P.+?)-(?P\d.*?))\.dist-info$") + + +def pack(directory, dest_dir, build_number): + """Repack a previously unpacked wheel directory into a new wheel file. + + The .dist-info/WHEEL file must contain one or more tags so that the target + wheel file name can be determined. + + :param directory: The unpacked wheel directory + :param dest_dir: Destination directory (defaults to the current directory) + """ + # Find the .dist-info directory + dist_info_dirs = [fn for fn in os.listdir(directory) + if os.path.isdir(os.path.join(directory, fn)) and DIST_INFO_RE.match(fn)] + if len(dist_info_dirs) > 1: + raise WheelError('Multiple .dist-info directories found in {}'.format(directory)) + elif not dist_info_dirs: + raise WheelError('No .dist-info directories found in {}'.format(directory)) + + # Determine the target wheel filename + dist_info_dir = dist_info_dirs[0] + name_version = DIST_INFO_RE.match(dist_info_dir).group('namever') + + # Add the build number if specific + if build_number: + name_version += '-' + build_number + + # Read the tags from .dist-info/WHEEL + with open(os.path.join(directory, dist_info_dir, 'WHEEL')) as f: + tags = [line.split(' ')[1].rstrip() for line in f if line.startswith('Tag: ')] + if not tags: + raise WheelError('No tags present in {}/WHEEL; cannot determine target wheel filename' + .format(dist_info_dir)) + + # Reassemble the tags for the wheel file + impls = sorted({tag.split('-')[0] for tag in tags}) + abivers = sorted({tag.split('-')[1] for tag in tags}) + platforms = sorted({tag.split('-')[2] for tag in tags}) + tagline = '-'.join(['.'.join(impls), '.'.join(abivers), '.'.join(platforms)]) + + # Repack the wheel + wheel_path = os.path.join(dest_dir, '{}-{}.whl'.format(name_version, tagline)) + with WheelFile(wheel_path, 'w') as wf: + print("Repacking wheel as {}...".format(wheel_path), end='') + sys.stdout.flush() + wf.write_files(directory) + + print('OK') diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/unpack.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/unpack.py new file mode 100644 index 0000000..2e9857a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/cli/unpack.py @@ -0,0 +1,25 @@ +from __future__ import print_function + +import os.path +import sys + +from ..wheelfile import WheelFile + + +def unpack(path, dest='.'): + """Unpack a wheel. + + Wheel content will be unpacked to {dest}/{name}-{ver}, where {name} + is the package name and {ver} its version. + + :param path: The path to the wheel. + :param dest: Destination directory (default to current directory). + """ + with WheelFile(path) as wf: + namever = wf.parsed_filename.group('namever') + destination = os.path.join(dest, namever) + print("Unpacking to: {}...".format(destination), end='') + sys.stdout.flush() + wf.extractall(destination) + + print('OK') diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/metadata.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/metadata.py new file mode 100644 index 0000000..ab0c07e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/metadata.py @@ -0,0 +1,141 @@ +""" +Tools for converting old- to new-style metadata. +""" + +import os.path +import re +import textwrap + +import pkg_resources + +from .pkginfo import read_pkg_info + +# Wheel itself is probably the only program that uses non-extras markers +# in METADATA/PKG-INFO. Support its syntax with the extra at the end only. +EXTRA_RE = re.compile( + r"""^(?P.*?)(;\s*(?P.*?)(extra == '(?P.*?)')?)$""") + + +def requires_to_requires_dist(requirement): + """Return the version specifier for a requirement in PEP 345/566 fashion.""" + if getattr(requirement, 'url', None): + return " @ " + requirement.url + + requires_dist = [] + for op, ver in requirement.specs: + requires_dist.append(op + ver) + if not requires_dist: + return '' + return " (%s)" % ','.join(sorted(requires_dist)) + + +def convert_requirements(requirements): + """Yield Requires-Dist: strings for parsed requirements strings.""" + for req in requirements: + parsed_requirement = pkg_resources.Requirement.parse(req) + spec = requires_to_requires_dist(parsed_requirement) + extras = ",".join(sorted(parsed_requirement.extras)) + if extras: + extras = "[%s]" % extras + yield (parsed_requirement.project_name + extras + spec) + + +def generate_requirements(extras_require): + """ + Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement') + and ('Provides-Extra', 'extra') tuples. + + extras_require is a dictionary of {extra: [requirements]} as passed to setup(), + using the empty extra {'': [requirements]} to hold install_requires. + """ + for extra, depends in extras_require.items(): + condition = '' + extra = extra or '' + if ':' in extra: # setuptools extra:condition syntax + extra, condition = extra.split(':', 1) + + extra = pkg_resources.safe_extra(extra) + if extra: + yield 'Provides-Extra', extra + if condition: + condition = "(" + condition + ") and " + condition += "extra == '%s'" % extra + + if condition: + condition = ' ; ' + condition + + for new_req in convert_requirements(depends): + yield 'Requires-Dist', new_req + condition + + +def pkginfo_to_metadata(egg_info_path, pkginfo_path): + """ + Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format + """ + pkg_info = read_pkg_info(pkginfo_path) + pkg_info.replace_header('Metadata-Version', '2.1') + # Those will be regenerated from `requires.txt`. + del pkg_info['Provides-Extra'] + del pkg_info['Requires-Dist'] + requires_path = os.path.join(egg_info_path, 'requires.txt') + if os.path.exists(requires_path): + with open(requires_path) as requires_file: + requires = requires_file.read() + + parsed_requirements = sorted(pkg_resources.split_sections(requires), + key=lambda x: x[0] or '') + for extra, reqs in parsed_requirements: + for key, value in generate_requirements({extra: reqs}): + if (key, value) not in pkg_info.items(): + pkg_info[key] = value + + description = pkg_info['Description'] + if description: + pkg_info.set_payload(dedent_description(pkg_info)) + del pkg_info['Description'] + + return pkg_info + + +def pkginfo_unicode(pkg_info, field): + """Hack to coax Unicode out of an email Message() - Python 3.3+""" + text = pkg_info[field] + field = field.lower() + if not isinstance(text, str): + if not hasattr(pkg_info, 'raw_items'): # Python 3.2 + return str(text) + for item in pkg_info.raw_items(): + if item[0].lower() == field: + text = item[1].encode('ascii', 'surrogateescape') \ + .decode('utf-8') + break + + return text + + +def dedent_description(pkg_info): + """ + Dedent and convert pkg_info['Description'] to Unicode. + """ + description = pkg_info['Description'] + + # Python 3 Unicode handling, sorta. + surrogates = False + if not isinstance(description, str): + surrogates = True + description = pkginfo_unicode(pkg_info, 'Description') + + description_lines = description.splitlines() + description_dedent = '\n'.join( + # if the first line of long_description is blank, + # the first line here will be indented. + (description_lines[0].lstrip(), + textwrap.dedent('\n'.join(description_lines[1:])), + '\n')) + + if surrogates: + description_dedent = description_dedent \ + .encode("utf8") \ + .decode("ascii", "surrogateescape") + + return description_dedent diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/pep425tags.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/pep425tags.py new file mode 100644 index 0000000..13b5073 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/pep425tags.py @@ -0,0 +1,185 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" + +import distutils.util +import platform +import sys +import sysconfig +import warnings + +try: + from importlib.machinery import get_all_suffixes +except ImportError: + from imp import get_suffixes as get_all_suffixes + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # pip Issue #1074 + warnings.warn("{0}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + impl = platform.python_implementation() + if impl == 'PyPy': + return 'pp' + elif impl == 'Jython': + return 'jy' + elif impl == 'IronPython': + return 'ip' + elif impl == 'CPython': + return 'cp' + + raise LookupError('Unknown Python implementation: ' + impl) + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + warnings.warn("Config variable '{0}' is unset, Python ABI tag may " + "be incorrect".format(var), RuntimeWarning, 2) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in ('cp', 'pp') and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and sys.maxsize == 2147483647: + # pip pull request #3497 + result = "linux_i686" + return result + + +def get_supported(versions=None, supplied_platform=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = get_abbr_impl() + + abis = [] + + abi = get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_all_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + platforms = [] + if supplied_platform: + platforms.append(supplied_platform) + platforms.append(get_platform()) + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in platforms: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in ('31', '30'): + break + for abi in abi3s: # empty set if not Python 3 + for arch in platforms: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # No abi / arch, but requires our implementation: + for i, version in enumerate(versions): + supported.append(('%s%s' % (impl, version), 'none', 'any')) + if i == 0: + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # Major Python version + platform; e.g. binaries not using the Python API + for arch in platforms: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/pkginfo.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/pkginfo.py new file mode 100644 index 0000000..115be45 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/pkginfo.py @@ -0,0 +1,43 @@ +"""Tools for reading and writing PKG-INFO / METADATA without caring +about the encoding.""" + +from email.parser import Parser + +try: + unicode + _PY3 = False +except NameError: + _PY3 = True + +if not _PY3: + from email.generator import Generator + + def read_pkg_info_bytes(bytestr): + return Parser().parsestr(bytestr) + + def read_pkg_info(path): + with open(path, "r") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, 'w') as metadata: + Generator(metadata, mangle_from_=False, maxheaderlen=0).flatten(message) +else: + from email.generator import BytesGenerator + + def read_pkg_info_bytes(bytestr): + headers = bytestr.decode(encoding="ascii", errors="surrogateescape") + message = Parser().parsestr(headers) + return message + + def read_pkg_info(path): + with open(path, "r", + encoding="ascii", + errors="surrogateescape") as headers: + message = Parser().parse(headers) + return message + + def write_pkg_info(path, message): + with open(path, "wb") as out: + BytesGenerator(out, mangle_from_=False, maxheaderlen=0).flatten(message) diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/util.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/util.py new file mode 100644 index 0000000..0afb54a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/util.py @@ -0,0 +1,46 @@ +import base64 +import io +import sys + + +if sys.version_info[0] < 3: + text_type = unicode # noqa: F821 + + StringIO = io.BytesIO + + def native(s, encoding='utf-8'): + if isinstance(s, unicode): + return s.encode(encoding) + return s +else: + text_type = str + + StringIO = io.StringIO + + def native(s, encoding='utf-8'): + if isinstance(s, bytes): + return s.decode(encoding) + return s + + +def urlsafe_b64encode(data): + """urlsafe_b64encode without padding""" + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def urlsafe_b64decode(data): + """urlsafe_b64decode without padding""" + pad = b'=' * (4 - (len(data) & 3)) + return base64.urlsafe_b64decode(data + pad) + + +def as_unicode(s): + if isinstance(s, bytes): + return s.decode('utf-8') + return s + + +def as_bytes(s): + if isinstance(s, text_type): + return s.encode('utf-8') + return s diff --git a/backend/venv/venv/lib/python3.7/site-packages/wheel/wheelfile.py b/backend/venv/venv/lib/python3.7/site-packages/wheel/wheelfile.py new file mode 100644 index 0000000..ddf8509 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site-packages/wheel/wheelfile.py @@ -0,0 +1,169 @@ +from __future__ import print_function + +import csv +import hashlib +import os.path +import re +import stat +import time +from collections import OrderedDict +from distutils import log as logger +from zipfile import ZIP_DEFLATED, ZipInfo, ZipFile + +from wheel.cli import WheelError +from wheel.util import urlsafe_b64decode, as_unicode, native, urlsafe_b64encode, as_bytes, StringIO + +# Non-greedy matching of an optional build number may be too clever (more +# invalid wheel filenames will match). Separate regex for .dist-info? +WHEEL_INFO_RE = re.compile( + r"""^(?P(?P.+?)-(?P.+?))(-(?P\d[^-]*))? + -(?P.+?)-(?P.+?)-(?P.+?)\.whl$""", + re.VERBOSE) + + +def get_zipinfo_datetime(timestamp=None): + # Some applications need reproducible .whl files, but they can't do this without forcing + # the timestamp of the individual ZipInfo objects. See issue #143. + timestamp = int(os.environ.get('SOURCE_DATE_EPOCH', timestamp or time.time())) + return time.gmtime(timestamp)[0:6] + + +class WheelFile(ZipFile): + """A ZipFile derivative class that also reads SHA-256 hashes from + .dist-info/RECORD and checks any read files against those. + """ + + _default_algorithm = hashlib.sha256 + + def __init__(self, file, mode='r'): + basename = os.path.basename(file) + self.parsed_filename = WHEEL_INFO_RE.match(basename) + if not basename.endswith('.whl') or self.parsed_filename is None: + raise WheelError("Bad wheel filename {!r}".format(basename)) + + ZipFile.__init__(self, file, mode, compression=ZIP_DEFLATED, allowZip64=True) + + self.dist_info_path = '{}.dist-info'.format(self.parsed_filename.group('namever')) + self.record_path = self.dist_info_path + '/RECORD' + self._file_hashes = OrderedDict() + self._file_sizes = {} + if mode == 'r': + # Ignore RECORD and any embedded wheel signatures + self._file_hashes[self.record_path] = None, None + self._file_hashes[self.record_path + '.jws'] = None, None + self._file_hashes[self.record_path + '.p7s'] = None, None + + # Fill in the expected hashes by reading them from RECORD + try: + record = self.open(self.record_path) + except KeyError: + raise WheelError('Missing {} file'.format(self.record_path)) + + with record: + for line in record: + line = line.decode('utf-8') + path, hash_sum, size = line.rsplit(u',', 2) + if hash_sum: + algorithm, hash_sum = hash_sum.split(u'=') + try: + hashlib.new(algorithm) + except ValueError: + raise WheelError('Unsupported hash algorithm: {}'.format(algorithm)) + + if algorithm.lower() in {'md5', 'sha1'}: + raise WheelError( + 'Weak hash algorithm ({}) is not permitted by PEP 427' + .format(algorithm)) + + self._file_hashes[path] = ( + algorithm, urlsafe_b64decode(hash_sum.encode('ascii'))) + + def open(self, name_or_info, mode="r", pwd=None): + def _update_crc(newdata, eof=None): + if eof is None: + eof = ef._eof + update_crc_orig(newdata) + else: # Python 2 + update_crc_orig(newdata, eof) + + running_hash.update(newdata) + if eof and running_hash.digest() != expected_hash: + raise WheelError("Hash mismatch for file '{}'".format(native(ef_name))) + + ef = ZipFile.open(self, name_or_info, mode, pwd) + ef_name = as_unicode(name_or_info.filename if isinstance(name_or_info, ZipInfo) + else name_or_info) + if mode == 'r' and not ef_name.endswith('/'): + if ef_name not in self._file_hashes: + raise WheelError("No hash found for file '{}'".format(native(ef_name))) + + algorithm, expected_hash = self._file_hashes[ef_name] + if expected_hash is not None: + # Monkey patch the _update_crc method to also check for the hash from RECORD + running_hash = hashlib.new(algorithm) + update_crc_orig, ef._update_crc = ef._update_crc, _update_crc + + return ef + + def write_files(self, base_dir): + logger.info("creating '%s' and adding '%s' to it", self.filename, base_dir) + deferred = [] + for root, dirnames, filenames in os.walk(base_dir): + # Sort the directory names so that `os.walk` will walk them in a + # defined order on the next iteration. + dirnames.sort() + for name in sorted(filenames): + path = os.path.normpath(os.path.join(root, name)) + if os.path.isfile(path): + arcname = os.path.relpath(path, base_dir) + if arcname == self.record_path: + pass + elif root.endswith('.dist-info'): + deferred.append((path, arcname)) + else: + self.write(path, arcname) + + deferred.sort() + for path, arcname in deferred: + self.write(path, arcname) + + def write(self, filename, arcname=None, compress_type=None): + with open(filename, 'rb') as f: + st = os.fstat(f.fileno()) + data = f.read() + + zinfo = ZipInfo(arcname or filename, date_time=get_zipinfo_datetime(st.st_mtime)) + zinfo.external_attr = (stat.S_IMODE(st.st_mode) | stat.S_IFMT(st.st_mode)) << 16 + zinfo.compress_type = ZIP_DEFLATED + self.writestr(zinfo, data, compress_type) + + def writestr(self, zinfo_or_arcname, bytes, compress_type=None): + ZipFile.writestr(self, zinfo_or_arcname, bytes, compress_type) + fname = (zinfo_or_arcname.filename if isinstance(zinfo_or_arcname, ZipInfo) + else zinfo_or_arcname) + logger.info("adding '%s'", fname) + if fname != self.record_path: + hash_ = self._default_algorithm(bytes) + self._file_hashes[fname] = hash_.name, native(urlsafe_b64encode(hash_.digest())) + self._file_sizes[fname] = len(bytes) + + def close(self): + # Write RECORD + if self.fp is not None and self.mode == 'w' and self._file_hashes: + data = StringIO() + writer = csv.writer(data, delimiter=',', quotechar='"', lineterminator='\n') + writer.writerows(( + ( + fname, + algorithm + "=" + hash_, + self._file_sizes[fname] + ) + for fname, (algorithm, hash_) in self._file_hashes.items() + )) + writer.writerow((format(self.record_path), "", "")) + zinfo = ZipInfo(native(self.record_path), date_time=get_zipinfo_datetime()) + zinfo.compress_type = ZIP_DEFLATED + zinfo.external_attr = 0o664 << 16 + self.writestr(zinfo, as_bytes(data.getvalue())) + + ZipFile.close(self) diff --git a/backend/venv/venv/lib/python3.7/site.py b/backend/venv/venv/lib/python3.7/site.py new file mode 100644 index 0000000..6868be6 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/site.py @@ -0,0 +1,821 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +It also supports the Debian convention of +lib/python/dist-packages. On other platforms (mainly Mac and +Windows), it uses just sys.prefix (and sys.exec_prefix, if different, +but this is unlikely). The resulting directories, if they exist, are +appended to sys.path, and also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/dist-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.X/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.X/site-packages/bar + /usr/local/lib/python2.X/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import os +import sys + +try: + import __builtin__ as builtins +except ImportError: + import builtins +try: + set +except NameError: + from sets import Set as set + +# Prefixes for site-packages; add additional prefixes like /usr/local here +PREFIXES = [sys.prefix, sys.exec_prefix] +# Enable per user site-packages directory +# set it to False to disable the feature or True to force the feature +ENABLE_USER_SITE = None +# for distutils.commands.install +USER_SITE = None +USER_BASE = None + +_is_64bit = (getattr(sys, "maxsize", None) or getattr(sys, "maxint")) > 2 ** 32 +_is_pypy = hasattr(sys, "pypy_version_info") + + +def makepath(*paths): + dir = os.path.join(*paths) + dir = os.path.abspath(dir) + return dir, os.path.normcase(dir) + + +def abs__file__(): + """Set all module' __file__ attribute to an absolute path""" + for m in sys.modules.values(): + f = getattr(m, "__file__", None) + if f is None: + continue + m.__file__ = os.path.abspath(f) + + +def removeduppaths(): + """ Remove duplicate entries from sys.path along with making them + absolute""" + # This ensures that the initial path provided by the interpreter contains + # only absolute pathnames, even if we're running from the build directory. + L = [] + known_paths = set() + for dir in sys.path: + # Filter out duplicate paths (on case-insensitive file systems also + # if they only differ in case); turn relative paths into absolute + # paths. + dir, dircase = makepath(dir) + if not dircase in known_paths: + L.append(dir) + known_paths.add(dircase) + sys.path[:] = L + return known_paths + + +# XXX This should not be part of site.py, since it is needed even when +# using the -S option for Python. See http://www.python.org/sf/586680 +def addbuilddir(): + """Append ./build/lib. in case we're running in the build dir + (especially for Guido :-)""" + from distutils.util import get_platform + + s = "build/lib.{}-{:.3}".format(get_platform(), sys.version) + if hasattr(sys, "gettotalrefcount"): + s += "-pydebug" + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + + +def _init_pathinfo(): + """Return a set containing all existing directory entries from sys.path""" + d = set() + for dir in sys.path: + try: + if os.path.isdir(dir): + dir, dircase = makepath(dir) + d.add(dircase) + except TypeError: + continue + return d + + +def addpackage(sitedir, name, known_paths): + """Add a new path to known_paths by combining sitedir and 'name' or execute + sitedir if it starts with 'import'""" + if known_paths is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname, "r") + except IOError: + return + try: + for line in f: + if line.startswith("#"): + continue + if line.startswith("import"): + exec(line) + continue + line = line.rstrip() + dir, dircase = makepath(sitedir, line) + if not dircase in known_paths and os.path.exists(dir): + sys.path.append(dir) + known_paths.add(dircase) + finally: + f.close() + if reset: + known_paths = None + return known_paths + + +def addsitedir(sitedir, known_paths=None): + """Add 'sitedir' argument to sys.path if missing and handle .pth files in + 'sitedir'""" + if known_paths is None: + known_paths = _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in known_paths: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name.endswith(os.extsep + "pth"): + addpackage(sitedir, name, known_paths) + if reset: + known_paths = None + return known_paths + + +def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_prefix): + """Add site-packages (and possibly site-python) to sys.path""" + prefixes = [os.path.join(sys_prefix, "local"), sys_prefix] + if exec_prefix != sys_prefix: + prefixes.append(os.path.join(exec_prefix, "local")) + + for prefix in prefixes: + if prefix: + if sys.platform in ("os2emx", "riscos"): + sitedirs = [os.path.join(prefix, "Lib", "site-packages")] + elif _is_pypy: + sitedirs = [os.path.join(prefix, "site-packages")] + elif sys.platform == "darwin" and prefix == sys_prefix: + + if prefix.startswith("/System/Library/Frameworks/"): # Apple's Python + + sitedirs = [ + os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(prefix, "Extras", "lib", "python"), + ] + + else: # any other Python distros on OSX work this way + sitedirs = [os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages")] + + elif os.sep == "/": + sitedirs = [ + os.path.join(prefix, "lib", "python" + sys.version[:3], "site-packages"), + os.path.join(prefix, "lib", "site-python"), + os.path.join(prefix, "python" + sys.version[:3], "lib-dynload"), + ] + lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages") + if os.path.exists(lib64_dir) and os.path.realpath(lib64_dir) not in [ + os.path.realpath(p) for p in sitedirs + ]: + if _is_64bit: + sitedirs.insert(0, lib64_dir) + else: + sitedirs.append(lib64_dir) + try: + # sys.getobjects only available in --with-pydebug build + sys.getobjects + sitedirs.insert(0, os.path.join(sitedirs[0], "debug")) + except AttributeError: + pass + # Debian-specific dist-packages directories: + sitedirs.append(os.path.join(prefix, "local/lib", "python" + sys.version[:3], "dist-packages")) + if sys.version[0] == "2": + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], "dist-packages")) + else: + sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[0], "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) + else: + sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] + if sys.platform == "darwin": + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if "Python.framework" in prefix: + home = os.environ.get("HOME") + if home: + sitedirs.append(os.path.join(home, "Library", "Python", sys.version[:3], "site-packages")) + for sitedir in sitedirs: + if os.path.isdir(sitedir): + addsitedir(sitedir, known_paths) + return None + + +def check_enableusersite(): + """Check if user site directory is safe for inclusion + + The function tests for the command line flag (including environment var), + process uid/gid equal to effective uid/gid. + + None: Disabled for security reasons + False: Disabled by user (command line option) + True: Safe and enabled + """ + if hasattr(sys, "flags") and getattr(sys.flags, "no_user_site", False): + return False + + if hasattr(os, "getuid") and hasattr(os, "geteuid"): + # check process uid == effective uid + if os.geteuid() != os.getuid(): + return None + if hasattr(os, "getgid") and hasattr(os, "getegid"): + # check process gid == effective gid + if os.getegid() != os.getgid(): + return None + + return True + + +def addusersitepackages(known_paths): + """Add a per user site-package to sys.path + + Each user has its own python directory with site-packages in the + home directory. + + USER_BASE is the root directory for all Python versions + + USER_SITE is the user specific site-packages directory + + USER_SITE/.. can be used for data. + """ + global USER_BASE, USER_SITE, ENABLE_USER_SITE + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # if sys.platform in ('os2emx', 'riscos'): + # # Don't know what to put here + # USER_BASE = '' + # USER_SITE = '' + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser(base, "Python") + USER_SITE = os.path.join(USER_BASE, "Python" + sys.version[0] + sys.version[2], "site-packages") + else: + if env_base: + USER_BASE = env_base + else: + USER_BASE = joinuser("~", ".local") + USER_SITE = os.path.join(USER_BASE, "lib", "python" + sys.version[:3], "site-packages") + + if ENABLE_USER_SITE and os.path.isdir(USER_SITE): + addsitedir(USER_SITE, known_paths) + if ENABLE_USER_SITE: + for dist_libdir in ("lib", "local/lib"): + user_site = os.path.join(USER_BASE, dist_libdir, "python" + sys.version[:3], "dist-packages") + if os.path.isdir(user_site): + addsitedir(user_site, known_paths) + return known_paths + + +def setBEGINLIBPATH(): + """The OS/2 EMX port has optional extension modules that do double duty + as DLLs (and must use the .DLL file extension) for other extensions. + The library search path needs to be amended so these will be found + during module import. Use BEGINLIBPATH so that these are at the start + of the library search path. + + """ + dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload") + libpath = os.environ["BEGINLIBPATH"].split(";") + if libpath[-1]: + libpath.append(dllpath) + else: + libpath[-1] = dllpath + os.environ["BEGINLIBPATH"] = ";".join(libpath) + + +def setquit(): + """Define new built-ins 'quit' and 'exit'. + These are simply strings that display a hint on how to exit. + + """ + if os.sep == ":": + eof = "Cmd-Q" + elif os.sep == "\\": + eof = "Ctrl-Z plus Return" + else: + eof = "Ctrl-D (i.e. EOF)" + + class Quitter(object): + def __init__(self, name): + self.name = name + + def __repr__(self): + return "Use {}() or {} to exit".format(self.name, eof) + + def __call__(self, code=None): + # Shells like IDLE catch the SystemExit, but listen when their + # stdin wrapper is closed. + try: + sys.stdin.close() + except: + pass + raise SystemExit(code) + + builtins.quit = Quitter("quit") + builtins.exit = Quitter("exit") + + +class _Printer(object): + """interactive prompt objects for printing the license text, a list of + contributors and the copyright notice.""" + + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for filename in self.__files: + filename = os.path.join(dir, filename) + try: + fp = open(filename, "r") + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split("\n") + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,) * 2) + + def __call__(self): + self.__setup() + prompt = "Hit Return for more, or q (and Return) to quit: " + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print(self.__lines[i]) + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + try: + key = raw_input(prompt) + except NameError: + key = input(prompt) + if key not in ("", "q"): + key = None + if key == "q": + break + + +def setcopyright(): + """Set 'copyright' and 'credits' in __builtin__""" + builtins.copyright = _Printer("copyright", sys.copyright) + if _is_pypy: + builtins.credits = _Printer("credits", "PyPy is maintained by the PyPy developers: http://pypy.org/") + else: + builtins.credits = _Printer( + "credits", + """\ + Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands + for supporting Python development. See www.python.org for more information.""", + ) + here = os.path.dirname(os.__file__) + builtins.license = _Printer( + "license", + "See https://www.python.org/psf/license/", + ["LICENSE.txt", "LICENSE"], + [sys.prefix, os.path.join(here, os.pardir), here, os.curdir], + ) + + +class _Helper(object): + """Define the built-in 'help'. + This is a wrapper around pydoc.help (with a twist). + + """ + + def __repr__(self): + return "Type help() for interactive help, " "or help(object) for help about object." + + def __call__(self, *args, **kwds): + import pydoc + + return pydoc.help(*args, **kwds) + + +def sethelper(): + builtins.help = _Helper() + + +def aliasmbcs(): + """On Windows, some default encodings are not provided by Python, + while they are always available as "mbcs" in each locale. Make + them usable by aliasing to "mbcs" in such a case.""" + if sys.platform == "win32": + import locale, codecs + + enc = locale.getdefaultlocale()[1] + if enc.startswith("cp"): # "cp***" ? + try: + codecs.lookup(enc) + except LookupError: + import encodings + + encodings._cache[enc] = encodings._unknown + encodings.aliases.aliases[enc] = "mbcs" + + +def setencoding(): + """Set the string encoding used by the Unicode implementation. The + default is 'ascii', but if you're willing to experiment, you can + change this.""" + encoding = "ascii" # Default value set by _PyUnicode_Init() + if 0: + # Enable to support locale aware default string encodings. + import locale + + loc = locale.getdefaultlocale() + if loc[1]: + encoding = loc[1] + if 0: + # Enable to switch off string to Unicode coercion and implicit + # Unicode to string conversion. + encoding = "undefined" + if encoding != "ascii": + # On Non-Unicode builds this will raise an AttributeError... + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + + +def execsitecustomize(): + """Run custom site specific code, if available.""" + try: + import sitecustomize + except ImportError: + pass + + +def virtual_install_main_packages(): + f = open(os.path.join(os.path.dirname(__file__), "orig-prefix.txt")) + sys.real_prefix = f.read().strip() + f.close() + pos = 2 + hardcoded_relative_dirs = [] + if sys.path[0] == "": + pos += 1 + if _is_pypy: + if sys.version_info > (3, 2): + cpyver = "%d" % sys.version_info[0] + elif sys.pypy_version_info >= (1, 5): + cpyver = "%d.%d" % sys.version_info[:2] + else: + cpyver = "%d.%d.%d" % sys.version_info[:3] + paths = [os.path.join(sys.real_prefix, "lib_pypy"), os.path.join(sys.real_prefix, "lib-python", cpyver)] + if sys.pypy_version_info < (1, 9): + paths.insert(1, os.path.join(sys.real_prefix, "lib-python", "modified-%s" % cpyver)) + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + # + # This is hardcoded in the Python executable, but relative to sys.prefix: + for path in paths[:]: + plat_path = os.path.join(path, "plat-%s" % sys.platform) + if os.path.exists(plat_path): + paths.append(plat_path) + elif sys.platform == "win32": + paths = [os.path.join(sys.real_prefix, "Lib"), os.path.join(sys.real_prefix, "DLLs")] + else: + paths = [os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3])] + hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below + lib64_path = os.path.join(sys.real_prefix, "lib64", "python" + sys.version[:3]) + if os.path.exists(lib64_path): + if _is_64bit: + paths.insert(0, lib64_path) + else: + paths.append(lib64_path) + # This is hardcoded in the Python executable, but relative to + # sys.prefix. Debian change: we need to add the multiarch triplet + # here, which is where the real stuff lives. As per PEP 421, in + # Python 3.3+, this lives in sys.implementation, while in Python 2.7 + # it lives in sys. + try: + arch = getattr(sys, "implementation", sys)._multiarch + except AttributeError: + # This is a non-multiarch aware Python. Fallback to the old way. + arch = sys.platform + plat_path = os.path.join(sys.real_prefix, "lib", "python" + sys.version[:3], "plat-%s" % arch) + if os.path.exists(plat_path): + paths.append(plat_path) + # This is hardcoded in the Python executable, but + # relative to sys.prefix, so we have to fix up: + for path in list(paths): + tk_dir = os.path.join(path, "lib-tk") + if os.path.exists(tk_dir): + paths.append(tk_dir) + + # These are hardcoded in the Apple's Python executable, + # but relative to sys.prefix, so we have to fix them up: + if sys.platform == "darwin": + hardcoded_paths = [ + os.path.join(relative_dir, module) + for relative_dir in hardcoded_relative_dirs + for module in ("plat-darwin", "plat-mac", "plat-mac/lib-scriptpackages") + ] + + for path in hardcoded_paths: + if os.path.exists(path): + paths.append(path) + + sys.path.extend(paths) + + +def force_global_eggs_after_local_site_packages(): + """ + Force easy_installed eggs in the global environment to get placed + in sys.path after all packages inside the virtualenv. This + maintains the "least surprise" result that packages in the + virtualenv always mask global packages, never the other way + around. + + """ + egginsert = getattr(sys, "__egginsert", 0) + for i, path in enumerate(sys.path): + if i > egginsert and path.startswith(sys.prefix): + egginsert = i + sys.__egginsert = egginsert + 1 + + +def virtual_addsitepackages(known_paths): + force_global_eggs_after_local_site_packages() + return addsitepackages(known_paths, sys_prefix=sys.real_prefix) + + +def execusercustomize(): + """Run custom user specific code, if available.""" + try: + import usercustomize + except ImportError: + pass + + +def enablerlcompleter(): + """Enable default readline configuration on interactive prompts, by + registering a sys.__interactivehook__. + If the readline module can be imported, the hook will set the Tab key + as completion key and register ~/.python_history as history file. + This can be overridden in the sitecustomize or usercustomize module, + or in a PYTHONSTARTUP file. + """ + + def register_readline(): + import atexit + + try: + import readline + import rlcompleter + except ImportError: + return + + # Reading the initialization (config) file may not be enough to set a + # completion key, so we set one first and then read the file. + readline_doc = getattr(readline, "__doc__", "") + if readline_doc is not None and "libedit" in readline_doc: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab: complete") + + try: + readline.read_init_file() + except OSError: + # An OSError here could have many causes, but the most likely one + # is that there's no .inputrc file (or .editrc file in the case of + # Mac OS X + libedit) in the expected location. In that case, we + # want to ignore the exception. + pass + + if readline.get_current_history_length() == 0: + # If no history was loaded, default to .python_history. + # The guard is necessary to avoid doubling history size at + # each interpreter exit when readline was already configured + # through a PYTHONSTARTUP hook, see: + # http://bugs.python.org/issue5845#msg198636 + history = os.path.join(os.path.expanduser("~"), ".python_history") + try: + readline.read_history_file(history) + except OSError: + pass + + def write_history(): + try: + readline.write_history_file(history) + except (FileNotFoundError, PermissionError): + # home directory does not exist or is not writable + # https://bugs.python.org/issue19891 + pass + + atexit.register(write_history) + + sys.__interactivehook__ = register_readline + + +if _is_pypy: + + def import_builtin_stuff(): + """PyPy specific: some built-in modules should be pre-imported because + some programs expect them to be in sys.modules on startup. This is ported + from PyPy's site.py. + """ + import encodings + + if "exceptions" in sys.builtin_module_names: + import exceptions + + if "zipimport" in sys.builtin_module_names: + import zipimport + + +def main(): + global ENABLE_USER_SITE + virtual_install_main_packages() + if _is_pypy: + import_builtin_stuff() + abs__file__() + paths_in_sys = removeduppaths() + if os.name == "posix" and sys.path and os.path.basename(sys.path[-1]) == "Modules": + addbuilddir() + GLOBAL_SITE_PACKAGES = not os.path.exists(os.path.join(os.path.dirname(__file__), "no-global-site-packages.txt")) + if not GLOBAL_SITE_PACKAGES: + ENABLE_USER_SITE = False + if ENABLE_USER_SITE is None: + ENABLE_USER_SITE = check_enableusersite() + paths_in_sys = addsitepackages(paths_in_sys) + paths_in_sys = addusersitepackages(paths_in_sys) + if GLOBAL_SITE_PACKAGES: + paths_in_sys = virtual_addsitepackages(paths_in_sys) + if sys.platform == "os2emx": + setBEGINLIBPATH() + setquit() + setcopyright() + sethelper() + if sys.version_info[0] == 3: + enablerlcompleter() + aliasmbcs() + setencoding() + execsitecustomize() + if ENABLE_USER_SITE: + execusercustomize() + # Remove sys.setdefaultencoding() so that users cannot change the + # encoding after initialization. The test for presence is needed when + # this module is run as a script, because this code is executed twice. + if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + + +main() + + +def _script(): + help = """\ + %s [--user-base] [--user-site] + + Without arguments print some useful information + With arguments print the value of USER_BASE and/or USER_SITE separated + by '%s'. + + Exit codes with --user-base or --user-site: + 0 - user site directory is enabled + 1 - user site directory is disabled by user + 2 - uses site directory is disabled by super user + or for security reasons + >2 - unknown error + """ + args = sys.argv[1:] + if not args: + print("sys.path = [") + for dir in sys.path: + print(" {!r},".format(dir)) + print("]") + + def exists(path): + if os.path.isdir(path): + return "exists" + else: + return "doesn't exist" + + print("USER_BASE: {!r} ({})".format(USER_BASE, exists(USER_BASE))) + print("USER_SITE: {!r} ({})".format(USER_SITE, exists(USER_SITE))) + print("ENABLE_USER_SITE: %r" % ENABLE_USER_SITE) + sys.exit(0) + + buffer = [] + if "--user-base" in args: + buffer.append(USER_BASE) + if "--user-site" in args: + buffer.append(USER_SITE) + + if buffer: + print(os.pathsep.join(buffer)) + if ENABLE_USER_SITE: + sys.exit(0) + elif ENABLE_USER_SITE is False: + sys.exit(1) + elif ENABLE_USER_SITE is None: + sys.exit(2) + else: + sys.exit(3) + else: + import textwrap + + print(textwrap.dedent(help % (sys.argv[0], os.pathsep))) + sys.exit(10) + + +if __name__ == "__main__": + _script() diff --git a/backend/venv/venv/lib/python3.7/sre_compile.py b/backend/venv/venv/lib/python3.7/sre_compile.py new file mode 120000 index 0000000..25b2b1a --- /dev/null +++ b/backend/venv/venv/lib/python3.7/sre_compile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_compile.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/sre_constants.py b/backend/venv/venv/lib/python3.7/sre_constants.py new file mode 120000 index 0000000..adacba3 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/sre_constants.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_constants.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/sre_parse.py b/backend/venv/venv/lib/python3.7/sre_parse.py new file mode 120000 index 0000000..a2167c0 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/sre_parse.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sre_parse.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/stat.py b/backend/venv/venv/lib/python3.7/stat.py new file mode 120000 index 0000000..2cb392c --- /dev/null +++ b/backend/venv/venv/lib/python3.7/stat.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/stat.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/struct.py b/backend/venv/venv/lib/python3.7/struct.py new file mode 120000 index 0000000..8c93f91 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/struct.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/struct.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/tarfile.py b/backend/venv/venv/lib/python3.7/tarfile.py new file mode 120000 index 0000000..374c697 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/tarfile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tarfile.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/tempfile.py b/backend/venv/venv/lib/python3.7/tempfile.py new file mode 120000 index 0000000..565f61f --- /dev/null +++ b/backend/venv/venv/lib/python3.7/tempfile.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tempfile.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/token.py b/backend/venv/venv/lib/python3.7/token.py new file mode 120000 index 0000000..87ee559 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/token.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/token.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/tokenize.py b/backend/venv/venv/lib/python3.7/tokenize.py new file mode 120000 index 0000000..c57893e --- /dev/null +++ b/backend/venv/venv/lib/python3.7/tokenize.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tokenize.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/types.py b/backend/venv/venv/lib/python3.7/types.py new file mode 120000 index 0000000..c400877 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/types.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/types.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/warnings.py b/backend/venv/venv/lib/python3.7/warnings.py new file mode 120000 index 0000000..d4104e4 --- /dev/null +++ b/backend/venv/venv/lib/python3.7/warnings.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/warnings.py \ No newline at end of file diff --git a/backend/venv/venv/lib/python3.7/weakref.py b/backend/venv/venv/lib/python3.7/weakref.py new file mode 120000 index 0000000..4e646aa --- /dev/null +++ b/backend/venv/venv/lib/python3.7/weakref.py @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/weakref.py \ No newline at end of file diff --git a/dist/datasets/breast-cancer-wisconsin.csv b/dist/datasets/breast-cancer-wisconsin.csv new file mode 100644 index 0000000..73cdb56 --- /dev/null +++ b/dist/datasets/breast-cancer-wisconsin.csv @@ -0,0 +1,700 @@ +id;clump_thic;size_un;shape_un;marg_adh;epith_size;bare_nuc;bland_chr;nor_nuc;mitoses;class* +1000025;5;1;1;1;2;1;3;1;1;Benign +1002945;5;4;4;5;7;10;3;2;1;Benign +1015425;3;1;1;1;2;2;3;1;1;Benign +1016277;6;8;8;1;3;4;3;7;1;Benign +1017023;4;1;1;3;2;1;3;1;1;Benign +1017122;8;10;10;8;7;10;9;7;1;Malignant +1018099;1;1;1;1;2;10;3;1;1;Benign +1018561;2;1;2;1;2;1;3;1;1;Benign +1033078;2;1;1;1;2;1;1;1;5;Benign +1033078;4;2;1;1;2;1;2;1;1;Benign +1035283;1;1;1;1;1;1;3;1;1;Benign +1036172;2;1;1;1;2;1;2;1;1;Benign +1041801;5;3;3;3;2;3;4;4;1;Malignant +1043999;1;1;1;1;2;3;3;1;1;Benign +1044572;8;7;5;10;7;9;5;5;4;Malignant +1047630;7;4;6;4;6;1;4;3;1;Malignant +1048672;4;1;1;1;2;1;2;1;1;Benign +1049815;4;1;1;1;2;1;3;1;1;Benign +1050670;10;7;7;6;4;10;4;1;2;Malignant +1050718;6;1;1;1;2;1;3;1;1;Benign +1054590;7;3;2;10;5;10;5;4;4;Malignant +1054593;10;5;5;3;6;7;7;10;1;Malignant +1056784;3;1;1;1;2;1;2;1;1;Benign +1057013;8;4;5;1;2;4;7;3;1;Malignant +1059552;1;1;1;1;2;1;3;1;1;Benign +1065726;5;2;3;4;2;7;3;6;1;Malignant +1066373;3;2;1;1;1;1;2;1;1;Benign +1066979;5;1;1;1;2;1;2;1;1;Benign +1067444;2;1;1;1;2;1;2;1;1;Benign +1070935;1;1;3;1;2;1;1;1;1;Benign +1070935;3;1;1;1;1;1;2;1;1;Benign +1071760;2;1;1;1;2;1;3;1;1;Benign +1072179;10;7;7;3;8;5;7;4;3;Malignant +1074610;2;1;1;2;2;1;3;1;1;Benign +1075123;3;1;2;1;2;1;2;1;1;Benign +1079304;2;1;1;1;2;1;2;1;1;Benign +1080185;10;10;10;8;6;1;8;9;1;Malignant +1081791;6;2;1;1;1;1;7;1;1;Benign +1084584;5;4;4;9;2;10;5;6;1;Malignant +1091262;2;5;3;3;6;7;7;5;1;Malignant +1096800;6;6;6;9;6;4;7;8;1;Benign +1099510;10;4;3;1;3;3;6;5;2;Malignant +1100524;6;10;10;2;8;10;7;3;3;Malignant +1102573;5;6;5;6;10;1;3;1;1;Malignant +1103608;10;10;10;4;8;1;8;10;1;Malignant +1103722;1;1;1;1;2;1;2;1;2;Benign +1105257;3;7;7;4;4;9;4;8;1;Malignant +1105524;1;1;1;1;2;1;2;1;1;Benign +1106095;4;1;1;3;2;1;3;1;1;Benign +1106829;7;8;7;2;4;8;3;8;2;Malignant +1108370;9;5;8;1;2;3;2;1;5;Malignant +1108449;5;3;3;4;2;4;3;4;1;Malignant +1110102;10;3;6;2;3;5;4;10;2;Malignant +1110503;5;5;5;8;10;8;7;3;7;Malignant +1110524;10;5;5;6;8;8;7;1;1;Malignant +1111249;10;6;6;3;4;5;3;6;1;Malignant +1112209;8;10;10;1;3;6;3;9;1;Malignant +1113038;8;2;4;1;5;1;5;4;4;Malignant +1113483;5;2;3;1;6;10;5;1;1;Malignant +1113906;9;5;5;2;2;2;5;1;1;Malignant +1115282;5;3;5;5;3;3;4;10;1;Malignant +1115293;1;1;1;1;2;2;2;1;1;Benign +1116116;9;10;10;1;10;8;3;3;1;Malignant +1116132;6;3;4;1;5;2;3;9;1;Malignant +1116192;1;1;1;1;2;1;2;1;1;Benign +1116998;10;4;2;1;3;2;4;3;10;Malignant +1117152;4;1;1;1;2;1;3;1;1;Benign +1118039;5;3;4;1;8;10;4;9;1;Malignant +1120559;8;3;8;3;4;9;8;9;8;Malignant +1121732;1;1;1;1;2;1;3;2;1;Benign +1121919;5;1;3;1;2;1;2;1;1;Benign +1123061;6;10;2;8;10;2;7;8;10;Malignant +1124651;1;3;3;2;2;1;7;2;1;Benign +1125035;9;4;5;10;6;10;4;8;1;Malignant +1126417;10;6;4;1;3;4;3;2;3;Malignant +1131294;1;1;2;1;2;2;4;2;1;Benign +1132347;1;1;4;1;2;1;2;1;1;Benign +1133041;5;3;1;2;2;1;2;1;1;Benign +1133136;3;1;1;1;2;3;3;1;1;Benign +1136142;2;1;1;1;3;1;2;1;1;Benign +1137156;2;2;2;1;1;1;7;1;1;Benign +1143978;4;1;1;2;2;1;2;1;1;Benign +1143978;5;2;1;1;2;1;3;1;1;Benign +1147044;3;1;1;1;2;2;7;1;1;Benign +1147699;3;5;7;8;8;9;7;10;7;Malignant +1147748;5;10;6;1;10;4;4;10;10;Malignant +1148278;3;3;6;4;5;8;4;4;1;Malignant +1148873;3;6;6;6;5;10;6;8;3;Malignant +1152331;4;1;1;1;2;1;3;1;1;Benign +1155546;2;1;1;2;3;1;2;1;1;Benign +1156272;1;1;1;1;2;1;3;1;1;Benign +1156948;3;1;1;2;2;1;1;1;1;Benign +1157734;4;1;1;1;2;1;3;1;1;Benign +1158247;1;1;1;1;2;1;2;1;1;Benign +1160476;2;1;1;1;2;1;3;1;1;Benign +1164066;1;1;1;1;2;1;3;1;1;Benign +1165297;2;1;1;2;2;1;1;1;1;Benign +1165790;5;1;1;1;2;1;3;1;1;Benign +1165926;9;6;9;2;10;6;2;9;10;Malignant +1166630;7;5;6;10;5;10;7;9;4;Malignant +1166654;10;3;5;1;10;5;3;10;2;Malignant +1167439;2;3;4;4;2;5;2;5;1;Malignant +1167471;4;1;2;1;2;1;3;1;1;Benign +1168359;8;2;3;1;6;3;7;1;1;Malignant +1168736;10;10;10;10;10;1;8;8;8;Malignant +1169049;7;3;4;4;3;3;3;2;7;Malignant +1170419;10;10;10;8;2;10;4;1;1;Malignant +1170420;1;6;8;10;8;10;5;7;1;Malignant +1171710;1;1;1;1;2;1;2;3;1;Benign +1171710;6;5;4;4;3;9;7;8;3;Malignant +1171795;1;3;1;2;2;2;5;3;2;Benign +1171845;8;6;4;3;5;9;3;1;1;Malignant +1172152;10;3;3;10;2;10;7;3;3;Malignant +1173216;10;10;10;3;10;8;8;1;1;Malignant +1173235;3;3;2;1;2;3;3;1;1;Benign +1173347;1;1;1;1;2;5;1;1;1;Benign +1173347;8;3;3;1;2;2;3;2;1;Benign +1173509;4;5;5;10;4;10;7;5;8;Malignant +1173514;1;1;1;1;4;3;1;1;1;Benign +1173681;3;2;1;1;2;2;3;1;1;Benign +1174057;1;1;2;2;2;1;3;1;1;Benign +1174057;4;2;1;1;2;2;3;1;1;Benign +1174131;10;10;10;2;10;10;5;3;3;Malignant +1174428;5;3;5;1;8;10;5;3;1;Malignant +1175937;5;4;6;7;9;7;8;10;1;Malignant +1176406;1;1;1;1;2;1;2;1;1;Benign +1176881;7;5;3;7;4;10;7;5;5;Malignant +1177027;3;1;1;1;2;1;3;1;1;Benign +1177399;8;3;5;4;5;10;1;6;2;Malignant +1177512;1;1;1;1;10;1;1;1;1;Benign +1178580;5;1;3;1;2;1;2;1;1;Benign +1179818;2;1;1;1;2;1;3;1;1;Benign +1180194;5;10;8;10;8;10;3;6;3;Malignant +1180523;3;1;1;1;2;1;2;2;1;Benign +1180831;3;1;1;1;3;1;2;1;1;Benign +1181356;5;1;1;1;2;2;3;3;1;Benign +1182404;4;1;1;1;2;1;2;1;1;Benign +1182410;3;1;1;1;2;1;1;1;1;Benign +1183240;4;1;2;1;2;1;2;1;1;Benign +1183246;1;1;1;1;1;4;2;1;1;Benign +1183516;3;1;1;1;2;1;1;1;1;Benign +1183911;2;1;1;1;2;1;1;1;1;Benign +1183983;9;5;5;4;4;5;4;3;3;Malignant +1184184;1;1;1;1;2;5;1;1;1;Benign +1184241;2;1;1;1;2;1;2;1;1;Benign +1184840;1;1;3;1;2;4;2;1;1;Benign +1185609;3;4;5;2;6;8;4;1;1;Malignant +1185610;1;1;1;1;3;2;2;1;1;Benign +1187457;3;1;1;3;8;1;5;8;1;Benign +1187805;8;8;7;4;10;10;7;8;7;Malignant +1188472;1;1;1;1;1;1;3;1;1;Benign +1189266;7;2;4;1;6;10;5;4;3;Malignant +1189286;10;10;8;6;4;5;8;10;1;Malignant +1190394;4;1;1;1;2;3;1;1;1;Benign +1190485;1;1;1;1;2;1;1;1;1;Benign +1192325;5;5;5;6;3;10;3;1;1;Malignant +1193091;1;2;2;1;2;1;2;1;1;Benign +1193210;2;1;1;1;2;1;3;1;1;Benign +1193683;1;1;2;1;3;4;1;1;1;Benign +1196295;9;9;10;3;6;10;7;10;6;Malignant +1196915;10;7;7;4;5;10;5;7;2;Malignant +1197080;4;1;1;1;2;1;3;2;1;Benign +1197270;3;1;1;1;2;1;3;1;1;Benign +1197440;1;1;1;2;1;3;1;1;7;Benign +1197510;5;1;1;1;2;4;3;1;1;Benign +1197979;4;1;1;1;2;2;3;2;1;Benign +1197993;5;6;7;8;8;10;3;10;3;Malignant +1198128;10;8;10;10;6;1;3;1;10;Malignant +1198641;3;1;1;1;2;1;3;1;1;Benign +1199219;1;1;1;2;1;1;1;1;1;Benign +1199731;3;1;1;1;2;1;1;1;1;Benign +1199983;1;1;1;1;2;1;3;1;1;Benign +1200772;1;1;1;1;2;1;2;1;1;Benign +1200847;6;10;10;10;8;10;10;10;7;Malignant +1200892;8;6;5;4;3;10;6;1;1;Malignant +1200952;5;8;7;7;10;10;5;7;1;Malignant +1201834;2;1;1;1;2;1;3;1;1;Benign +1201936;5;10;10;3;8;1;5;10;3;Malignant +1202125;4;1;1;1;2;1;3;1;1;Benign +1202812;5;3;3;3;6;10;3;1;1;Malignant +1203096;1;1;1;1;1;1;3;1;1;Benign +1204242;1;1;1;1;2;1;1;1;1;Benign +1204898;6;1;1;1;2;1;3;1;1;Benign +1205138;5;8;8;8;5;10;7;8;1;Malignant +1205579;8;7;6;4;4;10;5;1;1;Malignant +1206089;2;1;1;1;1;1;3;1;1;Benign +1206695;1;5;8;6;5;8;7;10;1;Malignant +1206841;10;5;6;10;6;10;7;7;10;Malignant +1207986;5;8;4;10;5;8;9;10;1;Malignant +1208301;1;2;3;1;2;1;3;1;1;Benign +1210963;10;10;10;8;6;8;7;10;1;Malignant +1211202;7;5;10;10;10;10;4;10;3;Malignant +1212232;5;1;1;1;2;1;2;1;1;Benign +1212251;1;1;1;1;2;1;3;1;1;Benign +1212422;3;1;1;1;2;1;3;1;1;Benign +1212422;4;1;1;1;2;1;3;1;1;Benign +1213375;8;4;4;5;4;7;7;8;2;Benign +1213383;5;1;1;4;2;1;3;1;1;Benign +1214092;1;1;1;1;2;1;1;1;1;Benign +1214556;3;1;1;1;2;1;2;1;1;Benign +1214966;9;7;7;5;5;10;7;8;3;Malignant +1216694;10;8;8;4;10;10;8;1;1;Malignant +1216947;1;1;1;1;2;1;3;1;1;Benign +1217051;5;1;1;1;2;1;3;1;1;Benign +1217264;1;1;1;1;2;1;3;1;1;Benign +1218105;5;10;10;9;6;10;7;10;5;Malignant +1218741;10;10;9;3;7;5;3;5;1;Malignant +1218860;1;1;1;1;1;1;3;1;1;Benign +1218860;1;1;1;1;1;1;3;1;1;Benign +1219406;5;1;1;1;1;1;3;1;1;Benign +1219525;8;10;10;10;5;10;8;10;6;Malignant +1219859;8;10;8;8;4;8;7;7;1;Malignant +1220330;1;1;1;1;2;1;3;1;1;Benign +1221863;10;10;10;10;7;10;7;10;4;Malignant +1222047;10;10;10;10;3;10;10;6;1;Malignant +1222936;8;7;8;7;5;5;5;10;2;Malignant +1223282;1;1;1;1;2;1;2;1;1;Benign +1223426;1;1;1;1;2;1;3;1;1;Benign +1223793;6;10;7;7;6;4;8;10;2;Malignant +1223967;6;1;3;1;2;1;3;1;1;Benign +1224329;1;1;1;2;2;1;3;1;1;Benign +1225799;10;6;4;3;10;10;9;10;1;Malignant +1226012;4;1;1;3;1;5;2;1;1;Malignant +1226612;7;5;6;3;3;8;7;4;1;Malignant +1227210;10;5;5;6;3;10;7;9;2;Malignant +1227244;1;1;1;1;2;1;2;1;1;Benign +1227481;10;5;7;4;4;10;8;9;1;Malignant +1228152;8;9;9;5;3;5;7;7;1;Malignant +1228311;1;1;1;1;1;1;3;1;1;Benign +1230175;10;10;10;3;10;10;9;10;1;Malignant +1230688;7;4;7;4;3;7;7;6;1;Malignant +1231387;6;8;7;5;6;8;8;9;2;Malignant +1231706;8;4;6;3;3;1;4;3;1;Benign +1232225;10;4;5;5;5;10;4;1;1;Malignant +1236043;3;3;2;1;3;1;3;6;1;Benign +1241232;3;1;4;1;2;4;3;1;1;Benign +1241559;10;8;8;2;8;10;4;8;10;Malignant +1241679;9;8;8;5;6;2;4;10;4;Malignant +1242364;8;10;10;8;6;9;3;10;10;Malignant +1243256;10;4;3;2;3;10;5;3;2;Malignant +1270479;5;1;3;3;2;2;2;3;1;Benign +1276091;3;1;1;3;1;1;3;1;1;Benign +1277018;2;1;1;1;2;1;3;1;1;Benign +128059;1;1;1;1;2;5;5;1;1;Benign +1285531;1;1;1;1;2;1;3;1;1;Benign +1287775;5;1;1;2;2;2;3;1;1;Benign +144888;8;10;10;8;5;10;7;8;1;Malignant +145447;8;4;4;1;2;9;3;3;1;Malignant +167528;4;1;1;1;2;1;3;6;1;Benign +169356;3;1;1;1;2;4;3;1;1;Benign +183913;1;2;2;1;2;1;1;1;1;Benign +191250;10;4;4;10;2;10;5;3;3;Malignant +1017023;6;3;3;5;3;10;3;5;3;Benign +1100524;6;10;10;2;8;10;7;3;3;Malignant +1116116;9;10;10;1;10;8;3;3;1;Malignant +1168736;5;6;6;2;4;10;3;6;1;Malignant +1182404;3;1;1;1;2;1;1;1;1;Benign +1182404;3;1;1;1;2;1;2;1;1;Benign +1198641;3;1;1;1;2;1;3;1;1;Benign +242970;5;7;7;1;5;8;3;4;1;Benign +255644;10;5;8;10;3;10;5;1;3;Malignant +263538;5;10;10;6;10;10;10;6;5;Malignant +274137;8;8;9;4;5;10;7;8;1;Malignant +303213;10;4;4;10;6;10;5;5;1;Malignant +314428;7;9;4;10;10;3;5;3;3;Malignant +1182404;5;1;4;1;2;1;3;2;1;Benign +1198641;10;10;6;3;3;10;4;3;2;Malignant +320675;3;3;5;2;3;10;7;1;1;Malignant +324427;10;8;8;2;3;4;8;7;8;Malignant +385103;1;1;1;1;2;1;3;1;1;Benign +390840;8;4;7;1;3;10;3;9;2;Malignant +411453;5;1;1;1;2;1;3;1;1;Benign +320675;3;3;5;2;3;10;7;1;1;Malignant +428903;7;2;4;1;3;4;3;3;1;Malignant +431495;3;1;1;1;2;1;3;2;1;Benign +432809;3;1;3;1;2;4;2;1;1;Benign +434518;3;1;1;1;2;1;2;1;1;Benign +452264;1;1;1;1;2;1;2;1;1;Benign +456282;1;1;1;1;2;1;3;1;1;Benign +476903;10;5;7;3;3;7;3;3;8;Malignant +486283;3;1;1;1;2;1;3;1;1;Benign +486662;2;1;1;2;2;1;3;1;1;Benign +488173;1;4;3;10;4;10;5;6;1;Malignant +492268;10;4;6;1;2;10;5;3;1;Malignant +508234;7;4;5;10;2;10;3;8;2;Malignant +527363;8;10;10;10;8;10;10;7;3;Malignant +529329;10;10;10;10;10;10;4;10;10;Malignant +535331;3;1;1;1;3;1;2;1;1;Benign +543558;6;1;3;1;4;5;5;10;1;Malignant +555977;5;6;6;8;6;10;4;10;4;Malignant +560680;1;1;1;1;2;1;1;1;1;Benign +561477;1;1;1;1;2;1;3;1;1;Benign +563649;8;8;8;1;2;4;6;10;1;Malignant +601265;10;4;4;6;2;10;2;3;1;Malignant +606140;1;1;1;1;2;4;2;1;1;Benign +606722;5;5;7;8;6;10;7;4;1;Malignant +616240;5;3;4;3;4;5;4;7;1;Benign +61634;5;4;3;1;2;4;2;3;1;Benign +625201;8;2;1;1;5;1;1;1;1;Benign +63375;9;1;2;6;4;10;7;7;2;Malignant +635844;8;4;10;5;4;4;7;10;1;Malignant +636130;1;1;1;1;2;1;3;1;1;Benign +640744;10;10;10;7;9;10;7;10;10;Malignant +646904;1;1;1;1;2;1;3;1;1;Benign +653777;8;3;4;9;3;10;3;3;1;Malignant +659642;10;8;4;4;4;10;3;10;4;Malignant +666090;1;1;1;1;2;1;3;1;1;Benign +666942;1;1;1;1;2;1;3;1;1;Benign +667204;7;8;7;6;4;3;8;8;4;Malignant +673637;3;1;1;1;2;5;5;1;1;Benign +684955;2;1;1;1;3;1;2;1;1;Benign +688033;1;1;1;1;2;1;1;1;1;Benign +691628;8;6;4;10;10;1;3;5;1;Malignant +693702;1;1;1;1;2;1;1;1;1;Benign +704097;1;1;1;1;1;1;2;1;1;Benign +704168;4;6;5;6;7;4;4;9;1;Benign +706426;5;5;5;2;5;10;4;3;1;Malignant +709287;6;8;7;8;6;8;8;9;1;Malignant +718641;1;1;1;1;5;1;3;1;1;Benign +721482;4;4;4;4;6;5;7;3;1;Benign +730881;7;6;3;2;5;10;7;4;6;Malignant +733639;3;1;1;1;2;4;3;1;1;Benign +733639;3;1;1;1;2;1;3;1;1;Benign +733823;5;4;6;10;2;10;4;1;1;Malignant +740492;1;1;1;1;2;1;3;1;1;Benign +743348;3;2;2;1;2;1;2;3;1;Benign +752904;10;1;1;1;2;10;5;4;1;Malignant +756136;1;1;1;1;2;1;2;1;1;Benign +760001;8;10;3;2;6;4;3;10;1;Malignant +760239;10;4;6;4;5;10;7;1;1;Malignant +76389;10;4;7;2;2;8;6;1;1;Malignant +764974;5;1;1;1;2;1;3;1;2;Benign +770066;5;2;2;2;2;1;2;2;1;Benign +785208;5;4;6;6;4;10;4;3;1;Malignant +785615;8;6;7;3;3;10;3;4;2;Malignant +792744;1;1;1;1;2;1;1;1;1;Benign +797327;6;5;5;8;4;10;3;4;1;Malignant +798429;1;1;1;1;2;1;3;1;1;Benign +704097;1;1;1;1;1;1;2;1;1;Benign +806423;8;5;5;5;2;10;4;3;1;Malignant +809912;10;3;3;1;2;10;7;6;1;Malignant +810104;1;1;1;1;2;1;3;1;1;Benign +814265;2;1;1;1;2;1;1;1;1;Benign +814911;1;1;1;1;2;1;1;1;1;Benign +822829;7;6;4;8;10;10;9;5;3;Malignant +826923;1;1;1;1;2;1;1;1;1;Benign +830690;5;2;2;2;3;1;1;3;1;Benign +831268;1;1;1;1;1;1;1;3;1;Benign +832226;3;4;4;10;5;1;3;3;1;Malignant +832567;4;2;3;5;3;8;7;6;1;Malignant +836433;5;1;1;3;2;1;1;1;1;Benign +837082;2;1;1;1;2;1;3;1;1;Benign +846832;3;4;5;3;7;3;4;6;1;Benign +850831;2;7;10;10;7;10;4;9;4;Malignant +855524;1;1;1;1;2;1;2;1;1;Benign +857774;4;1;1;1;3;1;2;2;1;Benign +859164;5;3;3;1;3;3;3;3;3;Malignant +859350;8;10;10;7;10;10;7;3;8;Malignant +866325;8;10;5;3;8;4;4;10;3;Malignant +873549;10;3;5;4;3;7;3;5;3;Malignant +877291;6;10;10;10;10;10;8;10;10;Malignant +877943;3;10;3;10;6;10;5;1;4;Malignant +888169;3;2;2;1;4;3;2;1;1;Benign +888523;4;4;4;2;2;3;2;1;1;Benign +896404;2;1;1;1;2;1;3;1;1;Benign +897172;2;1;1;1;2;1;2;1;1;Benign +95719;6;10;10;10;8;10;7;10;7;Malignant +160296;5;8;8;10;5;10;8;10;3;Malignant +342245;1;1;3;1;2;1;1;1;1;Benign +428598;1;1;3;1;1;1;2;1;1;Benign +492561;4;3;2;1;3;1;2;1;1;Benign +493452;1;1;3;1;2;1;1;1;1;Benign +493452;4;1;2;1;2;1;2;1;1;Benign +521441;5;1;1;2;2;1;2;1;1;Benign +560680;3;1;2;1;2;1;2;1;1;Benign +636437;1;1;1;1;2;1;1;1;1;Benign +640712;1;1;1;1;2;1;2;1;1;Benign +654244;1;1;1;1;1;1;2;1;1;Benign +657753;3;1;1;4;3;1;2;2;1;Benign +685977;5;3;4;1;4;1;3;1;1;Benign +805448;1;1;1;1;2;1;1;1;1;Benign +846423;10;6;3;6;4;10;7;8;4;Malignant +1002504;3;2;2;2;2;1;3;2;1;Benign +1022257;2;1;1;1;2;1;1;1;1;Benign +1026122;2;1;1;1;2;1;1;1;1;Benign +1071084;3;3;2;2;3;1;1;2;3;Benign +1080233;7;6;6;3;2;10;7;1;1;Malignant +1114570;5;3;3;2;3;1;3;1;1;Benign +1114570;2;1;1;1;2;1;2;2;1;Benign +1116715;5;1;1;1;3;2;2;2;1;Benign +1131411;1;1;1;2;2;1;2;1;1;Benign +1151734;10;8;7;4;3;10;7;9;1;Malignant +1156017;3;1;1;1;2;1;2;1;1;Benign +1158247;1;1;1;1;1;1;1;1;1;Benign +1158405;1;2;3;1;2;1;2;1;1;Benign +1168278;3;1;1;1;2;1;2;1;1;Benign +1176187;3;1;1;1;2;1;3;1;1;Benign +1196263;4;1;1;1;2;1;1;1;1;Benign +1196475;3;2;1;1;2;1;2;2;1;Benign +1206314;1;2;3;1;2;1;1;1;1;Benign +1211265;3;10;8;7;6;9;9;3;8;Malignant +1213784;3;1;1;1;2;1;1;1;1;Benign +1223003;5;3;3;1;2;1;2;1;1;Benign +1223306;3;1;1;1;2;4;1;1;1;Benign +1223543;1;2;1;3;2;1;1;2;1;Benign +1229929;1;1;1;1;2;1;2;1;1;Benign +1231853;4;2;2;1;2;1;2;1;1;Benign +1234554;1;1;1;1;2;1;2;1;1;Benign +1236837;2;3;2;2;2;2;3;1;1;Benign +1237674;3;1;2;1;2;1;2;1;1;Benign +1238021;1;1;1;1;2;1;2;1;1;Benign +1238464;1;1;1;1;1;4;2;1;1;Benign +1238633;10;10;10;6;8;4;8;5;1;Malignant +1238915;5;1;2;1;2;1;3;1;1;Benign +1238948;8;5;6;2;3;10;6;6;1;Malignant +1239232;3;3;2;6;3;3;3;5;1;Benign +1239347;8;7;8;5;10;10;7;2;1;Malignant +1239967;1;1;1;1;2;1;2;1;1;Benign +1240337;5;2;2;2;2;2;3;2;2;Benign +1253505;2;3;1;1;5;1;1;1;1;Benign +1255384;3;2;2;3;2;3;3;1;1;Benign +1257200;10;10;10;7;10;10;8;2;1;Malignant +1257648;4;3;3;1;2;1;3;3;1;Benign +1257815;5;1;3;1;2;1;2;1;1;Benign +1257938;3;1;1;1;2;1;1;1;1;Benign +1258549;9;10;10;10;10;10;10;10;1;Malignant +1258556;5;3;6;1;2;1;1;1;1;Benign +1266154;8;7;8;2;4;2;5;10;1;Malignant +1272039;1;1;1;1;2;1;2;1;1;Benign +1276091;2;1;1;1;2;1;2;1;1;Benign +1276091;1;3;1;1;2;1;2;2;1;Benign +1276091;5;1;1;3;4;1;3;2;1;Benign +1277629;5;1;1;1;2;1;2;2;1;Benign +1293439;3;2;2;3;2;1;1;1;1;Benign +1293439;6;9;7;5;5;8;4;2;1;Benign +1294562;10;8;10;1;3;10;5;1;1;Malignant +1295186;10;10;10;1;6;1;2;8;1;Malignant +527337;4;1;1;1;2;1;1;1;1;Benign +558538;4;1;3;3;2;1;1;1;1;Benign +566509;5;1;1;1;2;1;1;1;1;Benign +608157;10;4;3;10;4;10;10;1;1;Malignant +677910;5;2;2;4;2;4;1;1;1;Benign +734111;1;1;1;3;2;3;1;1;1;Benign +734111;1;1;1;1;2;2;1;1;1;Benign +780555;5;1;1;6;3;1;2;1;1;Benign +827627;2;1;1;1;2;1;1;1;1;Benign +1049837;1;1;1;1;2;1;1;1;1;Benign +1058849;5;1;1;1;2;1;1;1;1;Benign +1182404;1;1;1;1;1;1;1;1;1;Benign +1193544;5;7;9;8;6;10;8;10;1;Malignant +1201870;4;1;1;3;1;1;2;1;1;Benign +1202253;5;1;1;1;2;1;1;1;1;Benign +1227081;3;1;1;3;2;1;1;1;1;Benign +1230994;4;5;5;8;6;10;10;7;1;Malignant +1238410;2;3;1;1;3;1;1;1;1;Benign +1246562;10;2;2;1;2;6;1;1;2;Malignant +1257470;10;6;5;8;5;10;8;6;1;Malignant +1259008;8;8;9;6;6;3;10;10;1;Malignant +1266124;5;1;2;1;2;1;1;1;1;Benign +1267898;5;1;3;1;2;1;1;1;1;Benign +1268313;5;1;1;3;2;1;1;1;1;Benign +1268804;3;1;1;1;2;5;1;1;1;Benign +1276091;6;1;1;3;2;1;1;1;1;Benign +1280258;4;1;1;1;2;1;1;2;1;Benign +1293966;4;1;1;1;2;1;1;1;1;Benign +1296572;10;9;8;7;6;4;7;10;3;Malignant +1298416;10;6;6;2;4;10;9;7;1;Malignant +1299596;6;6;6;5;4;10;7;6;2;Malignant +1105524;4;1;1;1;2;1;1;1;1;Benign +1181685;1;1;2;1;2;1;2;1;1;Benign +1211594;3;1;1;1;1;1;2;1;1;Benign +1238777;6;1;1;3;2;1;1;1;1;Benign +1257608;6;1;1;1;1;1;1;1;1;Benign +1269574;4;1;1;1;2;1;1;1;1;Benign +1277145;5;1;1;1;2;1;1;1;1;Benign +1287282;3;1;1;1;2;1;1;1;1;Benign +1296025;4;1;2;1;2;1;1;1;1;Benign +1296263;4;1;1;1;2;1;1;1;1;Benign +1296593;5;2;1;1;2;1;1;1;1;Benign +1299161;4;8;7;10;4;10;7;5;1;Malignant +1301945;5;1;1;1;1;1;1;1;1;Benign +1302428;5;3;2;4;2;1;1;1;1;Benign +1318169;9;10;10;10;10;5;10;10;10;Malignant +474162;8;7;8;5;5;10;9;10;1;Malignant +787451;5;1;2;1;2;1;1;1;1;Benign +1002025;1;1;1;3;1;3;1;1;1;Benign +1070522;3;1;1;1;1;1;2;1;1;Benign +1073960;10;10;10;10;6;10;8;1;5;Malignant +1076352;3;6;4;10;3;3;3;4;1;Malignant +1084139;6;3;2;1;3;4;4;1;1;Malignant +1115293;1;1;1;1;2;1;1;1;1;Benign +1119189;5;8;9;4;3;10;7;1;1;Malignant +1133991;4;1;1;1;1;1;2;1;1;Benign +1142706;5;10;10;10;6;10;6;5;2;Malignant +1155967;5;1;2;10;4;5;2;1;1;Benign +1170945;3;1;1;1;1;1;2;1;1;Benign +1181567;1;1;1;1;1;1;1;1;1;Benign +1182404;4;2;1;1;2;1;1;1;1;Benign +1204558;4;1;1;1;2;1;2;1;1;Benign +1217952;4;1;1;1;2;1;2;1;1;Benign +1224565;6;1;1;1;2;1;3;1;1;Benign +1238186;4;1;1;1;2;1;2;1;1;Benign +1253917;4;1;1;2;2;1;2;1;1;Benign +1265899;4;1;1;1;2;1;3;1;1;Benign +1268766;1;1;1;1;2;1;1;1;1;Benign +1277268;3;3;1;1;2;1;1;1;1;Benign +1286943;8;10;10;10;7;5;4;8;7;Malignant +1295508;1;1;1;1;2;4;1;1;1;Benign +1297327;5;1;1;1;2;1;1;1;1;Benign +1297522;2;1;1;1;2;1;1;1;1;Benign +1298360;1;1;1;1;2;1;1;1;1;Benign +1299924;5;1;1;1;2;1;2;1;1;Benign +1299994;5;1;1;1;2;1;1;1;1;Benign +1304595;3;1;1;1;1;1;2;1;1;Benign +1306282;6;6;7;10;3;10;8;10;2;Malignant +1313325;4;10;4;7;3;10;9;10;1;Malignant +1320077;1;1;1;1;1;1;1;1;1;Benign +1320077;1;1;1;1;1;1;2;1;1;Benign +1320304;3;1;2;2;2;1;1;1;1;Benign +1330439;4;7;8;3;4;10;9;1;1;Malignant +333093;1;1;1;1;3;1;1;1;1;Benign +369565;4;1;1;1;3;1;1;1;1;Benign +412300;10;4;5;4;3;5;7;3;1;Malignant +672113;7;5;6;10;4;10;5;3;1;Malignant +749653;3;1;1;1;2;1;2;1;1;Benign +769612;3;1;1;2;2;1;1;1;1;Benign +769612;4;1;1;1;2;1;1;1;1;Benign +798429;4;1;1;1;2;1;3;1;1;Benign +807657;6;1;3;2;2;1;1;1;1;Benign +8233704;4;1;1;1;1;1;2;1;1;Benign +837480;7;4;4;3;4;10;6;9;1;Malignant +867392;4;2;2;1;2;1;2;1;1;Benign +869828;1;1;1;1;1;1;3;1;1;Benign +1043068;3;1;1;1;2;1;2;1;1;Benign +1056171;2;1;1;1;2;1;2;1;1;Benign +1061990;1;1;3;2;2;1;3;1;1;Benign +1113061;5;1;1;1;2;1;3;1;1;Benign +1116192;5;1;2;1;2;1;3;1;1;Benign +1135090;4;1;1;1;2;1;2;1;1;Benign +1145420;6;1;1;1;2;1;2;1;1;Benign +1158157;5;1;1;1;2;2;2;1;1;Benign +1171578;3;1;1;1;2;1;1;1;1;Benign +1174841;5;3;1;1;2;1;1;1;1;Benign +1184586;4;1;1;1;2;1;2;1;1;Benign +1186936;2;1;3;2;2;1;2;1;1;Benign +1197527;5;1;1;1;2;1;2;1;1;Benign +1222464;6;10;10;10;4;10;7;10;1;Malignant +1240603;2;1;1;1;1;1;1;1;1;Benign +1240603;3;1;1;1;1;1;1;1;1;Benign +1241035;7;8;3;7;4;5;7;8;2;Malignant +1287971;3;1;1;1;2;1;2;1;1;Benign +1289391;1;1;1;1;2;1;3;1;1;Benign +1299924;3;2;2;2;2;1;4;2;1;Benign +1306339;4;4;2;1;2;5;2;1;2;Benign +1313658;3;1;1;1;2;1;1;1;1;Benign +1313982;4;3;1;1;2;1;4;8;1;Benign +1321264;5;2;2;2;1;1;2;1;1;Benign +1321321;5;1;1;3;2;1;1;1;1;Benign +1321348;2;1;1;1;2;1;2;1;1;Benign +1321931;5;1;1;1;2;1;2;1;1;Benign +1321942;5;1;1;1;2;1;3;1;1;Benign +1321942;5;1;1;1;2;1;3;1;1;Benign +1328331;1;1;1;1;2;1;3;1;1;Benign +1328755;3;1;1;1;2;1;2;1;1;Benign +1331405;4;1;1;1;2;1;3;2;1;Benign +1331412;5;7;10;10;5;10;10;10;1;Malignant +1333104;3;1;2;1;2;1;3;1;1;Benign +1334071;4;1;1;1;2;3;2;1;1;Benign +1343068;8;4;4;1;6;10;2;5;2;Malignant +1343374;10;10;8;10;6;5;10;3;1;Malignant +1344121;8;10;4;4;8;10;8;2;1;Malignant +142932;7;6;10;5;3;10;9;10;2;Malignant +183936;3;1;1;1;2;1;2;1;1;Benign +324382;1;1;1;1;2;1;2;1;1;Benign +378275;10;9;7;3;4;2;7;7;1;Malignant +385103;5;1;2;1;2;1;3;1;1;Benign +690557;5;1;1;1;2;1;2;1;1;Benign +695091;1;1;1;1;2;1;2;1;1;Benign +695219;1;1;1;1;2;1;2;1;1;Benign +824249;1;1;1;1;2;1;3;1;1;Benign +871549;5;1;2;1;2;1;2;1;1;Benign +878358;5;7;10;6;5;10;7;5;1;Malignant +1107684;6;10;5;5;4;10;6;10;1;Malignant +1115762;3;1;1;1;2;1;1;1;1;Benign +1217717;5;1;1;6;3;1;1;1;1;Benign +1239420;1;1;1;1;2;1;1;1;1;Benign +1254538;8;10;10;10;6;10;10;10;1;Malignant +1261751;5;1;1;1;2;1;2;2;1;Benign +1268275;9;8;8;9;6;3;4;1;1;Malignant +1272166;5;1;1;1;2;1;1;1;1;Benign +1294261;4;10;8;5;4;1;10;1;1;Malignant +1295529;2;5;7;6;4;10;7;6;1;Malignant +1298484;10;3;4;5;3;10;4;1;1;Malignant +1311875;5;1;2;1;2;1;1;1;1;Benign +1315506;4;8;6;3;4;10;7;1;1;Malignant +1320141;5;1;1;1;2;1;2;1;1;Benign +1325309;4;1;2;1;2;1;2;1;1;Benign +1333063;5;1;3;1;2;1;3;1;1;Benign +1333495;3;1;1;1;2;1;2;1;1;Benign +1334659;5;2;4;1;1;1;1;1;1;Benign +1336798;3;1;1;1;2;1;2;1;1;Benign +1344449;1;1;1;1;1;1;2;1;1;Benign +1350568;4;1;1;1;2;1;2;1;1;Benign +1352663;5;4;6;8;4;1;8;10;1;Malignant +188336;5;3;2;8;5;10;8;1;2;Malignant +352431;10;5;10;3;5;8;7;8;3;Malignant +353098;4;1;1;2;2;1;1;1;1;Benign +411453;1;1;1;1;2;1;1;1;1;Benign +557583;5;10;10;10;10;10;10;1;1;Malignant +636375;5;1;1;1;2;1;1;1;1;Benign +736150;10;4;3;10;3;10;7;1;2;Malignant +803531;5;10;10;10;5;2;8;5;1;Malignant +822829;8;10;10;10;6;10;10;10;10;Malignant +1016634;2;3;1;1;2;1;2;1;1;Benign +1031608;2;1;1;1;1;1;2;1;1;Benign +1041043;4;1;3;1;2;1;2;1;1;Benign +1042252;3;1;1;1;2;1;2;1;1;Benign +1057067;1;1;1;1;1;4;1;1;1;Benign +1061990;4;1;1;1;2;1;2;1;1;Benign +1073836;5;1;1;1;2;1;2;1;1;Benign +1083817;3;1;1;1;2;1;2;1;1;Benign +1096352;6;3;3;3;3;2;6;1;1;Benign +1140597;7;1;2;3;2;1;2;1;1;Benign +1149548;1;1;1;1;2;1;1;1;1;Benign +1174009;5;1;1;2;1;1;2;1;1;Benign +1183596;3;1;3;1;3;4;1;1;1;Benign +1190386;4;6;6;5;7;6;7;7;3;Malignant +1190546;2;1;1;1;2;5;1;1;1;Benign +1213273;2;1;1;1;2;1;1;1;1;Benign +1218982;4;1;1;1;2;1;1;1;1;Benign +1225382;6;2;3;1;2;1;1;1;1;Benign +1235807;5;1;1;1;2;1;2;1;1;Benign +1238777;1;1;1;1;2;1;1;1;1;Benign +1253955;8;7;4;4;5;3;5;10;1;Malignant +1257366;3;1;1;1;2;1;1;1;1;Benign +1260659;3;1;4;1;2;1;1;1;1;Benign +1268952;10;10;7;8;7;1;10;10;3;Malignant +1275807;4;2;4;3;2;2;2;1;1;Benign +1277792;4;1;1;1;2;1;1;1;1;Benign +1277792;5;1;1;3;2;1;1;1;1;Benign +1285722;4;1;1;3;2;1;1;1;1;Benign +1288608;3;1;1;1;2;1;2;1;1;Benign +1290203;3;1;1;1;2;1;2;1;1;Benign +1294413;1;1;1;1;2;1;1;1;1;Benign +1299596;2;1;1;1;2;1;1;1;1;Benign +1303489;3;1;1;1;2;1;2;1;1;Benign +1311033;1;2;2;1;2;1;1;1;1;Benign +1311108;1;1;1;3;2;1;1;1;1;Benign +1315807;5;10;10;10;10;2;10;10;10;Malignant +1318671;3;1;1;1;2;1;2;1;1;Benign +1319609;3;1;1;2;3;4;1;1;1;Benign +1323477;1;2;1;3;2;1;2;1;1;Benign +1324572;5;1;1;1;2;1;2;2;1;Benign +1324681;4;1;1;1;2;1;2;1;1;Benign +1325159;3;1;1;1;2;1;3;1;1;Benign +1326892;3;1;1;1;2;1;2;1;1;Benign +1330361;5;1;1;1;2;1;2;1;1;Benign +1333877;5;4;5;1;8;1;3;6;1;Benign +1334015;7;8;8;7;3;10;7;2;3;Malignant +1334667;1;1;1;1;2;1;1;1;1;Benign +1339781;1;1;1;1;2;1;2;1;1;Benign +1339781;4;1;1;1;2;1;3;1;1;Benign +13454352;1;1;3;1;2;1;2;1;1;Benign +1345452;1;1;3;1;2;1;2;1;1;Benign +1345593;3;1;1;3;2;1;2;1;1;Benign +1347749;1;1;1;1;2;1;1;1;1;Benign +1347943;5;2;2;2;2;1;1;1;2;Benign +1348851;3;1;1;1;2;1;3;1;1;Benign +1350319;5;7;4;1;6;1;7;10;3;Malignant +1350423;5;10;10;8;5;5;7;10;1;Malignant +1352848;3;10;7;8;5;8;7;4;1;Malignant +1353092;3;2;1;2;2;1;3;1;1;Benign +1354840;2;1;1;1;2;1;3;1;1;Benign +1354840;5;3;2;1;3;1;1;1;1;Benign +1355260;1;1;1;1;2;1;2;1;1;Benign +1365075;4;1;4;1;2;1;1;1;1;Benign +1365328;1;1;2;1;2;1;2;1;1;Benign +1368267;5;1;1;1;2;1;1;1;1;Benign +1368273;1;1;1;1;2;1;1;1;1;Benign +1368882;2;1;1;1;2;1;1;1;1;Benign +1369821;10;10;10;10;5;10;10;10;7;Malignant +1371026;5;10;10;10;4;10;5;6;3;Malignant +1371920;5;1;1;1;2;1;3;2;1;Benign +466906;1;1;1;1;2;1;1;1;1;Benign +466906;1;1;1;1;2;1;1;1;1;Benign +534555;1;1;1;1;2;1;1;1;1;Benign +536708;1;1;1;1;2;1;1;1;1;Benign +566346;3;1;1;1;2;1;2;3;1;Benign +603148;4;1;1;1;2;1;1;1;1;Benign +654546;1;1;1;1;2;1;1;1;8;Benign +654546;1;1;1;3;2;1;1;1;1;Benign +695091;5;10;10;5;4;5;4;4;1;Malignant +714039;3;1;1;1;2;1;1;1;1;Benign +763235;3;1;1;1;2;1;2;1;2;Benign +776715;3;1;1;1;3;2;1;1;1;Benign +841769;2;1;1;1;2;1;1;1;1;Benign +888820;5;10;10;3;7;3;8;10;2;Malignant +897471;4;8;6;4;3;4;10;6;1;Malignant +897471;4;8;8;5;4;5;10;4;1;Malignant \ No newline at end of file diff --git a/dist/datasets/diabetes.csv b/dist/datasets/diabetes.csv new file mode 100755 index 0000000..a705831 --- /dev/null +++ b/dist/datasets/diabetes.csv @@ -0,0 +1,769 @@ +Pregnan,Glucose,BloodPress,SkinThick,Insulin,BMI,DPF,Age,Outcome* +6,148,72,35,0,33.6,0.627,50,1 +1,85,66,29,0,26.6,0.351,31,0 +8,183,64,0,0,23.3,0.672,32,1 +1,89,66,23,94,28.1,0.167,21,0 +0,137,40,35,168,43.1,2.288,33,1 +5,116,74,0,0,25.6,0.201,30,0 +3,78,50,32,88,31,0.248,26,1 +10,115,0,0,0,35.3,0.134,29,0 +2,197,70,45,543,30.5,0.158,53,1 +8,125,96,0,0,0,0.232,54,1 +4,110,92,0,0,37.6,0.191,30,0 +10,168,74,0,0,38,0.537,34,1 +10,139,80,0,0,27.1,1.441,57,0 +1,189,60,23,846,30.1,0.398,59,1 +5,166,72,19,175,25.8,0.587,51,1 +7,100,0,0,0,30,0.484,32,1 +0,118,84,47,230,45.8,0.551,31,1 +7,107,74,0,0,29.6,0.254,31,1 +1,103,30,38,83,43.3,0.183,33,0 +1,115,70,30,96,34.6,0.529,32,1 +3,126,88,41,235,39.3,0.704,27,0 +8,99,84,0,0,35.4,0.388,50,0 +7,196,90,0,0,39.8,0.451,41,1 +9,119,80,35,0,29,0.263,29,1 +11,143,94,33,146,36.6,0.254,51,1 +10,125,70,26,115,31.1,0.205,41,1 +7,147,76,0,0,39.4,0.257,43,1 +1,97,66,15,140,23.2,0.487,22,0 +13,145,82,19,110,22.2,0.245,57,0 +5,117,92,0,0,34.1,0.337,38,0 +5,109,75,26,0,36,0.546,60,0 +3,158,76,36,245,31.6,0.851,28,1 +3,88,58,11,54,24.8,0.267,22,0 +6,92,92,0,0,19.9,0.188,28,0 +10,122,78,31,0,27.6,0.512,45,0 +4,103,60,33,192,24,0.966,33,0 +11,138,76,0,0,33.2,0.42,35,0 +9,102,76,37,0,32.9,0.665,46,1 +2,90,68,42,0,38.2,0.503,27,1 +4,111,72,47,207,37.1,1.39,56,1 +3,180,64,25,70,34,0.271,26,0 +7,133,84,0,0,40.2,0.696,37,0 +7,106,92,18,0,22.7,0.235,48,0 +9,171,110,24,240,45.4,0.721,54,1 +7,159,64,0,0,27.4,0.294,40,0 +0,180,66,39,0,42,1.893,25,1 +1,146,56,0,0,29.7,0.564,29,0 +2,71,70,27,0,28,0.586,22,0 +7,103,66,32,0,39.1,0.344,31,1 +7,105,0,0,0,0,0.305,24,0 +1,103,80,11,82,19.4,0.491,22,0 +1,101,50,15,36,24.2,0.526,26,0 +5,88,66,21,23,24.4,0.342,30,0 +8,176,90,34,300,33.7,0.467,58,1 +7,150,66,42,342,34.7,0.718,42,0 +1,73,50,10,0,23,0.248,21,0 +7,187,68,39,304,37.7,0.254,41,1 +0,100,88,60,110,46.8,0.962,31,0 +0,146,82,0,0,40.5,1.781,44,0 +0,105,64,41,142,41.5,0.173,22,0 +2,84,0,0,0,0,0.304,21,0 +8,133,72,0,0,32.9,0.27,39,1 +5,44,62,0,0,25,0.587,36,0 +2,141,58,34,128,25.4,0.699,24,0 +7,114,66,0,0,32.8,0.258,42,1 +5,99,74,27,0,29,0.203,32,0 +0,109,88,30,0,32.5,0.855,38,1 +2,109,92,0,0,42.7,0.845,54,0 +1,95,66,13,38,19.6,0.334,25,0 +4,146,85,27,100,28.9,0.189,27,0 +2,100,66,20,90,32.9,0.867,28,1 +5,139,64,35,140,28.6,0.411,26,0 +13,126,90,0,0,43.4,0.583,42,1 +4,129,86,20,270,35.1,0.231,23,0 +1,79,75,30,0,32,0.396,22,0 +1,0,48,20,0,24.7,0.14,22,0 +7,62,78,0,0,32.6,0.391,41,0 +5,95,72,33,0,37.7,0.37,27,0 +0,131,0,0,0,43.2,0.27,26,1 +2,112,66,22,0,25,0.307,24,0 +3,113,44,13,0,22.4,0.14,22,0 +2,74,0,0,0,0,0.102,22,0 +7,83,78,26,71,29.3,0.767,36,0 +0,101,65,28,0,24.6,0.237,22,0 +5,137,108,0,0,48.8,0.227,37,1 +2,110,74,29,125,32.4,0.698,27,0 +13,106,72,54,0,36.6,0.178,45,0 +2,100,68,25,71,38.5,0.324,26,0 +15,136,70,32,110,37.1,0.153,43,1 +1,107,68,19,0,26.5,0.165,24,0 +1,80,55,0,0,19.1,0.258,21,0 +4,123,80,15,176,32,0.443,34,0 +7,81,78,40,48,46.7,0.261,42,0 +4,134,72,0,0,23.8,0.277,60,1 +2,142,82,18,64,24.7,0.761,21,0 +6,144,72,27,228,33.9,0.255,40,0 +2,92,62,28,0,31.6,0.13,24,0 +1,71,48,18,76,20.4,0.323,22,0 +6,93,50,30,64,28.7,0.356,23,0 +1,122,90,51,220,49.7,0.325,31,1 +1,163,72,0,0,39,1.222,33,1 +1,151,60,0,0,26.1,0.179,22,0 +0,125,96,0,0,22.5,0.262,21,0 +1,81,72,18,40,26.6,0.283,24,0 +2,85,65,0,0,39.6,0.93,27,0 +1,126,56,29,152,28.7,0.801,21,0 +1,96,122,0,0,22.4,0.207,27,0 +4,144,58,28,140,29.5,0.287,37,0 +3,83,58,31,18,34.3,0.336,25,0 +0,95,85,25,36,37.4,0.247,24,1 +3,171,72,33,135,33.3,0.199,24,1 +8,155,62,26,495,34,0.543,46,1 +1,89,76,34,37,31.2,0.192,23,0 +4,76,62,0,0,34,0.391,25,0 +7,160,54,32,175,30.5,0.588,39,1 +4,146,92,0,0,31.2,0.539,61,1 +5,124,74,0,0,34,0.22,38,1 +5,78,48,0,0,33.7,0.654,25,0 +4,97,60,23,0,28.2,0.443,22,0 +4,99,76,15,51,23.2,0.223,21,0 +0,162,76,56,100,53.2,0.759,25,1 +6,111,64,39,0,34.2,0.26,24,0 +2,107,74,30,100,33.6,0.404,23,0 +5,132,80,0,0,26.8,0.186,69,0 +0,113,76,0,0,33.3,0.278,23,1 +1,88,30,42,99,55,0.496,26,1 +3,120,70,30,135,42.9,0.452,30,0 +1,118,58,36,94,33.3,0.261,23,0 +1,117,88,24,145,34.5,0.403,40,1 +0,105,84,0,0,27.9,0.741,62,1 +4,173,70,14,168,29.7,0.361,33,1 +9,122,56,0,0,33.3,1.114,33,1 +3,170,64,37,225,34.5,0.356,30,1 +8,84,74,31,0,38.3,0.457,39,0 +2,96,68,13,49,21.1,0.647,26,0 +2,125,60,20,140,33.8,0.088,31,0 +0,100,70,26,50,30.8,0.597,21,0 +0,93,60,25,92,28.7,0.532,22,0 +0,129,80,0,0,31.2,0.703,29,0 +5,105,72,29,325,36.9,0.159,28,0 +3,128,78,0,0,21.1,0.268,55,0 +5,106,82,30,0,39.5,0.286,38,0 +2,108,52,26,63,32.5,0.318,22,0 +10,108,66,0,0,32.4,0.272,42,1 +4,154,62,31,284,32.8,0.237,23,0 +0,102,75,23,0,0,0.572,21,0 +9,57,80,37,0,32.8,0.096,41,0 +2,106,64,35,119,30.5,1.4,34,0 +5,147,78,0,0,33.7,0.218,65,0 +2,90,70,17,0,27.3,0.085,22,0 +1,136,74,50,204,37.4,0.399,24,0 +4,114,65,0,0,21.9,0.432,37,0 +9,156,86,28,155,34.3,1.189,42,1 +1,153,82,42,485,40.6,0.687,23,0 +8,188,78,0,0,47.9,0.137,43,1 +7,152,88,44,0,50,0.337,36,1 +2,99,52,15,94,24.6,0.637,21,0 +1,109,56,21,135,25.2,0.833,23,0 +2,88,74,19,53,29,0.229,22,0 +17,163,72,41,114,40.9,0.817,47,1 +4,151,90,38,0,29.7,0.294,36,0 +7,102,74,40,105,37.2,0.204,45,0 +0,114,80,34,285,44.2,0.167,27,0 +2,100,64,23,0,29.7,0.368,21,0 +0,131,88,0,0,31.6,0.743,32,1 +6,104,74,18,156,29.9,0.722,41,1 +3,148,66,25,0,32.5,0.256,22,0 +4,120,68,0,0,29.6,0.709,34,0 +4,110,66,0,0,31.9,0.471,29,0 +3,111,90,12,78,28.4,0.495,29,0 +6,102,82,0,0,30.8,0.18,36,1 +6,134,70,23,130,35.4,0.542,29,1 +2,87,0,23,0,28.9,0.773,25,0 +1,79,60,42,48,43.5,0.678,23,0 +2,75,64,24,55,29.7,0.37,33,0 +8,179,72,42,130,32.7,0.719,36,1 +6,85,78,0,0,31.2,0.382,42,0 +0,129,110,46,130,67.1,0.319,26,1 +5,143,78,0,0,45,0.19,47,0 +5,130,82,0,0,39.1,0.956,37,1 +6,87,80,0,0,23.2,0.084,32,0 +0,119,64,18,92,34.9,0.725,23,0 +1,0,74,20,23,27.7,0.299,21,0 +5,73,60,0,0,26.8,0.268,27,0 +4,141,74,0,0,27.6,0.244,40,0 +7,194,68,28,0,35.9,0.745,41,1 +8,181,68,36,495,30.1,0.615,60,1 +1,128,98,41,58,32,1.321,33,1 +8,109,76,39,114,27.9,0.64,31,1 +5,139,80,35,160,31.6,0.361,25,1 +3,111,62,0,0,22.6,0.142,21,0 +9,123,70,44,94,33.1,0.374,40,0 +7,159,66,0,0,30.4,0.383,36,1 +11,135,0,0,0,52.3,0.578,40,1 +8,85,55,20,0,24.4,0.136,42,0 +5,158,84,41,210,39.4,0.395,29,1 +1,105,58,0,0,24.3,0.187,21,0 +3,107,62,13,48,22.9,0.678,23,1 +4,109,64,44,99,34.8,0.905,26,1 +4,148,60,27,318,30.9,0.15,29,1 +0,113,80,16,0,31,0.874,21,0 +1,138,82,0,0,40.1,0.236,28,0 +0,108,68,20,0,27.3,0.787,32,0 +2,99,70,16,44,20.4,0.235,27,0 +6,103,72,32,190,37.7,0.324,55,0 +5,111,72,28,0,23.9,0.407,27,0 +8,196,76,29,280,37.5,0.605,57,1 +5,162,104,0,0,37.7,0.151,52,1 +1,96,64,27,87,33.2,0.289,21,0 +7,184,84,33,0,35.5,0.355,41,1 +2,81,60,22,0,27.7,0.29,25,0 +0,147,85,54,0,42.8,0.375,24,0 +7,179,95,31,0,34.2,0.164,60,0 +0,140,65,26,130,42.6,0.431,24,1 +9,112,82,32,175,34.2,0.26,36,1 +12,151,70,40,271,41.8,0.742,38,1 +5,109,62,41,129,35.8,0.514,25,1 +6,125,68,30,120,30,0.464,32,0 +5,85,74,22,0,29,1.224,32,1 +5,112,66,0,0,37.8,0.261,41,1 +0,177,60,29,478,34.6,1.072,21,1 +2,158,90,0,0,31.6,0.805,66,1 +7,119,0,0,0,25.2,0.209,37,0 +7,142,60,33,190,28.8,0.687,61,0 +1,100,66,15,56,23.6,0.666,26,0 +1,87,78,27,32,34.6,0.101,22,0 +0,101,76,0,0,35.7,0.198,26,0 +3,162,52,38,0,37.2,0.652,24,1 +4,197,70,39,744,36.7,2.329,31,0 +0,117,80,31,53,45.2,0.089,24,0 +4,142,86,0,0,44,0.645,22,1 +6,134,80,37,370,46.2,0.238,46,1 +1,79,80,25,37,25.4,0.583,22,0 +4,122,68,0,0,35,0.394,29,0 +3,74,68,28,45,29.7,0.293,23,0 +4,171,72,0,0,43.6,0.479,26,1 +7,181,84,21,192,35.9,0.586,51,1 +0,179,90,27,0,44.1,0.686,23,1 +9,164,84,21,0,30.8,0.831,32,1 +0,104,76,0,0,18.4,0.582,27,0 +1,91,64,24,0,29.2,0.192,21,0 +4,91,70,32,88,33.1,0.446,22,0 +3,139,54,0,0,25.6,0.402,22,1 +6,119,50,22,176,27.1,1.318,33,1 +2,146,76,35,194,38.2,0.329,29,0 +9,184,85,15,0,30,1.213,49,1 +10,122,68,0,0,31.2,0.258,41,0 +0,165,90,33,680,52.3,0.427,23,0 +9,124,70,33,402,35.4,0.282,34,0 +1,111,86,19,0,30.1,0.143,23,0 +9,106,52,0,0,31.2,0.38,42,0 +2,129,84,0,0,28,0.284,27,0 +2,90,80,14,55,24.4,0.249,24,0 +0,86,68,32,0,35.8,0.238,25,0 +12,92,62,7,258,27.6,0.926,44,1 +1,113,64,35,0,33.6,0.543,21,1 +3,111,56,39,0,30.1,0.557,30,0 +2,114,68,22,0,28.7,0.092,25,0 +1,193,50,16,375,25.9,0.655,24,0 +11,155,76,28,150,33.3,1.353,51,1 +3,191,68,15,130,30.9,0.299,34,0 +3,141,0,0,0,30,0.761,27,1 +4,95,70,32,0,32.1,0.612,24,0 +3,142,80,15,0,32.4,0.2,63,0 +4,123,62,0,0,32,0.226,35,1 +5,96,74,18,67,33.6,0.997,43,0 +0,138,0,0,0,36.3,0.933,25,1 +2,128,64,42,0,40,1.101,24,0 +0,102,52,0,0,25.1,0.078,21,0 +2,146,0,0,0,27.5,0.24,28,1 +10,101,86,37,0,45.6,1.136,38,1 +2,108,62,32,56,25.2,0.128,21,0 +3,122,78,0,0,23,0.254,40,0 +1,71,78,50,45,33.2,0.422,21,0 +13,106,70,0,0,34.2,0.251,52,0 +2,100,70,52,57,40.5,0.677,25,0 +7,106,60,24,0,26.5,0.296,29,1 +0,104,64,23,116,27.8,0.454,23,0 +5,114,74,0,0,24.9,0.744,57,0 +2,108,62,10,278,25.3,0.881,22,0 +0,146,70,0,0,37.9,0.334,28,1 +10,129,76,28,122,35.9,0.28,39,0 +7,133,88,15,155,32.4,0.262,37,0 +7,161,86,0,0,30.4,0.165,47,1 +2,108,80,0,0,27,0.259,52,1 +7,136,74,26,135,26,0.647,51,0 +5,155,84,44,545,38.7,0.619,34,0 +1,119,86,39,220,45.6,0.808,29,1 +4,96,56,17,49,20.8,0.34,26,0 +5,108,72,43,75,36.1,0.263,33,0 +0,78,88,29,40,36.9,0.434,21,0 +0,107,62,30,74,36.6,0.757,25,1 +2,128,78,37,182,43.3,1.224,31,1 +1,128,48,45,194,40.5,0.613,24,1 +0,161,50,0,0,21.9,0.254,65,0 +6,151,62,31,120,35.5,0.692,28,0 +2,146,70,38,360,28,0.337,29,1 +0,126,84,29,215,30.7,0.52,24,0 +14,100,78,25,184,36.6,0.412,46,1 +8,112,72,0,0,23.6,0.84,58,0 +0,167,0,0,0,32.3,0.839,30,1 +2,144,58,33,135,31.6,0.422,25,1 +5,77,82,41,42,35.8,0.156,35,0 +5,115,98,0,0,52.9,0.209,28,1 +3,150,76,0,0,21,0.207,37,0 +2,120,76,37,105,39.7,0.215,29,0 +10,161,68,23,132,25.5,0.326,47,1 +0,137,68,14,148,24.8,0.143,21,0 +0,128,68,19,180,30.5,1.391,25,1 +2,124,68,28,205,32.9,0.875,30,1 +6,80,66,30,0,26.2,0.313,41,0 +0,106,70,37,148,39.4,0.605,22,0 +2,155,74,17,96,26.6,0.433,27,1 +3,113,50,10,85,29.5,0.626,25,0 +7,109,80,31,0,35.9,1.127,43,1 +2,112,68,22,94,34.1,0.315,26,0 +3,99,80,11,64,19.3,0.284,30,0 +3,182,74,0,0,30.5,0.345,29,1 +3,115,66,39,140,38.1,0.15,28,0 +6,194,78,0,0,23.5,0.129,59,1 +4,129,60,12,231,27.5,0.527,31,0 +3,112,74,30,0,31.6,0.197,25,1 +0,124,70,20,0,27.4,0.254,36,1 +13,152,90,33,29,26.8,0.731,43,1 +2,112,75,32,0,35.7,0.148,21,0 +1,157,72,21,168,25.6,0.123,24,0 +1,122,64,32,156,35.1,0.692,30,1 +10,179,70,0,0,35.1,0.2,37,0 +2,102,86,36,120,45.5,0.127,23,1 +6,105,70,32,68,30.8,0.122,37,0 +8,118,72,19,0,23.1,1.476,46,0 +2,87,58,16,52,32.7,0.166,25,0 +1,180,0,0,0,43.3,0.282,41,1 +12,106,80,0,0,23.6,0.137,44,0 +1,95,60,18,58,23.9,0.26,22,0 +0,165,76,43,255,47.9,0.259,26,0 +0,117,0,0,0,33.8,0.932,44,0 +5,115,76,0,0,31.2,0.343,44,1 +9,152,78,34,171,34.2,0.893,33,1 +7,178,84,0,0,39.9,0.331,41,1 +1,130,70,13,105,25.9,0.472,22,0 +1,95,74,21,73,25.9,0.673,36,0 +1,0,68,35,0,32,0.389,22,0 +5,122,86,0,0,34.7,0.29,33,0 +8,95,72,0,0,36.8,0.485,57,0 +8,126,88,36,108,38.5,0.349,49,0 +1,139,46,19,83,28.7,0.654,22,0 +3,116,0,0,0,23.5,0.187,23,0 +3,99,62,19,74,21.8,0.279,26,0 +5,0,80,32,0,41,0.346,37,1 +4,92,80,0,0,42.2,0.237,29,0 +4,137,84,0,0,31.2,0.252,30,0 +3,61,82,28,0,34.4,0.243,46,0 +1,90,62,12,43,27.2,0.58,24,0 +3,90,78,0,0,42.7,0.559,21,0 +9,165,88,0,0,30.4,0.302,49,1 +1,125,50,40,167,33.3,0.962,28,1 +13,129,0,30,0,39.9,0.569,44,1 +12,88,74,40,54,35.3,0.378,48,0 +1,196,76,36,249,36.5,0.875,29,1 +5,189,64,33,325,31.2,0.583,29,1 +5,158,70,0,0,29.8,0.207,63,0 +5,103,108,37,0,39.2,0.305,65,0 +4,146,78,0,0,38.5,0.52,67,1 +4,147,74,25,293,34.9,0.385,30,0 +5,99,54,28,83,34,0.499,30,0 +6,124,72,0,0,27.6,0.368,29,1 +0,101,64,17,0,21,0.252,21,0 +3,81,86,16,66,27.5,0.306,22,0 +1,133,102,28,140,32.8,0.234,45,1 +3,173,82,48,465,38.4,2.137,25,1 +0,118,64,23,89,0,1.731,21,0 +0,84,64,22,66,35.8,0.545,21,0 +2,105,58,40,94,34.9,0.225,25,0 +2,122,52,43,158,36.2,0.816,28,0 +12,140,82,43,325,39.2,0.528,58,1 +0,98,82,15,84,25.2,0.299,22,0 +1,87,60,37,75,37.2,0.509,22,0 +4,156,75,0,0,48.3,0.238,32,1 +0,93,100,39,72,43.4,1.021,35,0 +1,107,72,30,82,30.8,0.821,24,0 +0,105,68,22,0,20,0.236,22,0 +1,109,60,8,182,25.4,0.947,21,0 +1,90,62,18,59,25.1,1.268,25,0 +1,125,70,24,110,24.3,0.221,25,0 +1,119,54,13,50,22.3,0.205,24,0 +5,116,74,29,0,32.3,0.66,35,1 +8,105,100,36,0,43.3,0.239,45,1 +5,144,82,26,285,32,0.452,58,1 +3,100,68,23,81,31.6,0.949,28,0 +1,100,66,29,196,32,0.444,42,0 +5,166,76,0,0,45.7,0.34,27,1 +1,131,64,14,415,23.7,0.389,21,0 +4,116,72,12,87,22.1,0.463,37,0 +4,158,78,0,0,32.9,0.803,31,1 +2,127,58,24,275,27.7,1.6,25,0 +3,96,56,34,115,24.7,0.944,39,0 +0,131,66,40,0,34.3,0.196,22,1 +3,82,70,0,0,21.1,0.389,25,0 +3,193,70,31,0,34.9,0.241,25,1 +4,95,64,0,0,32,0.161,31,1 +6,137,61,0,0,24.2,0.151,55,0 +5,136,84,41,88,35,0.286,35,1 +9,72,78,25,0,31.6,0.28,38,0 +5,168,64,0,0,32.9,0.135,41,1 +2,123,48,32,165,42.1,0.52,26,0 +4,115,72,0,0,28.9,0.376,46,1 +0,101,62,0,0,21.9,0.336,25,0 +8,197,74,0,0,25.9,1.191,39,1 +1,172,68,49,579,42.4,0.702,28,1 +6,102,90,39,0,35.7,0.674,28,0 +1,112,72,30,176,34.4,0.528,25,0 +1,143,84,23,310,42.4,1.076,22,0 +1,143,74,22,61,26.2,0.256,21,0 +0,138,60,35,167,34.6,0.534,21,1 +3,173,84,33,474,35.7,0.258,22,1 +1,97,68,21,0,27.2,1.095,22,0 +4,144,82,32,0,38.5,0.554,37,1 +1,83,68,0,0,18.2,0.624,27,0 +3,129,64,29,115,26.4,0.219,28,1 +1,119,88,41,170,45.3,0.507,26,0 +2,94,68,18,76,26,0.561,21,0 +0,102,64,46,78,40.6,0.496,21,0 +2,115,64,22,0,30.8,0.421,21,0 +8,151,78,32,210,42.9,0.516,36,1 +4,184,78,39,277,37,0.264,31,1 +0,94,0,0,0,0,0.256,25,0 +1,181,64,30,180,34.1,0.328,38,1 +0,135,94,46,145,40.6,0.284,26,0 +1,95,82,25,180,35,0.233,43,1 +2,99,0,0,0,22.2,0.108,23,0 +3,89,74,16,85,30.4,0.551,38,0 +1,80,74,11,60,30,0.527,22,0 +2,139,75,0,0,25.6,0.167,29,0 +1,90,68,8,0,24.5,1.138,36,0 +0,141,0,0,0,42.4,0.205,29,1 +12,140,85,33,0,37.4,0.244,41,0 +5,147,75,0,0,29.9,0.434,28,0 +1,97,70,15,0,18.2,0.147,21,0 +6,107,88,0,0,36.8,0.727,31,0 +0,189,104,25,0,34.3,0.435,41,1 +2,83,66,23,50,32.2,0.497,22,0 +4,117,64,27,120,33.2,0.23,24,0 +8,108,70,0,0,30.5,0.955,33,1 +4,117,62,12,0,29.7,0.38,30,1 +0,180,78,63,14,59.4,2.42,25,1 +1,100,72,12,70,25.3,0.658,28,0 +0,95,80,45,92,36.5,0.33,26,0 +0,104,64,37,64,33.6,0.51,22,1 +0,120,74,18,63,30.5,0.285,26,0 +1,82,64,13,95,21.2,0.415,23,0 +2,134,70,0,0,28.9,0.542,23,1 +0,91,68,32,210,39.9,0.381,25,0 +2,119,0,0,0,19.6,0.832,72,0 +2,100,54,28,105,37.8,0.498,24,0 +14,175,62,30,0,33.6,0.212,38,1 +1,135,54,0,0,26.7,0.687,62,0 +5,86,68,28,71,30.2,0.364,24,0 +10,148,84,48,237,37.6,1.001,51,1 +9,134,74,33,60,25.9,0.46,81,0 +9,120,72,22,56,20.8,0.733,48,0 +1,71,62,0,0,21.8,0.416,26,0 +8,74,70,40,49,35.3,0.705,39,0 +5,88,78,30,0,27.6,0.258,37,0 +10,115,98,0,0,24,1.022,34,0 +0,124,56,13,105,21.8,0.452,21,0 +0,74,52,10,36,27.8,0.269,22,0 +0,97,64,36,100,36.8,0.6,25,0 +8,120,0,0,0,30,0.183,38,1 +6,154,78,41,140,46.1,0.571,27,0 +1,144,82,40,0,41.3,0.607,28,0 +0,137,70,38,0,33.2,0.17,22,0 +0,119,66,27,0,38.8,0.259,22,0 +7,136,90,0,0,29.9,0.21,50,0 +4,114,64,0,0,28.9,0.126,24,0 +0,137,84,27,0,27.3,0.231,59,0 +2,105,80,45,191,33.7,0.711,29,1 +7,114,76,17,110,23.8,0.466,31,0 +8,126,74,38,75,25.9,0.162,39,0 +4,132,86,31,0,28,0.419,63,0 +3,158,70,30,328,35.5,0.344,35,1 +0,123,88,37,0,35.2,0.197,29,0 +4,85,58,22,49,27.8,0.306,28,0 +0,84,82,31,125,38.2,0.233,23,0 +0,145,0,0,0,44.2,0.63,31,1 +0,135,68,42,250,42.3,0.365,24,1 +1,139,62,41,480,40.7,0.536,21,0 +0,173,78,32,265,46.5,1.159,58,0 +4,99,72,17,0,25.6,0.294,28,0 +8,194,80,0,0,26.1,0.551,67,0 +2,83,65,28,66,36.8,0.629,24,0 +2,89,90,30,0,33.5,0.292,42,0 +4,99,68,38,0,32.8,0.145,33,0 +4,125,70,18,122,28.9,1.144,45,1 +3,80,0,0,0,0,0.174,22,0 +6,166,74,0,0,26.6,0.304,66,0 +5,110,68,0,0,26,0.292,30,0 +2,81,72,15,76,30.1,0.547,25,0 +7,195,70,33,145,25.1,0.163,55,1 +6,154,74,32,193,29.3,0.839,39,0 +2,117,90,19,71,25.2,0.313,21,0 +3,84,72,32,0,37.2,0.267,28,0 +6,0,68,41,0,39,0.727,41,1 +7,94,64,25,79,33.3,0.738,41,0 +3,96,78,39,0,37.3,0.238,40,0 +10,75,82,0,0,33.3,0.263,38,0 +0,180,90,26,90,36.5,0.314,35,1 +1,130,60,23,170,28.6,0.692,21,0 +2,84,50,23,76,30.4,0.968,21,0 +8,120,78,0,0,25,0.409,64,0 +12,84,72,31,0,29.7,0.297,46,1 +0,139,62,17,210,22.1,0.207,21,0 +9,91,68,0,0,24.2,0.2,58,0 +2,91,62,0,0,27.3,0.525,22,0 +3,99,54,19,86,25.6,0.154,24,0 +3,163,70,18,105,31.6,0.268,28,1 +9,145,88,34,165,30.3,0.771,53,1 +7,125,86,0,0,37.6,0.304,51,0 +13,76,60,0,0,32.8,0.18,41,0 +6,129,90,7,326,19.6,0.582,60,0 +2,68,70,32,66,25,0.187,25,0 +3,124,80,33,130,33.2,0.305,26,0 +6,114,0,0,0,0,0.189,26,0 +9,130,70,0,0,34.2,0.652,45,1 +3,125,58,0,0,31.6,0.151,24,0 +3,87,60,18,0,21.8,0.444,21,0 +1,97,64,19,82,18.2,0.299,21,0 +3,116,74,15,105,26.3,0.107,24,0 +0,117,66,31,188,30.8,0.493,22,0 +0,111,65,0,0,24.6,0.66,31,0 +2,122,60,18,106,29.8,0.717,22,0 +0,107,76,0,0,45.3,0.686,24,0 +1,86,66,52,65,41.3,0.917,29,0 +6,91,0,0,0,29.8,0.501,31,0 +1,77,56,30,56,33.3,1.251,24,0 +4,132,0,0,0,32.9,0.302,23,1 +0,105,90,0,0,29.6,0.197,46,0 +0,57,60,0,0,21.7,0.735,67,0 +0,127,80,37,210,36.3,0.804,23,0 +3,129,92,49,155,36.4,0.968,32,1 +8,100,74,40,215,39.4,0.661,43,1 +3,128,72,25,190,32.4,0.549,27,1 +10,90,85,32,0,34.9,0.825,56,1 +4,84,90,23,56,39.5,0.159,25,0 +1,88,78,29,76,32,0.365,29,0 +8,186,90,35,225,34.5,0.423,37,1 +5,187,76,27,207,43.6,1.034,53,1 +4,131,68,21,166,33.1,0.16,28,0 +1,164,82,43,67,32.8,0.341,50,0 +4,189,110,31,0,28.5,0.68,37,0 +1,116,70,28,0,27.4,0.204,21,0 +3,84,68,30,106,31.9,0.591,25,0 +6,114,88,0,0,27.8,0.247,66,0 +1,88,62,24,44,29.9,0.422,23,0 +1,84,64,23,115,36.9,0.471,28,0 +7,124,70,33,215,25.5,0.161,37,0 +1,97,70,40,0,38.1,0.218,30,0 +8,110,76,0,0,27.8,0.237,58,0 +11,103,68,40,0,46.2,0.126,42,0 +11,85,74,0,0,30.1,0.3,35,0 +6,125,76,0,0,33.8,0.121,54,1 +0,198,66,32,274,41.3,0.502,28,1 +1,87,68,34,77,37.6,0.401,24,0 +6,99,60,19,54,26.9,0.497,32,0 +0,91,80,0,0,32.4,0.601,27,0 +2,95,54,14,88,26.1,0.748,22,0 +1,99,72,30,18,38.6,0.412,21,0 +6,92,62,32,126,32,0.085,46,0 +4,154,72,29,126,31.3,0.338,37,0 +0,121,66,30,165,34.3,0.203,33,1 +3,78,70,0,0,32.5,0.27,39,0 +2,130,96,0,0,22.6,0.268,21,0 +3,111,58,31,44,29.5,0.43,22,0 +2,98,60,17,120,34.7,0.198,22,0 +1,143,86,30,330,30.1,0.892,23,0 +1,119,44,47,63,35.5,0.28,25,0 +6,108,44,20,130,24,0.813,35,0 +2,118,80,0,0,42.9,0.693,21,1 +10,133,68,0,0,27,0.245,36,0 +2,197,70,99,0,34.7,0.575,62,1 +0,151,90,46,0,42.1,0.371,21,1 +6,109,60,27,0,25,0.206,27,0 +12,121,78,17,0,26.5,0.259,62,0 +8,100,76,0,0,38.7,0.19,42,0 +8,124,76,24,600,28.7,0.687,52,1 +1,93,56,11,0,22.5,0.417,22,0 +8,143,66,0,0,34.9,0.129,41,1 +6,103,66,0,0,24.3,0.249,29,0 +3,176,86,27,156,33.3,1.154,52,1 +0,73,0,0,0,21.1,0.342,25,0 +11,111,84,40,0,46.8,0.925,45,1 +2,112,78,50,140,39.4,0.175,24,0 +3,132,80,0,0,34.4,0.402,44,1 +2,82,52,22,115,28.5,1.699,25,0 +6,123,72,45,230,33.6,0.733,34,0 +0,188,82,14,185,32,0.682,22,1 +0,67,76,0,0,45.3,0.194,46,0 +1,89,24,19,25,27.8,0.559,21,0 +1,173,74,0,0,36.8,0.088,38,1 +1,109,38,18,120,23.1,0.407,26,0 +1,108,88,19,0,27.1,0.4,24,0 +6,96,0,0,0,23.7,0.19,28,0 +1,124,74,36,0,27.8,0.1,30,0 +7,150,78,29,126,35.2,0.692,54,1 +4,183,0,0,0,28.4,0.212,36,1 +1,124,60,32,0,35.8,0.514,21,0 +1,181,78,42,293,40,1.258,22,1 +1,92,62,25,41,19.5,0.482,25,0 +0,152,82,39,272,41.5,0.27,27,0 +1,111,62,13,182,24,0.138,23,0 +3,106,54,21,158,30.9,0.292,24,0 +3,174,58,22,194,32.9,0.593,36,1 +7,168,88,42,321,38.2,0.787,40,1 +6,105,80,28,0,32.5,0.878,26,0 +11,138,74,26,144,36.1,0.557,50,1 +3,106,72,0,0,25.8,0.207,27,0 +6,117,96,0,0,28.7,0.157,30,0 +2,68,62,13,15,20.1,0.257,23,0 +9,112,82,24,0,28.2,1.282,50,1 +0,119,0,0,0,32.4,0.141,24,1 +2,112,86,42,160,38.4,0.246,28,0 +2,92,76,20,0,24.2,1.698,28,0 +6,183,94,0,0,40.8,1.461,45,0 +0,94,70,27,115,43.5,0.347,21,0 +2,108,64,0,0,30.8,0.158,21,0 +4,90,88,47,54,37.7,0.362,29,0 +0,125,68,0,0,24.7,0.206,21,0 +0,132,78,0,0,32.4,0.393,21,0 +5,128,80,0,0,34.6,0.144,45,0 +4,94,65,22,0,24.7,0.148,21,0 +7,114,64,0,0,27.4,0.732,34,1 +0,102,78,40,90,34.5,0.238,24,0 +2,111,60,0,0,26.2,0.343,23,0 +1,128,82,17,183,27.5,0.115,22,0 +10,92,62,0,0,25.9,0.167,31,0 +13,104,72,0,0,31.2,0.465,38,1 +5,104,74,0,0,28.8,0.153,48,0 +2,94,76,18,66,31.6,0.649,23,0 +7,97,76,32,91,40.9,0.871,32,1 +1,100,74,12,46,19.5,0.149,28,0 +0,102,86,17,105,29.3,0.695,27,0 +4,128,70,0,0,34.3,0.303,24,0 +6,147,80,0,0,29.5,0.178,50,1 +4,90,0,0,0,28,0.61,31,0 +3,103,72,30,152,27.6,0.73,27,0 +2,157,74,35,440,39.4,0.134,30,0 +1,167,74,17,144,23.4,0.447,33,1 +0,179,50,36,159,37.8,0.455,22,1 +11,136,84,35,130,28.3,0.26,42,1 +0,107,60,25,0,26.4,0.133,23,0 +1,91,54,25,100,25.2,0.234,23,0 +1,117,60,23,106,33.8,0.466,27,0 +5,123,74,40,77,34.1,0.269,28,0 +2,120,54,0,0,26.8,0.455,27,0 +1,106,70,28,135,34.2,0.142,22,0 +2,155,52,27,540,38.7,0.24,25,1 +2,101,58,35,90,21.8,0.155,22,0 +1,120,80,48,200,38.9,1.162,41,0 +11,127,106,0,0,39,0.19,51,0 +3,80,82,31,70,34.2,1.292,27,1 +10,162,84,0,0,27.7,0.182,54,0 +1,199,76,43,0,42.9,1.394,22,1 +8,167,106,46,231,37.6,0.165,43,1 +9,145,80,46,130,37.9,0.637,40,1 +6,115,60,39,0,33.7,0.245,40,1 +1,112,80,45,132,34.8,0.217,24,0 +4,145,82,18,0,32.5,0.235,70,1 +10,111,70,27,0,27.5,0.141,40,1 +6,98,58,33,190,34,0.43,43,0 +9,154,78,30,100,30.9,0.164,45,0 +6,165,68,26,168,33.6,0.631,49,0 +1,99,58,10,0,25.4,0.551,21,0 +10,68,106,23,49,35.5,0.285,47,0 +3,123,100,35,240,57.3,0.88,22,0 +8,91,82,0,0,35.6,0.587,68,0 +6,195,70,0,0,30.9,0.328,31,1 +9,156,86,0,0,24.8,0.23,53,1 +0,93,60,0,0,35.3,0.263,25,0 +3,121,52,0,0,36,0.127,25,1 +2,101,58,17,265,24.2,0.614,23,0 +2,56,56,28,45,24.2,0.332,22,0 +0,162,76,36,0,49.6,0.364,26,1 +0,95,64,39,105,44.6,0.366,22,0 +4,125,80,0,0,32.3,0.536,27,1 +5,136,82,0,0,0,0.64,69,0 +2,129,74,26,205,33.2,0.591,25,0 +3,130,64,0,0,23.1,0.314,22,0 +1,107,50,19,0,28.3,0.181,29,0 +1,140,74,26,180,24.1,0.828,23,0 +1,144,82,46,180,46.1,0.335,46,1 +8,107,80,0,0,24.6,0.856,34,0 +13,158,114,0,0,42.3,0.257,44,1 +2,121,70,32,95,39.1,0.886,23,0 +7,129,68,49,125,38.5,0.439,43,1 +2,90,60,0,0,23.5,0.191,25,0 +7,142,90,24,480,30.4,0.128,43,1 +3,169,74,19,125,29.9,0.268,31,1 +0,99,0,0,0,25,0.253,22,0 +4,127,88,11,155,34.5,0.598,28,0 +4,118,70,0,0,44.5,0.904,26,0 +2,122,76,27,200,35.9,0.483,26,0 +6,125,78,31,0,27.6,0.565,49,1 +1,168,88,29,0,35,0.905,52,1 +2,129,0,0,0,38.5,0.304,41,0 +4,110,76,20,100,28.4,0.118,27,0 +6,80,80,36,0,39.8,0.177,28,0 +10,115,0,0,0,0,0.261,30,1 +2,127,46,21,335,34.4,0.176,22,0 +9,164,78,0,0,32.8,0.148,45,1 +2,93,64,32,160,38,0.674,23,1 +3,158,64,13,387,31.2,0.295,24,0 +5,126,78,27,22,29.6,0.439,40,0 +10,129,62,36,0,41.2,0.441,38,1 +0,134,58,20,291,26.4,0.352,21,0 +3,102,74,0,0,29.5,0.121,32,0 +7,187,50,33,392,33.9,0.826,34,1 +3,173,78,39,185,33.8,0.97,31,1 +10,94,72,18,0,23.1,0.595,56,0 +1,108,60,46,178,35.5,0.415,24,0 +5,97,76,27,0,35.6,0.378,52,1 +4,83,86,19,0,29.3,0.317,34,0 +1,114,66,36,200,38.1,0.289,21,0 +1,149,68,29,127,29.3,0.349,42,1 +5,117,86,30,105,39.1,0.251,42,0 +1,111,94,0,0,32.8,0.265,45,0 +4,112,78,40,0,39.4,0.236,38,0 +1,116,78,29,180,36.1,0.496,25,0 +0,141,84,26,0,32.4,0.433,22,0 +2,175,88,0,0,22.9,0.326,22,0 +2,92,52,0,0,30.1,0.141,22,0 +3,130,78,23,79,28.4,0.323,34,1 +8,120,86,0,0,28.4,0.259,22,1 +2,174,88,37,120,44.5,0.646,24,1 +2,106,56,27,165,29,0.426,22,0 +2,105,75,0,0,23.3,0.56,53,0 +4,95,60,32,0,35.4,0.284,28,0 +0,126,86,27,120,27.4,0.515,21,0 +8,65,72,23,0,32,0.6,42,0 +2,99,60,17,160,36.6,0.453,21,0 +1,102,74,0,0,39.5,0.293,42,1 +11,120,80,37,150,42.3,0.785,48,1 +3,102,44,20,94,30.8,0.4,26,0 +1,109,58,18,116,28.5,0.219,22,0 +9,140,94,0,0,32.7,0.734,45,1 +13,153,88,37,140,40.6,1.174,39,0 +12,100,84,33,105,30,0.488,46,0 +1,147,94,41,0,49.3,0.358,27,1 +1,81,74,41,57,46.3,1.096,32,0 +3,187,70,22,200,36.4,0.408,36,1 +6,162,62,0,0,24.3,0.178,50,1 +4,136,70,0,0,31.2,1.182,22,1 +1,121,78,39,74,39,0.261,28,0 +3,108,62,24,0,26,0.223,25,0 +0,181,88,44,510,43.3,0.222,26,1 +8,154,78,32,0,32.4,0.443,45,1 +1,128,88,39,110,36.5,1.057,37,1 +7,137,90,41,0,32,0.391,39,0 +0,123,72,0,0,36.3,0.258,52,1 +1,106,76,0,0,37.5,0.197,26,0 +6,190,92,0,0,35.5,0.278,66,1 +2,88,58,26,16,28.4,0.766,22,0 +9,170,74,31,0,44,0.403,43,1 +9,89,62,0,0,22.5,0.142,33,0 +10,101,76,48,180,32.9,0.171,63,0 +2,122,70,27,0,36.8,0.34,27,0 +5,121,72,23,112,26.2,0.245,30,0 +1,126,60,0,0,30.1,0.349,47,1 +1,93,70,31,0,30.4,0.315,23,0 \ No newline at end of file diff --git a/dist/datasets/iris.csv b/dist/datasets/iris.csv new file mode 100755 index 0000000..0862df1 --- /dev/null +++ b/dist/datasets/iris.csv @@ -0,0 +1,152 @@ +"sepal_l","sepal_w","petal_l","petal_w","Species*" +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica + diff --git a/dist/index.html b/dist/index.html new file mode 100755 index 0000000..cc0e79a --- /dev/null +++ b/dist/index.html @@ -0,0 +1 @@ +frontend

    \ No newline at end of file diff --git a/extra_data_sets/breast-cancer-wisconsin.csv b/extra_data_sets/breast-cancer-wisconsin.csv new file mode 100644 index 0000000..0b2c94e --- /dev/null +++ b/extra_data_sets/breast-cancer-wisconsin.csv @@ -0,0 +1,700 @@ +clump_thic,size_un,shape_un,marg_adh,epith_size,bare_nuc,bland_chr,nor_nuc,mitoses,class* +5,1,1,1,2,1,3,1,1,Benign +5,4,4,5,7,10,3,2,1,Benign +3,1,1,1,2,2,3,1,1,Benign +6,8,8,1,3,4,3,7,1,Benign +4,1,1,3,2,1,3,1,1,Benign +8,10,10,8,7,10,9,7,1,Malignant +1,1,1,1,2,10,3,1,1,Benign +2,1,2,1,2,1,3,1,1,Benign +2,1,1,1,2,1,1,1,5,Benign +4,2,1,1,2,1,2,1,1,Benign +1,1,1,1,1,1,3,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +5,3,3,3,2,3,4,4,1,Malignant +1,1,1,1,2,3,3,1,1,Benign +8,7,5,10,7,9,5,5,4,Malignant +7,4,6,4,6,1,4,3,1,Malignant +4,1,1,1,2,1,2,1,1,Benign +4,1,1,1,2,1,3,1,1,Benign +10,7,7,6,4,10,4,1,2,Malignant +6,1,1,1,2,1,3,1,1,Benign +7,3,2,10,5,10,5,4,4,Malignant +10,5,5,3,6,7,7,10,1,Malignant +3,1,1,1,2,1,2,1,1,Benign +8,4,5,1,2,4,7,3,1,Malignant +1,1,1,1,2,1,3,1,1,Benign +5,2,3,4,2,7,3,6,1,Malignant +3,2,1,1,1,1,2,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +1,1,3,1,2,1,1,1,1,Benign +3,1,1,1,1,1,2,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +10,7,7,3,8,5,7,4,3,Malignant +2,1,1,2,2,1,3,1,1,Benign +3,1,2,1,2,1,2,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +10,10,10,8,6,1,8,9,1,Malignant +6,2,1,1,1,1,7,1,1,Benign +5,4,4,9,2,10,5,6,1,Malignant +2,5,3,3,6,7,7,5,1,Malignant +6,6,6,9,6,4,7,8,1,Benign +10,4,3,1,3,3,6,5,2,Malignant +6,10,10,2,8,10,7,3,3,Malignant +5,6,5,6,10,1,3,1,1,Malignant +10,10,10,4,8,1,8,10,1,Malignant +1,1,1,1,2,1,2,1,2,Benign +3,7,7,4,4,9,4,8,1,Malignant +1,1,1,1,2,1,2,1,1,Benign +4,1,1,3,2,1,3,1,1,Benign +7,8,7,2,4,8,3,8,2,Malignant +9,5,8,1,2,3,2,1,5,Malignant +5,3,3,4,2,4,3,4,1,Malignant +10,3,6,2,3,5,4,10,2,Malignant +5,5,5,8,10,8,7,3,7,Malignant +10,5,5,6,8,8,7,1,1,Malignant +10,6,6,3,4,5,3,6,1,Malignant +8,10,10,1,3,6,3,9,1,Malignant +8,2,4,1,5,1,5,4,4,Malignant +5,2,3,1,6,10,5,1,1,Malignant +9,5,5,2,2,2,5,1,1,Malignant +5,3,5,5,3,3,4,10,1,Malignant +1,1,1,1,2,2,2,1,1,Benign +9,10,10,1,10,8,3,3,1,Malignant +6,3,4,1,5,2,3,9,1,Malignant +1,1,1,1,2,1,2,1,1,Benign +10,4,2,1,3,2,4,3,10,Malignant +4,1,1,1,2,1,3,1,1,Benign +5,3,4,1,8,10,4,9,1,Malignant +8,3,8,3,4,9,8,9,8,Malignant +1,1,1,1,2,1,3,2,1,Benign +5,1,3,1,2,1,2,1,1,Benign +6,10,2,8,10,2,7,8,10,Malignant +1,3,3,2,2,1,7,2,1,Benign +9,4,5,10,6,10,4,8,1,Malignant +10,6,4,1,3,4,3,2,3,Malignant +1,1,2,1,2,2,4,2,1,Benign +1,1,4,1,2,1,2,1,1,Benign +5,3,1,2,2,1,2,1,1,Benign +3,1,1,1,2,3,3,1,1,Benign +2,1,1,1,3,1,2,1,1,Benign +2,2,2,1,1,1,7,1,1,Benign +4,1,1,2,2,1,2,1,1,Benign +5,2,1,1,2,1,3,1,1,Benign +3,1,1,1,2,2,7,1,1,Benign +3,5,7,8,8,9,7,10,7,Malignant +5,10,6,1,10,4,4,10,10,Malignant +3,3,6,4,5,8,4,4,1,Malignant +3,6,6,6,5,10,6,8,3,Malignant +4,1,1,1,2,1,3,1,1,Benign +2,1,1,2,3,1,2,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +3,1,1,2,2,1,1,1,1,Benign +4,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +2,1,1,2,2,1,1,1,1,Benign +5,1,1,1,2,1,3,1,1,Benign +9,6,9,2,10,6,2,9,10,Malignant +7,5,6,10,5,10,7,9,4,Malignant +10,3,5,1,10,5,3,10,2,Malignant +2,3,4,4,2,5,2,5,1,Malignant +4,1,2,1,2,1,3,1,1,Benign +8,2,3,1,6,3,7,1,1,Malignant +10,10,10,10,10,1,8,8,8,Malignant +7,3,4,4,3,3,3,2,7,Malignant +10,10,10,8,2,10,4,1,1,Malignant +1,6,8,10,8,10,5,7,1,Malignant +1,1,1,1,2,1,2,3,1,Benign +6,5,4,4,3,9,7,8,3,Malignant +1,3,1,2,2,2,5,3,2,Benign +8,6,4,3,5,9,3,1,1,Malignant +10,3,3,10,2,10,7,3,3,Malignant +10,10,10,3,10,8,8,1,1,Malignant +3,3,2,1,2,3,3,1,1,Benign +1,1,1,1,2,5,1,1,1,Benign +8,3,3,1,2,2,3,2,1,Benign +4,5,5,10,4,10,7,5,8,Malignant +1,1,1,1,4,3,1,1,1,Benign +3,2,1,1,2,2,3,1,1,Benign +1,1,2,2,2,1,3,1,1,Benign +4,2,1,1,2,2,3,1,1,Benign +10,10,10,2,10,10,5,3,3,Malignant +5,3,5,1,8,10,5,3,1,Malignant +5,4,6,7,9,7,8,10,1,Malignant +1,1,1,1,2,1,2,1,1,Benign +7,5,3,7,4,10,7,5,5,Malignant +3,1,1,1,2,1,3,1,1,Benign +8,3,5,4,5,10,1,6,2,Malignant +1,1,1,1,10,1,1,1,1,Benign +5,1,3,1,2,1,2,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +5,10,8,10,8,10,3,6,3,Malignant +3,1,1,1,2,1,2,2,1,Benign +3,1,1,1,3,1,2,1,1,Benign +5,1,1,1,2,2,3,3,1,Benign +4,1,1,1,2,1,2,1,1,Benign +3,1,1,1,2,1,1,1,1,Benign +4,1,2,1,2,1,2,1,1,Benign +1,1,1,1,1,4,2,1,1,Benign +3,1,1,1,2,1,1,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +9,5,5,4,4,5,4,3,3,Malignant +1,1,1,1,2,5,1,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +1,1,3,1,2,4,2,1,1,Benign +3,4,5,2,6,8,4,1,1,Malignant +1,1,1,1,3,2,2,1,1,Benign +3,1,1,3,8,1,5,8,1,Benign +8,8,7,4,10,10,7,8,7,Malignant +1,1,1,1,1,1,3,1,1,Benign +7,2,4,1,6,10,5,4,3,Malignant +10,10,8,6,4,5,8,10,1,Malignant +4,1,1,1,2,3,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +5,5,5,6,3,10,3,1,1,Malignant +1,2,2,1,2,1,2,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +1,1,2,1,3,4,1,1,1,Benign +9,9,10,3,6,10,7,10,6,Malignant +10,7,7,4,5,10,5,7,2,Malignant +4,1,1,1,2,1,3,2,1,Benign +3,1,1,1,2,1,3,1,1,Benign +1,1,1,2,1,3,1,1,7,Benign +5,1,1,1,2,4,3,1,1,Benign +4,1,1,1,2,2,3,2,1,Benign +5,6,7,8,8,10,3,10,3,Malignant +10,8,10,10,6,1,3,1,10,Malignant +3,1,1,1,2,1,3,1,1,Benign +1,1,1,2,1,1,1,1,1,Benign +3,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +6,10,10,10,8,10,10,10,7,Malignant +8,6,5,4,3,10,6,1,1,Malignant +5,8,7,7,10,10,5,7,1,Malignant +2,1,1,1,2,1,3,1,1,Benign +5,10,10,3,8,1,5,10,3,Malignant +4,1,1,1,2,1,3,1,1,Benign +5,3,3,3,6,10,3,1,1,Malignant +1,1,1,1,1,1,3,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +6,1,1,1,2,1,3,1,1,Benign +5,8,8,8,5,10,7,8,1,Malignant +8,7,6,4,4,10,5,1,1,Malignant +2,1,1,1,1,1,3,1,1,Benign +1,5,8,6,5,8,7,10,1,Malignant +10,5,6,10,6,10,7,7,10,Malignant +5,8,4,10,5,8,9,10,1,Malignant +1,2,3,1,2,1,3,1,1,Benign +10,10,10,8,6,8,7,10,1,Malignant +7,5,10,10,10,10,4,10,3,Malignant +5,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +3,1,1,1,2,1,3,1,1,Benign +4,1,1,1,2,1,3,1,1,Benign +8,4,4,5,4,7,7,8,2,Benign +5,1,1,4,2,1,3,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +9,7,7,5,5,10,7,8,3,Malignant +10,8,8,4,10,10,8,1,1,Malignant +1,1,1,1,2,1,3,1,1,Benign +5,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +5,10,10,9,6,10,7,10,5,Malignant +10,10,9,3,7,5,3,5,1,Malignant +1,1,1,1,1,1,3,1,1,Benign +1,1,1,1,1,1,3,1,1,Benign +5,1,1,1,1,1,3,1,1,Benign +8,10,10,10,5,10,8,10,6,Malignant +8,10,8,8,4,8,7,7,1,Malignant +1,1,1,1,2,1,3,1,1,Benign +10,10,10,10,7,10,7,10,4,Malignant +10,10,10,10,3,10,10,6,1,Malignant +8,7,8,7,5,5,5,10,2,Malignant +1,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +6,10,7,7,6,4,8,10,2,Malignant +6,1,3,1,2,1,3,1,1,Benign +1,1,1,2,2,1,3,1,1,Benign +10,6,4,3,10,10,9,10,1,Malignant +4,1,1,3,1,5,2,1,1,Malignant +7,5,6,3,3,8,7,4,1,Malignant +10,5,5,6,3,10,7,9,2,Malignant +1,1,1,1,2,1,2,1,1,Benign +10,5,7,4,4,10,8,9,1,Malignant +8,9,9,5,3,5,7,7,1,Malignant +1,1,1,1,1,1,3,1,1,Benign +10,10,10,3,10,10,9,10,1,Malignant +7,4,7,4,3,7,7,6,1,Malignant +6,8,7,5,6,8,8,9,2,Malignant +8,4,6,3,3,1,4,3,1,Benign +10,4,5,5,5,10,4,1,1,Malignant +3,3,2,1,3,1,3,6,1,Benign +3,1,4,1,2,4,3,1,1,Benign +10,8,8,2,8,10,4,8,10,Malignant +9,8,8,5,6,2,4,10,4,Malignant +8,10,10,8,6,9,3,10,10,Malignant +10,4,3,2,3,10,5,3,2,Malignant +5,1,3,3,2,2,2,3,1,Benign +3,1,1,3,1,1,3,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,5,5,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +5,1,1,2,2,2,3,1,1,Benign +8,10,10,8,5,10,7,8,1,Malignant +8,4,4,1,2,9,3,3,1,Malignant +4,1,1,1,2,1,3,6,1,Benign +3,1,1,1,2,4,3,1,1,Benign +1,2,2,1,2,1,1,1,1,Benign +10,4,4,10,2,10,5,3,3,Malignant +6,3,3,5,3,10,3,5,3,Benign +6,10,10,2,8,10,7,3,3,Malignant +9,10,10,1,10,8,3,3,1,Malignant +5,6,6,2,4,10,3,6,1,Malignant +3,1,1,1,2,1,1,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +3,1,1,1,2,1,3,1,1,Benign +5,7,7,1,5,8,3,4,1,Benign +10,5,8,10,3,10,5,1,3,Malignant +5,10,10,6,10,10,10,6,5,Malignant +8,8,9,4,5,10,7,8,1,Malignant +10,4,4,10,6,10,5,5,1,Malignant +7,9,4,10,10,3,5,3,3,Malignant +5,1,4,1,2,1,3,2,1,Benign +10,10,6,3,3,10,4,3,2,Malignant +3,3,5,2,3,10,7,1,1,Malignant +10,8,8,2,3,4,8,7,8,Malignant +1,1,1,1,2,1,3,1,1,Benign +8,4,7,1,3,10,3,9,2,Malignant +5,1,1,1,2,1,3,1,1,Benign +3,3,5,2,3,10,7,1,1,Malignant +7,2,4,1,3,4,3,3,1,Malignant +3,1,1,1,2,1,3,2,1,Benign +3,1,3,1,2,4,2,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +10,5,7,3,3,7,3,3,8,Malignant +3,1,1,1,2,1,3,1,1,Benign +2,1,1,2,2,1,3,1,1,Benign +1,4,3,10,4,10,5,6,1,Malignant +10,4,6,1,2,10,5,3,1,Malignant +7,4,5,10,2,10,3,8,2,Malignant +8,10,10,10,8,10,10,7,3,Malignant +10,10,10,10,10,10,4,10,10,Malignant +3,1,1,1,3,1,2,1,1,Benign +6,1,3,1,4,5,5,10,1,Malignant +5,6,6,8,6,10,4,10,4,Malignant +1,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +8,8,8,1,2,4,6,10,1,Malignant +10,4,4,6,2,10,2,3,1,Malignant +1,1,1,1,2,4,2,1,1,Benign +5,5,7,8,6,10,7,4,1,Malignant +5,3,4,3,4,5,4,7,1,Benign +5,4,3,1,2,4,2,3,1,Benign +8,2,1,1,5,1,1,1,1,Benign +9,1,2,6,4,10,7,7,2,Malignant +8,4,10,5,4,4,7,10,1,Malignant +1,1,1,1,2,1,3,1,1,Benign +10,10,10,7,9,10,7,10,10,Malignant +1,1,1,1,2,1,3,1,1,Benign +8,3,4,9,3,10,3,3,1,Malignant +10,8,4,4,4,10,3,10,4,Malignant +1,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +7,8,7,6,4,3,8,8,4,Malignant +3,1,1,1,2,5,5,1,1,Benign +2,1,1,1,3,1,2,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +8,6,4,10,10,1,3,5,1,Malignant +1,1,1,1,2,1,1,1,1,Benign +1,1,1,1,1,1,2,1,1,Benign +4,6,5,6,7,4,4,9,1,Benign +5,5,5,2,5,10,4,3,1,Malignant +6,8,7,8,6,8,8,9,1,Malignant +1,1,1,1,5,1,3,1,1,Benign +4,4,4,4,6,5,7,3,1,Benign +7,6,3,2,5,10,7,4,6,Malignant +3,1,1,1,2,4,3,1,1,Benign +3,1,1,1,2,1,3,1,1,Benign +5,4,6,10,2,10,4,1,1,Malignant +1,1,1,1,2,1,3,1,1,Benign +3,2,2,1,2,1,2,3,1,Benign +10,1,1,1,2,10,5,4,1,Malignant +1,1,1,1,2,1,2,1,1,Benign +8,10,3,2,6,4,3,10,1,Malignant +10,4,6,4,5,10,7,1,1,Malignant +10,4,7,2,2,8,6,1,1,Malignant +5,1,1,1,2,1,3,1,2,Benign +5,2,2,2,2,1,2,2,1,Benign +5,4,6,6,4,10,4,3,1,Malignant +8,6,7,3,3,10,3,4,2,Malignant +1,1,1,1,2,1,1,1,1,Benign +6,5,5,8,4,10,3,4,1,Malignant +1,1,1,1,2,1,3,1,1,Benign +1,1,1,1,1,1,2,1,1,Benign +8,5,5,5,2,10,4,3,1,Malignant +10,3,3,1,2,10,7,6,1,Malignant +1,1,1,1,2,1,3,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +7,6,4,8,10,10,9,5,3,Malignant +1,1,1,1,2,1,1,1,1,Benign +5,2,2,2,3,1,1,3,1,Benign +1,1,1,1,1,1,1,3,1,Benign +3,4,4,10,5,1,3,3,1,Malignant +4,2,3,5,3,8,7,6,1,Malignant +5,1,1,3,2,1,1,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +3,4,5,3,7,3,4,6,1,Benign +2,7,10,10,7,10,4,9,4,Malignant +1,1,1,1,2,1,2,1,1,Benign +4,1,1,1,3,1,2,2,1,Benign +5,3,3,1,3,3,3,3,3,Malignant +8,10,10,7,10,10,7,3,8,Malignant +8,10,5,3,8,4,4,10,3,Malignant +10,3,5,4,3,7,3,5,3,Malignant +6,10,10,10,10,10,8,10,10,Malignant +3,10,3,10,6,10,5,1,4,Malignant +3,2,2,1,4,3,2,1,1,Benign +4,4,4,2,2,3,2,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +6,10,10,10,8,10,7,10,7,Malignant +5,8,8,10,5,10,8,10,3,Malignant +1,1,3,1,2,1,1,1,1,Benign +1,1,3,1,1,1,2,1,1,Benign +4,3,2,1,3,1,2,1,1,Benign +1,1,3,1,2,1,1,1,1,Benign +4,1,2,1,2,1,2,1,1,Benign +5,1,1,2,2,1,2,1,1,Benign +3,1,2,1,2,1,2,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +1,1,1,1,1,1,2,1,1,Benign +3,1,1,4,3,1,2,2,1,Benign +5,3,4,1,4,1,3,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +10,6,3,6,4,10,7,8,4,Malignant +3,2,2,2,2,1,3,2,1,Benign +2,1,1,1,2,1,1,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +3,3,2,2,3,1,1,2,3,Benign +7,6,6,3,2,10,7,1,1,Malignant +5,3,3,2,3,1,3,1,1,Benign +2,1,1,1,2,1,2,2,1,Benign +5,1,1,1,3,2,2,2,1,Benign +1,1,1,2,2,1,2,1,1,Benign +10,8,7,4,3,10,7,9,1,Malignant +3,1,1,1,2,1,2,1,1,Benign +1,1,1,1,1,1,1,1,1,Benign +1,2,3,1,2,1,2,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +3,1,1,1,2,1,3,1,1,Benign +4,1,1,1,2,1,1,1,1,Benign +3,2,1,1,2,1,2,2,1,Benign +1,2,3,1,2,1,1,1,1,Benign +3,10,8,7,6,9,9,3,8,Malignant +3,1,1,1,2,1,1,1,1,Benign +5,3,3,1,2,1,2,1,1,Benign +3,1,1,1,2,4,1,1,1,Benign +1,2,1,3,2,1,1,2,1,Benign +1,1,1,1,2,1,2,1,1,Benign +4,2,2,1,2,1,2,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +2,3,2,2,2,2,3,1,1,Benign +3,1,2,1,2,1,2,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +1,1,1,1,1,4,2,1,1,Benign +10,10,10,6,8,4,8,5,1,Malignant +5,1,2,1,2,1,3,1,1,Benign +8,5,6,2,3,10,6,6,1,Malignant +3,3,2,6,3,3,3,5,1,Benign +8,7,8,5,10,10,7,2,1,Malignant +1,1,1,1,2,1,2,1,1,Benign +5,2,2,2,2,2,3,2,2,Benign +2,3,1,1,5,1,1,1,1,Benign +3,2,2,3,2,3,3,1,1,Benign +10,10,10,7,10,10,8,2,1,Malignant +4,3,3,1,2,1,3,3,1,Benign +5,1,3,1,2,1,2,1,1,Benign +3,1,1,1,2,1,1,1,1,Benign +9,10,10,10,10,10,10,10,1,Malignant +5,3,6,1,2,1,1,1,1,Benign +8,7,8,2,4,2,5,10,1,Malignant +1,1,1,1,2,1,2,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +1,3,1,1,2,1,2,2,1,Benign +5,1,1,3,4,1,3,2,1,Benign +5,1,1,1,2,1,2,2,1,Benign +3,2,2,3,2,1,1,1,1,Benign +6,9,7,5,5,8,4,2,1,Benign +10,8,10,1,3,10,5,1,1,Malignant +10,10,10,1,6,1,2,8,1,Malignant +4,1,1,1,2,1,1,1,1,Benign +4,1,3,3,2,1,1,1,1,Benign +5,1,1,1,2,1,1,1,1,Benign +10,4,3,10,4,10,10,1,1,Malignant +5,2,2,4,2,4,1,1,1,Benign +1,1,1,3,2,3,1,1,1,Benign +1,1,1,1,2,2,1,1,1,Benign +5,1,1,6,3,1,2,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +5,1,1,1,2,1,1,1,1,Benign +1,1,1,1,1,1,1,1,1,Benign +5,7,9,8,6,10,8,10,1,Malignant +4,1,1,3,1,1,2,1,1,Benign +5,1,1,1,2,1,1,1,1,Benign +3,1,1,3,2,1,1,1,1,Benign +4,5,5,8,6,10,10,7,1,Malignant +2,3,1,1,3,1,1,1,1,Benign +10,2,2,1,2,6,1,1,2,Malignant +10,6,5,8,5,10,8,6,1,Malignant +8,8,9,6,6,3,10,10,1,Malignant +5,1,2,1,2,1,1,1,1,Benign +5,1,3,1,2,1,1,1,1,Benign +5,1,1,3,2,1,1,1,1,Benign +3,1,1,1,2,5,1,1,1,Benign +6,1,1,3,2,1,1,1,1,Benign +4,1,1,1,2,1,1,2,1,Benign +4,1,1,1,2,1,1,1,1,Benign +10,9,8,7,6,4,7,10,3,Malignant +10,6,6,2,4,10,9,7,1,Malignant +6,6,6,5,4,10,7,6,2,Malignant +4,1,1,1,2,1,1,1,1,Benign +1,1,2,1,2,1,2,1,1,Benign +3,1,1,1,1,1,2,1,1,Benign +6,1,1,3,2,1,1,1,1,Benign +6,1,1,1,1,1,1,1,1,Benign +4,1,1,1,2,1,1,1,1,Benign +5,1,1,1,2,1,1,1,1,Benign +3,1,1,1,2,1,1,1,1,Benign +4,1,2,1,2,1,1,1,1,Benign +4,1,1,1,2,1,1,1,1,Benign +5,2,1,1,2,1,1,1,1,Benign +4,8,7,10,4,10,7,5,1,Malignant +5,1,1,1,1,1,1,1,1,Benign +5,3,2,4,2,1,1,1,1,Benign +9,10,10,10,10,5,10,10,10,Malignant +8,7,8,5,5,10,9,10,1,Malignant +5,1,2,1,2,1,1,1,1,Benign +1,1,1,3,1,3,1,1,1,Benign +3,1,1,1,1,1,2,1,1,Benign +10,10,10,10,6,10,8,1,5,Malignant +3,6,4,10,3,3,3,4,1,Malignant +6,3,2,1,3,4,4,1,1,Malignant +1,1,1,1,2,1,1,1,1,Benign +5,8,9,4,3,10,7,1,1,Malignant +4,1,1,1,1,1,2,1,1,Benign +5,10,10,10,6,10,6,5,2,Malignant +5,1,2,10,4,5,2,1,1,Benign +3,1,1,1,1,1,2,1,1,Benign +1,1,1,1,1,1,1,1,1,Benign +4,2,1,1,2,1,1,1,1,Benign +4,1,1,1,2,1,2,1,1,Benign +4,1,1,1,2,1,2,1,1,Benign +6,1,1,1,2,1,3,1,1,Benign +4,1,1,1,2,1,2,1,1,Benign +4,1,1,2,2,1,2,1,1,Benign +4,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +3,3,1,1,2,1,1,1,1,Benign +8,10,10,10,7,5,4,8,7,Malignant +1,1,1,1,2,4,1,1,1,Benign +5,1,1,1,2,1,1,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +5,1,1,1,2,1,1,1,1,Benign +3,1,1,1,1,1,2,1,1,Benign +6,6,7,10,3,10,8,10,2,Malignant +4,10,4,7,3,10,9,10,1,Malignant +1,1,1,1,1,1,1,1,1,Benign +1,1,1,1,1,1,2,1,1,Benign +3,1,2,2,2,1,1,1,1,Benign +4,7,8,3,4,10,9,1,1,Malignant +1,1,1,1,3,1,1,1,1,Benign +4,1,1,1,3,1,1,1,1,Benign +10,4,5,4,3,5,7,3,1,Malignant +7,5,6,10,4,10,5,3,1,Malignant +3,1,1,1,2,1,2,1,1,Benign +3,1,1,2,2,1,1,1,1,Benign +4,1,1,1,2,1,1,1,1,Benign +4,1,1,1,2,1,3,1,1,Benign +6,1,3,2,2,1,1,1,1,Benign +4,1,1,1,1,1,2,1,1,Benign +7,4,4,3,4,10,6,9,1,Malignant +4,2,2,1,2,1,2,1,1,Benign +1,1,1,1,1,1,3,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +1,1,3,2,2,1,3,1,1,Benign +5,1,1,1,2,1,3,1,1,Benign +5,1,2,1,2,1,3,1,1,Benign +4,1,1,1,2,1,2,1,1,Benign +6,1,1,1,2,1,2,1,1,Benign +5,1,1,1,2,2,2,1,1,Benign +3,1,1,1,2,1,1,1,1,Benign +5,3,1,1,2,1,1,1,1,Benign +4,1,1,1,2,1,2,1,1,Benign +2,1,3,2,2,1,2,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +6,10,10,10,4,10,7,10,1,Malignant +2,1,1,1,1,1,1,1,1,Benign +3,1,1,1,1,1,1,1,1,Benign +7,8,3,7,4,5,7,8,2,Malignant +3,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +3,2,2,2,2,1,4,2,1,Benign +4,4,2,1,2,5,2,1,2,Benign +3,1,1,1,2,1,1,1,1,Benign +4,3,1,1,2,1,4,8,1,Benign +5,2,2,2,1,1,2,1,1,Benign +5,1,1,3,2,1,1,1,1,Benign +2,1,1,1,2,1,2,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +5,1,1,1,2,1,3,1,1,Benign +5,1,1,1,2,1,3,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +4,1,1,1,2,1,3,2,1,Benign +5,7,10,10,5,10,10,10,1,Malignant +3,1,2,1,2,1,3,1,1,Benign +4,1,1,1,2,3,2,1,1,Benign +8,4,4,1,6,10,2,5,2,Malignant +10,10,8,10,6,5,10,3,1,Malignant +8,10,4,4,8,10,8,2,1,Malignant +7,6,10,5,3,10,9,10,2,Malignant +3,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +10,9,7,3,4,2,7,7,1,Malignant +5,1,2,1,2,1,3,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,3,1,1,Benign +5,1,2,1,2,1,2,1,1,Benign +5,7,10,6,5,10,7,5,1,Malignant +6,10,5,5,4,10,6,10,1,Malignant +3,1,1,1,2,1,1,1,1,Benign +5,1,1,6,3,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +8,10,10,10,6,10,10,10,1,Malignant +5,1,1,1,2,1,2,2,1,Benign +9,8,8,9,6,3,4,1,1,Malignant +5,1,1,1,2,1,1,1,1,Benign +4,10,8,5,4,1,10,1,1,Malignant +2,5,7,6,4,10,7,6,1,Malignant +10,3,4,5,3,10,4,1,1,Malignant +5,1,2,1,2,1,1,1,1,Benign +4,8,6,3,4,10,7,1,1,Malignant +5,1,1,1,2,1,2,1,1,Benign +4,1,2,1,2,1,2,1,1,Benign +5,1,3,1,2,1,3,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +5,2,4,1,1,1,1,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +1,1,1,1,1,1,2,1,1,Benign +4,1,1,1,2,1,2,1,1,Benign +5,4,6,8,4,1,8,10,1,Malignant +5,3,2,8,5,10,8,1,2,Malignant +10,5,10,3,5,8,7,8,3,Malignant +4,1,1,2,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +5,10,10,10,10,10,10,1,1,Malignant +5,1,1,1,2,1,1,1,1,Benign +10,4,3,10,3,10,7,1,2,Malignant +5,10,10,10,5,2,8,5,1,Malignant +8,10,10,10,6,10,10,10,10,Malignant +2,3,1,1,2,1,2,1,1,Benign +2,1,1,1,1,1,2,1,1,Benign +4,1,3,1,2,1,2,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +1,1,1,1,1,4,1,1,1,Benign +4,1,1,1,2,1,2,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +6,3,3,3,3,2,6,1,1,Benign +7,1,2,3,2,1,2,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +5,1,1,2,1,1,2,1,1,Benign +3,1,3,1,3,4,1,1,1,Benign +4,6,6,5,7,6,7,7,3,Malignant +2,1,1,1,2,5,1,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +4,1,1,1,2,1,1,1,1,Benign +6,2,3,1,2,1,1,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +8,7,4,4,5,3,5,10,1,Malignant +3,1,1,1,2,1,1,1,1,Benign +3,1,4,1,2,1,1,1,1,Benign +10,10,7,8,7,1,10,10,3,Malignant +4,2,4,3,2,2,2,1,1,Benign +4,1,1,1,2,1,1,1,1,Benign +5,1,1,3,2,1,1,1,1,Benign +4,1,1,3,2,1,1,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +1,2,2,1,2,1,1,1,1,Benign +1,1,1,3,2,1,1,1,1,Benign +5,10,10,10,10,2,10,10,10,Malignant +3,1,1,1,2,1,2,1,1,Benign +3,1,1,2,3,4,1,1,1,Benign +1,2,1,3,2,1,2,1,1,Benign +5,1,1,1,2,1,2,2,1,Benign +4,1,1,1,2,1,2,1,1,Benign +3,1,1,1,2,1,3,1,1,Benign +3,1,1,1,2,1,2,1,1,Benign +5,1,1,1,2,1,2,1,1,Benign +5,4,5,1,8,1,3,6,1,Benign +7,8,8,7,3,10,7,2,3,Malignant +1,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +4,1,1,1,2,1,3,1,1,Benign +1,1,3,1,2,1,2,1,1,Benign +1,1,3,1,2,1,2,1,1,Benign +3,1,1,3,2,1,2,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +5,2,2,2,2,1,1,1,2,Benign +3,1,1,1,2,1,3,1,1,Benign +5,7,4,1,6,1,7,10,3,Malignant +5,10,10,8,5,5,7,10,1,Malignant +3,10,7,8,5,8,7,4,1,Malignant +3,2,1,2,2,1,3,1,1,Benign +2,1,1,1,2,1,3,1,1,Benign +5,3,2,1,3,1,1,1,1,Benign +1,1,1,1,2,1,2,1,1,Benign +4,1,4,1,2,1,1,1,1,Benign +1,1,2,1,2,1,2,1,1,Benign +5,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +10,10,10,10,5,10,10,10,7,Malignant +5,10,10,10,4,10,5,6,3,Malignant +5,1,1,1,2,1,3,2,1,Benign +1,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,1,Benign +3,1,1,1,2,1,2,3,1,Benign +4,1,1,1,2,1,1,1,1,Benign +1,1,1,1,2,1,1,1,8,Benign +1,1,1,3,2,1,1,1,1,Benign +5,10,10,5,4,5,4,4,1,Malignant +3,1,1,1,2,1,1,1,1,Benign +3,1,1,1,2,1,2,1,2,Benign +3,1,1,1,3,2,1,1,1,Benign +2,1,1,1,2,1,1,1,1,Benign +5,10,10,3,7,3,8,10,2,Malignant +4,8,6,4,3,4,10,6,1,Malignant +4,8,8,5,4,5,10,4,1,Malignant \ No newline at end of file diff --git a/extra_data_sets/diabetes.csv b/extra_data_sets/diabetes.csv new file mode 100755 index 0000000..6c330aa --- /dev/null +++ b/extra_data_sets/diabetes.csv @@ -0,0 +1,769 @@ +Pregnancies,Glucose,BloodPressure,SkinThickness,Insulin,BMI,DPF,Age,Outcome* +6,148,72,35,0,33.6,0.627,50,Positive +1,85,66,29,0,26.6,0.351,31,Negative +8,183,64,0,0,23.3,0.672,32,Positive +1,89,66,23,94,28.1,0.167,21,Negative +0,137,40,35,168,43.1,2.288,33,Positive +5,116,74,0,0,25.6,0.201,30,Negative +3,78,50,32,88,31,0.248,26,Positive +10,115,0,0,0,35.3,0.134,29,Negative +2,197,70,45,543,30.5,0.158,53,Positive +8,125,96,0,0,0,0.232,54,Positive +4,110,92,0,0,37.6,0.191,30,Negative +10,168,74,0,0,38,0.537,34,Positive +10,139,80,0,0,27.1,1.441,57,Negative +1,189,60,23,846,30.1,0.398,59,Positive +5,166,72,19,175,25.8,0.587,51,Positive +7,100,0,0,0,30,0.484,32,Positive +0,118,84,47,230,45.8,0.551,31,Positive +7,107,74,0,0,29.6,0.254,31,Positive +1,103,30,38,83,43.3,0.183,33,Negative +1,115,70,30,96,34.6,0.529,32,Positive +3,126,88,41,235,39.3,0.704,27,Negative +8,99,84,0,0,35.4,0.388,50,Negative +7,196,90,0,0,39.8,0.451,41,Positive +9,119,80,35,0,29,0.263,29,Positive +11,143,94,33,146,36.6,0.254,51,Positive +10,125,70,26,115,31.1,0.205,41,Positive +7,147,76,0,0,39.4,0.257,43,Positive +1,97,66,15,140,23.2,0.487,22,Negative +13,145,82,19,110,22.2,0.245,57,Negative +5,117,92,0,0,34.1,0.337,38,Negative +5,109,75,26,0,36,0.546,60,Negative +3,158,76,36,245,31.6,0.851,28,Positive +3,88,58,11,54,24.8,0.267,22,Negative +6,92,92,0,0,19.9,0.188,28,Negative +10,122,78,31,0,27.6,0.512,45,Negative +4,103,60,33,192,24,0.966,33,Negative +11,138,76,0,0,33.2,0.42,35,Negative +9,102,76,37,0,32.9,0.665,46,Positive +2,90,68,42,0,38.2,0.503,27,Positive +4,111,72,47,207,37.1,1.39,56,Positive +3,180,64,25,70,34,0.271,26,Negative +7,133,84,0,0,40.2,0.696,37,Negative +7,106,92,18,0,22.7,0.235,48,Negative +9,171,110,24,240,45.4,0.721,54,Positive +7,159,64,0,0,27.4,0.294,40,Negative +0,180,66,39,0,42,1.893,25,Positive +1,146,56,0,0,29.7,0.564,29,Negative +2,71,70,27,0,28,0.586,22,Negative +7,103,66,32,0,39.1,0.344,31,Positive +7,105,0,0,0,0,0.305,24,Negative +1,103,80,11,82,19.4,0.491,22,Negative +1,101,50,15,36,24.2,0.526,26,Negative +5,88,66,21,23,24.4,0.342,30,Negative +8,176,90,34,300,33.7,0.467,58,Positive +7,150,66,42,342,34.7,0.718,42,Negative +1,73,50,10,0,23,0.248,21,Negative +7,187,68,39,304,37.7,0.254,41,Positive +0,100,88,60,110,46.8,0.962,31,Negative +0,146,82,0,0,40.5,1.781,44,Negative +0,105,64,41,142,41.5,0.173,22,Negative +2,84,0,0,0,0,0.304,21,Negative +8,133,72,0,0,32.9,0.27,39,Positive +5,44,62,0,0,25,0.587,36,Negative +2,141,58,34,128,25.4,0.699,24,Negative +7,114,66,0,0,32.8,0.258,42,Positive +5,99,74,27,0,29,0.203,32,Negative +0,109,88,30,0,32.5,0.855,38,Positive +2,109,92,0,0,42.7,0.845,54,Negative +1,95,66,13,38,19.6,0.334,25,Negative +4,146,85,27,100,28.9,0.189,27,Negative +2,100,66,20,90,32.9,0.867,28,Positive +5,139,64,35,140,28.6,0.411,26,Negative +13,126,90,0,0,43.4,0.583,42,Positive +4,129,86,20,270,35.1,0.231,23,Negative +1,79,75,30,0,32,0.396,22,Negative +1,0,48,20,0,24.7,0.14,22,Negative +7,62,78,0,0,32.6,0.391,41,Negative +5,95,72,33,0,37.7,0.37,27,Negative +0,131,0,0,0,43.2,0.27,26,Positive +2,112,66,22,0,25,0.307,24,Negative +3,113,44,13,0,22.4,0.14,22,Negative +2,74,0,0,0,0,0.102,22,Negative +7,83,78,26,71,29.3,0.767,36,Negative +0,101,65,28,0,24.6,0.237,22,Negative +5,137,108,0,0,48.8,0.227,37,Positive +2,110,74,29,125,32.4,0.698,27,Negative +13,106,72,54,0,36.6,0.178,45,Negative +2,100,68,25,71,38.5,0.324,26,Negative +15,136,70,32,110,37.1,0.153,43,Positive +1,107,68,19,0,26.5,0.165,24,Negative +1,80,55,0,0,19.1,0.258,21,Negative +4,123,80,15,176,32,0.443,34,Negative +7,81,78,40,48,46.7,0.261,42,Negative +4,134,72,0,0,23.8,0.277,60,Positive +2,142,82,18,64,24.7,0.761,21,Negative +6,144,72,27,228,33.9,0.255,40,Negative +2,92,62,28,0,31.6,0.13,24,Negative +1,71,48,18,76,20.4,0.323,22,Negative +6,93,50,30,64,28.7,0.356,23,Negative +1,122,90,51,220,49.7,0.325,31,Positive +1,163,72,0,0,39,1.222,33,Positive +1,151,60,0,0,26.1,0.179,22,Negative +0,125,96,0,0,22.5,0.262,21,Negative +1,81,72,18,40,26.6,0.283,24,Negative +2,85,65,0,0,39.6,0.93,27,Negative +1,126,56,29,152,28.7,0.801,21,Negative +1,96,122,0,0,22.4,0.207,27,Negative +4,144,58,28,140,29.5,0.287,37,Negative +3,83,58,31,18,34.3,0.336,25,Negative +0,95,85,25,36,37.4,0.247,24,Positive +3,171,72,33,135,33.3,0.199,24,Positive +8,155,62,26,495,34,0.543,46,Positive +1,89,76,34,37,31.2,0.192,23,Negative +4,76,62,0,0,34,0.391,25,Negative +7,160,54,32,175,30.5,0.588,39,Positive +4,146,92,0,0,31.2,0.539,61,Positive +5,124,74,0,0,34,0.22,38,Positive +5,78,48,0,0,33.7,0.654,25,Negative +4,97,60,23,0,28.2,0.443,22,Negative +4,99,76,15,51,23.2,0.223,21,Negative +0,162,76,56,100,53.2,0.759,25,Positive +6,111,64,39,0,34.2,0.26,24,Negative +2,107,74,30,100,33.6,0.404,23,Negative +5,132,80,0,0,26.8,0.186,69,Negative +0,113,76,0,0,33.3,0.278,23,Positive +1,88,30,42,99,55,0.496,26,Positive +3,120,70,30,135,42.9,0.452,30,Negative +1,118,58,36,94,33.3,0.261,23,Negative +1,117,88,24,145,34.5,0.403,40,Positive +0,105,84,0,0,27.9,0.741,62,Positive +4,173,70,14,168,29.7,0.361,33,Positive +9,122,56,0,0,33.3,1.114,33,Positive +3,170,64,37,225,34.5,0.356,30,Positive +8,84,74,31,0,38.3,0.457,39,Negative +2,96,68,13,49,21.1,0.647,26,Negative +2,125,60,20,140,33.8,0.088,31,Negative +0,100,70,26,50,30.8,0.597,21,Negative +0,93,60,25,92,28.7,0.532,22,Negative +0,129,80,0,0,31.2,0.703,29,Negative +5,105,72,29,325,36.9,0.159,28,Negative +3,128,78,0,0,21.1,0.268,55,Negative +5,106,82,30,0,39.5,0.286,38,Negative +2,108,52,26,63,32.5,0.318,22,Negative +10,108,66,0,0,32.4,0.272,42,Positive +4,154,62,31,284,32.8,0.237,23,Negative +0,102,75,23,0,0,0.572,21,Negative +9,57,80,37,0,32.8,0.096,41,Negative +2,106,64,35,119,30.5,1.4,34,Negative +5,147,78,0,0,33.7,0.218,65,Negative +2,90,70,17,0,27.3,0.085,22,Negative +1,136,74,50,204,37.4,0.399,24,Negative +4,114,65,0,0,21.9,0.432,37,Negative +9,156,86,28,155,34.3,1.189,42,Positive +1,153,82,42,485,40.6,0.687,23,Negative +8,188,78,0,0,47.9,0.137,43,Positive +7,152,88,44,0,50,0.337,36,Positive +2,99,52,15,94,24.6,0.637,21,Negative +1,109,56,21,135,25.2,0.833,23,Negative +2,88,74,19,53,29,0.229,22,Negative +17,163,72,41,114,40.9,0.817,47,Positive +4,151,90,38,0,29.7,0.294,36,Negative +7,102,74,40,105,37.2,0.204,45,Negative +0,114,80,34,285,44.2,0.167,27,Negative +2,100,64,23,0,29.7,0.368,21,Negative +0,131,88,0,0,31.6,0.743,32,Positive +6,104,74,18,156,29.9,0.722,41,Positive +3,148,66,25,0,32.5,0.256,22,Negative +4,120,68,0,0,29.6,0.709,34,Negative +4,110,66,0,0,31.9,0.471,29,Negative +3,111,90,12,78,28.4,0.495,29,Negative +6,102,82,0,0,30.8,0.18,36,Positive +6,134,70,23,130,35.4,0.542,29,Positive +2,87,0,23,0,28.9,0.773,25,Negative +1,79,60,42,48,43.5,0.678,23,Negative +2,75,64,24,55,29.7,0.37,33,Negative +8,179,72,42,130,32.7,0.719,36,Positive +6,85,78,0,0,31.2,0.382,42,Negative +0,129,110,46,130,67.1,0.319,26,Positive +5,143,78,0,0,45,0.19,47,Negative +5,130,82,0,0,39.1,0.956,37,Positive +6,87,80,0,0,23.2,0.084,32,Negative +0,119,64,18,92,34.9,0.725,23,Negative +1,0,74,20,23,27.7,0.299,21,Negative +5,73,60,0,0,26.8,0.268,27,Negative +4,141,74,0,0,27.6,0.244,40,Negative +7,194,68,28,0,35.9,0.745,41,Positive +8,181,68,36,495,30.1,0.615,60,Positive +1,128,98,41,58,32,1.321,33,Positive +8,109,76,39,114,27.9,0.64,31,Positive +5,139,80,35,160,31.6,0.361,25,Positive +3,111,62,0,0,22.6,0.142,21,Negative +9,123,70,44,94,33.1,0.374,40,Negative +7,159,66,0,0,30.4,0.383,36,Positive +11,135,0,0,0,52.3,0.578,40,Positive +8,85,55,20,0,24.4,0.136,42,Negative +5,158,84,41,210,39.4,0.395,29,Positive +1,105,58,0,0,24.3,0.187,21,Negative +3,107,62,13,48,22.9,0.678,23,Positive +4,109,64,44,99,34.8,0.905,26,Positive +4,148,60,27,318,30.9,0.15,29,Positive +0,113,80,16,0,31,0.874,21,Negative +1,138,82,0,0,40.1,0.236,28,Negative +0,108,68,20,0,27.3,0.787,32,Negative +2,99,70,16,44,20.4,0.235,27,Negative +6,103,72,32,190,37.7,0.324,55,Negative +5,111,72,28,0,23.9,0.407,27,Negative +8,196,76,29,280,37.5,0.605,57,Positive +5,162,104,0,0,37.7,0.151,52,Positive +1,96,64,27,87,33.2,0.289,21,Negative +7,184,84,33,0,35.5,0.355,41,Positive +2,81,60,22,0,27.7,0.29,25,Negative +0,147,85,54,0,42.8,0.375,24,Negative +7,179,95,31,0,34.2,0.164,60,Negative +0,140,65,26,130,42.6,0.431,24,Positive +9,112,82,32,175,34.2,0.26,36,Positive +12,151,70,40,271,41.8,0.742,38,Positive +5,109,62,41,129,35.8,0.514,25,Positive +6,125,68,30,120,30,0.464,32,Negative +5,85,74,22,0,29,1.224,32,Positive +5,112,66,0,0,37.8,0.261,41,Positive +0,177,60,29,478,34.6,1.072,21,Positive +2,158,90,0,0,31.6,0.805,66,Positive +7,119,0,0,0,25.2,0.209,37,Negative +7,142,60,33,190,28.8,0.687,61,Negative +1,100,66,15,56,23.6,0.666,26,Negative +1,87,78,27,32,34.6,0.101,22,Negative +0,101,76,0,0,35.7,0.198,26,Negative +3,162,52,38,0,37.2,0.652,24,Positive +4,197,70,39,744,36.7,2.329,31,Negative +0,117,80,31,53,45.2,0.089,24,Negative +4,142,86,0,0,44,0.645,22,Positive +6,134,80,37,370,46.2,0.238,46,Positive +1,79,80,25,37,25.4,0.583,22,Negative +4,122,68,0,0,35,0.394,29,Negative +3,74,68,28,45,29.7,0.293,23,Negative +4,171,72,0,0,43.6,0.479,26,Positive +7,181,84,21,192,35.9,0.586,51,Positive +0,179,90,27,0,44.1,0.686,23,Positive +9,164,84,21,0,30.8,0.831,32,Positive +0,104,76,0,0,18.4,0.582,27,Negative +1,91,64,24,0,29.2,0.192,21,Negative +4,91,70,32,88,33.1,0.446,22,Negative +3,139,54,0,0,25.6,0.402,22,Positive +6,119,50,22,176,27.1,1.318,33,Positive +2,146,76,35,194,38.2,0.329,29,Negative +9,184,85,15,0,30,1.213,49,Positive +10,122,68,0,0,31.2,0.258,41,Negative +0,165,90,33,680,52.3,0.427,23,Negative +9,124,70,33,402,35.4,0.282,34,Negative +1,111,86,19,0,30.1,0.143,23,Negative +9,106,52,0,0,31.2,0.38,42,Negative +2,129,84,0,0,28,0.284,27,Negative +2,90,80,14,55,24.4,0.249,24,Negative +0,86,68,32,0,35.8,0.238,25,Negative +12,92,62,7,258,27.6,0.926,44,Positive +1,113,64,35,0,33.6,0.543,21,Positive +3,111,56,39,0,30.1,0.557,30,Negative +2,114,68,22,0,28.7,0.092,25,Negative +1,193,50,16,375,25.9,0.655,24,Negative +11,155,76,28,150,33.3,1.353,51,Positive +3,191,68,15,130,30.9,0.299,34,Negative +3,141,0,0,0,30,0.761,27,Positive +4,95,70,32,0,32.1,0.612,24,Negative +3,142,80,15,0,32.4,0.2,63,Negative +4,123,62,0,0,32,0.226,35,Positive +5,96,74,18,67,33.6,0.997,43,Negative +0,138,0,0,0,36.3,0.933,25,Positive +2,128,64,42,0,40,1.101,24,Negative +0,102,52,0,0,25.1,0.078,21,Negative +2,146,0,0,0,27.5,0.24,28,Positive +10,101,86,37,0,45.6,1.136,38,Positive +2,108,62,32,56,25.2,0.128,21,Negative +3,122,78,0,0,23,0.254,40,Negative +1,71,78,50,45,33.2,0.422,21,Negative +13,106,70,0,0,34.2,0.251,52,Negative +2,100,70,52,57,40.5,0.677,25,Negative +7,106,60,24,0,26.5,0.296,29,Positive +0,104,64,23,116,27.8,0.454,23,Negative +5,114,74,0,0,24.9,0.744,57,Negative +2,108,62,10,278,25.3,0.881,22,Negative +0,146,70,0,0,37.9,0.334,28,Positive +10,129,76,28,122,35.9,0.28,39,Negative +7,133,88,15,155,32.4,0.262,37,Negative +7,161,86,0,0,30.4,0.165,47,Positive +2,108,80,0,0,27,0.259,52,Positive +7,136,74,26,135,26,0.647,51,Negative +5,155,84,44,545,38.7,0.619,34,Negative +1,119,86,39,220,45.6,0.808,29,Positive +4,96,56,17,49,20.8,0.34,26,Negative +5,108,72,43,75,36.1,0.263,33,Negative +0,78,88,29,40,36.9,0.434,21,Negative +0,107,62,30,74,36.6,0.757,25,Positive +2,128,78,37,182,43.3,1.224,31,Positive +1,128,48,45,194,40.5,0.613,24,Positive +0,161,50,0,0,21.9,0.254,65,Negative +6,151,62,31,120,35.5,0.692,28,Negative +2,146,70,38,360,28,0.337,29,Positive +0,126,84,29,215,30.7,0.52,24,Negative +14,100,78,25,184,36.6,0.412,46,Positive +8,112,72,0,0,23.6,0.84,58,Negative +0,167,0,0,0,32.3,0.839,30,Positive +2,144,58,33,135,31.6,0.422,25,Positive +5,77,82,41,42,35.8,0.156,35,Negative +5,115,98,0,0,52.9,0.209,28,Positive +3,150,76,0,0,21,0.207,37,Negative +2,120,76,37,105,39.7,0.215,29,Negative +10,161,68,23,132,25.5,0.326,47,Positive +0,137,68,14,148,24.8,0.143,21,Negative +0,128,68,19,180,30.5,1.391,25,Positive +2,124,68,28,205,32.9,0.875,30,Positive +6,80,66,30,0,26.2,0.313,41,Negative +0,106,70,37,148,39.4,0.605,22,Negative +2,155,74,17,96,26.6,0.433,27,Positive +3,113,50,10,85,29.5,0.626,25,Negative +7,109,80,31,0,35.9,1.127,43,Positive +2,112,68,22,94,34.1,0.315,26,Negative +3,99,80,11,64,19.3,0.284,30,Negative +3,182,74,0,0,30.5,0.345,29,Positive +3,115,66,39,140,38.1,0.15,28,Negative +6,194,78,0,0,23.5,0.129,59,Positive +4,129,60,12,231,27.5,0.527,31,Negative +3,112,74,30,0,31.6,0.197,25,Positive +0,124,70,20,0,27.4,0.254,36,Positive +13,152,90,33,29,26.8,0.731,43,Positive +2,112,75,32,0,35.7,0.148,21,Negative +1,157,72,21,168,25.6,0.123,24,Negative +1,122,64,32,156,35.1,0.692,30,Positive +10,179,70,0,0,35.1,0.2,37,Negative +2,102,86,36,120,45.5,0.127,23,Positive +6,105,70,32,68,30.8,0.122,37,Negative +8,118,72,19,0,23.1,1.476,46,Negative +2,87,58,16,52,32.7,0.166,25,Negative +1,180,0,0,0,43.3,0.282,41,Positive +12,106,80,0,0,23.6,0.137,44,Negative +1,95,60,18,58,23.9,0.26,22,Negative +0,165,76,43,255,47.9,0.259,26,Negative +0,117,0,0,0,33.8,0.932,44,Negative +5,115,76,0,0,31.2,0.343,44,Positive +9,152,78,34,171,34.2,0.893,33,Positive +7,178,84,0,0,39.9,0.331,41,Positive +1,130,70,13,105,25.9,0.472,22,Negative +1,95,74,21,73,25.9,0.673,36,Negative +1,0,68,35,0,32,0.389,22,Negative +5,122,86,0,0,34.7,0.29,33,Negative +8,95,72,0,0,36.8,0.485,57,Negative +8,126,88,36,108,38.5,0.349,49,Negative +1,139,46,19,83,28.7,0.654,22,Negative +3,116,0,0,0,23.5,0.187,23,Negative +3,99,62,19,74,21.8,0.279,26,Negative +5,0,80,32,0,41,0.346,37,Positive +4,92,80,0,0,42.2,0.237,29,Negative +4,137,84,0,0,31.2,0.252,30,Negative +3,61,82,28,0,34.4,0.243,46,Negative +1,90,62,12,43,27.2,0.58,24,Negative +3,90,78,0,0,42.7,0.559,21,Negative +9,165,88,0,0,30.4,0.302,49,Positive +1,125,50,40,167,33.3,0.962,28,Positive +13,129,0,30,0,39.9,0.569,44,Positive +12,88,74,40,54,35.3,0.378,48,Negative +1,196,76,36,249,36.5,0.875,29,Positive +5,189,64,33,325,31.2,0.583,29,Positive +5,158,70,0,0,29.8,0.207,63,Negative +5,103,108,37,0,39.2,0.305,65,Negative +4,146,78,0,0,38.5,0.52,67,Positive +4,147,74,25,293,34.9,0.385,30,Negative +5,99,54,28,83,34,0.499,30,Negative +6,124,72,0,0,27.6,0.368,29,Positive +0,101,64,17,0,21,0.252,21,Negative +3,81,86,16,66,27.5,0.306,22,Negative +1,133,102,28,140,32.8,0.234,45,Positive +3,173,82,48,465,38.4,2.137,25,Positive +0,118,64,23,89,0,1.731,21,Negative +0,84,64,22,66,35.8,0.545,21,Negative +2,105,58,40,94,34.9,0.225,25,Negative +2,122,52,43,158,36.2,0.816,28,Negative +12,140,82,43,325,39.2,0.528,58,Positive +0,98,82,15,84,25.2,0.299,22,Negative +1,87,60,37,75,37.2,0.509,22,Negative +4,156,75,0,0,48.3,0.238,32,Positive +0,93,100,39,72,43.4,1.021,35,Negative +1,107,72,30,82,30.8,0.821,24,Negative +0,105,68,22,0,20,0.236,22,Negative +1,109,60,8,182,25.4,0.947,21,Negative +1,90,62,18,59,25.1,1.268,25,Negative +1,125,70,24,110,24.3,0.221,25,Negative +1,119,54,13,50,22.3,0.205,24,Negative +5,116,74,29,0,32.3,0.66,35,Positive +8,105,100,36,0,43.3,0.239,45,Positive +5,144,82,26,285,32,0.452,58,Positive +3,100,68,23,81,31.6,0.949,28,Negative +1,100,66,29,196,32,0.444,42,Negative +5,166,76,0,0,45.7,0.34,27,Positive +1,131,64,14,415,23.7,0.389,21,Negative +4,116,72,12,87,22.1,0.463,37,Negative +4,158,78,0,0,32.9,0.803,31,Positive +2,127,58,24,275,27.7,1.6,25,Negative +3,96,56,34,115,24.7,0.944,39,Negative +0,131,66,40,0,34.3,0.196,22,Positive +3,82,70,0,0,21.1,0.389,25,Negative +3,193,70,31,0,34.9,0.241,25,Positive +4,95,64,0,0,32,0.161,31,Positive +6,137,61,0,0,24.2,0.151,55,Negative +5,136,84,41,88,35,0.286,35,Positive +9,72,78,25,0,31.6,0.28,38,Negative +5,168,64,0,0,32.9,0.135,41,Positive +2,123,48,32,165,42.1,0.52,26,Negative +4,115,72,0,0,28.9,0.376,46,Positive +0,101,62,0,0,21.9,0.336,25,Negative +8,197,74,0,0,25.9,1.191,39,Positive +1,172,68,49,579,42.4,0.702,28,Positive +6,102,90,39,0,35.7,0.674,28,Negative +1,112,72,30,176,34.4,0.528,25,Negative +1,143,84,23,310,42.4,1.076,22,Negative +1,143,74,22,61,26.2,0.256,21,Negative +0,138,60,35,167,34.6,0.534,21,Positive +3,173,84,33,474,35.7,0.258,22,Positive +1,97,68,21,0,27.2,1.095,22,Negative +4,144,82,32,0,38.5,0.554,37,Positive +1,83,68,0,0,18.2,0.624,27,Negative +3,129,64,29,115,26.4,0.219,28,Positive +1,119,88,41,170,45.3,0.507,26,Negative +2,94,68,18,76,26,0.561,21,Negative +0,102,64,46,78,40.6,0.496,21,Negative +2,115,64,22,0,30.8,0.421,21,Negative +8,151,78,32,210,42.9,0.516,36,Positive +4,184,78,39,277,37,0.264,31,Positive +0,94,0,0,0,0,0.256,25,Negative +1,181,64,30,180,34.1,0.328,38,Positive +0,135,94,46,145,40.6,0.284,26,Negative +1,95,82,25,180,35,0.233,43,Positive +2,99,0,0,0,22.2,0.108,23,Negative +3,89,74,16,85,30.4,0.551,38,Negative +1,80,74,11,60,30,0.527,22,Negative +2,139,75,0,0,25.6,0.167,29,Negative +1,90,68,8,0,24.5,1.138,36,Negative +0,141,0,0,0,42.4,0.205,29,Positive +12,140,85,33,0,37.4,0.244,41,Negative +5,147,75,0,0,29.9,0.434,28,Negative +1,97,70,15,0,18.2,0.147,21,Negative +6,107,88,0,0,36.8,0.727,31,Negative +0,189,104,25,0,34.3,0.435,41,Positive +2,83,66,23,50,32.2,0.497,22,Negative +4,117,64,27,120,33.2,0.23,24,Negative +8,108,70,0,0,30.5,0.955,33,Positive +4,117,62,12,0,29.7,0.38,30,Positive +0,180,78,63,14,59.4,2.42,25,Positive +1,100,72,12,70,25.3,0.658,28,Negative +0,95,80,45,92,36.5,0.33,26,Negative +0,104,64,37,64,33.6,0.51,22,Positive +0,120,74,18,63,30.5,0.285,26,Negative +1,82,64,13,95,21.2,0.415,23,Negative +2,134,70,0,0,28.9,0.542,23,Positive +0,91,68,32,210,39.9,0.381,25,Negative +2,119,0,0,0,19.6,0.832,72,Negative +2,100,54,28,105,37.8,0.498,24,Negative +14,175,62,30,0,33.6,0.212,38,Positive +1,135,54,0,0,26.7,0.687,62,Negative +5,86,68,28,71,30.2,0.364,24,Negative +10,148,84,48,237,37.6,1.001,51,Positive +9,134,74,33,60,25.9,0.46,81,Negative +9,120,72,22,56,20.8,0.733,48,Negative +1,71,62,0,0,21.8,0.416,26,Negative +8,74,70,40,49,35.3,0.705,39,Negative +5,88,78,30,0,27.6,0.258,37,Negative +10,115,98,0,0,24,1.022,34,Negative +0,124,56,13,105,21.8,0.452,21,Negative +0,74,52,10,36,27.8,0.269,22,Negative +0,97,64,36,100,36.8,0.6,25,Negative +8,120,0,0,0,30,0.183,38,Positive +6,154,78,41,140,46.1,0.571,27,Negative +1,144,82,40,0,41.3,0.607,28,Negative +0,137,70,38,0,33.2,0.17,22,Negative +0,119,66,27,0,38.8,0.259,22,Negative +7,136,90,0,0,29.9,0.21,50,Negative +4,114,64,0,0,28.9,0.126,24,Negative +0,137,84,27,0,27.3,0.231,59,Negative +2,105,80,45,191,33.7,0.711,29,Positive +7,114,76,17,110,23.8,0.466,31,Negative +8,126,74,38,75,25.9,0.162,39,Negative +4,132,86,31,0,28,0.419,63,Negative +3,158,70,30,328,35.5,0.344,35,Positive +0,123,88,37,0,35.2,0.197,29,Negative +4,85,58,22,49,27.8,0.306,28,Negative +0,84,82,31,125,38.2,0.233,23,Negative +0,145,0,0,0,44.2,0.63,31,Positive +0,135,68,42,250,42.3,0.365,24,Positive +1,139,62,41,480,40.7,0.536,21,Negative +0,173,78,32,265,46.5,1.159,58,Negative +4,99,72,17,0,25.6,0.294,28,Negative +8,194,80,0,0,26.1,0.551,67,Negative +2,83,65,28,66,36.8,0.629,24,Negative +2,89,90,30,0,33.5,0.292,42,Negative +4,99,68,38,0,32.8,0.145,33,Negative +4,125,70,18,122,28.9,1.144,45,Positive +3,80,0,0,0,0,0.174,22,Negative +6,166,74,0,0,26.6,0.304,66,Negative +5,110,68,0,0,26,0.292,30,Negative +2,81,72,15,76,30.1,0.547,25,Negative +7,195,70,33,145,25.1,0.163,55,Positive +6,154,74,32,193,29.3,0.839,39,Negative +2,117,90,19,71,25.2,0.313,21,Negative +3,84,72,32,0,37.2,0.267,28,Negative +6,0,68,41,0,39,0.727,41,Positive +7,94,64,25,79,33.3,0.738,41,Negative +3,96,78,39,0,37.3,0.238,40,Negative +10,75,82,0,0,33.3,0.263,38,Negative +0,180,90,26,90,36.5,0.314,35,Positive +1,130,60,23,170,28.6,0.692,21,Negative +2,84,50,23,76,30.4,0.968,21,Negative +8,120,78,0,0,25,0.409,64,Negative +12,84,72,31,0,29.7,0.297,46,Positive +0,139,62,17,210,22.1,0.207,21,Negative +9,91,68,0,0,24.2,0.2,58,Negative +2,91,62,0,0,27.3,0.525,22,Negative +3,99,54,19,86,25.6,0.154,24,Negative +3,163,70,18,105,31.6,0.268,28,Positive +9,145,88,34,165,30.3,0.771,53,Positive +7,125,86,0,0,37.6,0.304,51,Negative +13,76,60,0,0,32.8,0.18,41,Negative +6,129,90,7,326,19.6,0.582,60,Negative +2,68,70,32,66,25,0.187,25,Negative +3,124,80,33,130,33.2,0.305,26,Negative +6,114,0,0,0,0,0.189,26,Negative +9,130,70,0,0,34.2,0.652,45,Positive +3,125,58,0,0,31.6,0.151,24,Negative +3,87,60,18,0,21.8,0.444,21,Negative +1,97,64,19,82,18.2,0.299,21,Negative +3,116,74,15,105,26.3,0.107,24,Negative +0,117,66,31,188,30.8,0.493,22,Negative +0,111,65,0,0,24.6,0.66,31,Negative +2,122,60,18,106,29.8,0.717,22,Negative +0,107,76,0,0,45.3,0.686,24,Negative +1,86,66,52,65,41.3,0.917,29,Negative +6,91,0,0,0,29.8,0.501,31,Negative +1,77,56,30,56,33.3,1.251,24,Negative +4,132,0,0,0,32.9,0.302,23,Positive +0,105,90,0,0,29.6,0.197,46,Negative +0,57,60,0,0,21.7,0.735,67,Negative +0,127,80,37,210,36.3,0.804,23,Negative +3,129,92,49,155,36.4,0.968,32,Positive +8,100,74,40,215,39.4,0.661,43,Positive +3,128,72,25,190,32.4,0.549,27,Positive +10,90,85,32,0,34.9,0.825,56,Positive +4,84,90,23,56,39.5,0.159,25,Negative +1,88,78,29,76,32,0.365,29,Negative +8,186,90,35,225,34.5,0.423,37,Positive +5,187,76,27,207,43.6,1.034,53,Positive +4,131,68,21,166,33.1,0.16,28,Negative +1,164,82,43,67,32.8,0.341,50,Negative +4,189,110,31,0,28.5,0.68,37,Negative +1,116,70,28,0,27.4,0.204,21,Negative +3,84,68,30,106,31.9,0.591,25,Negative +6,114,88,0,0,27.8,0.247,66,Negative +1,88,62,24,44,29.9,0.422,23,Negative +1,84,64,23,115,36.9,0.471,28,Negative +7,124,70,33,215,25.5,0.161,37,Negative +1,97,70,40,0,38.1,0.218,30,Negative +8,110,76,0,0,27.8,0.237,58,Negative +11,103,68,40,0,46.2,0.126,42,Negative +11,85,74,0,0,30.1,0.3,35,Negative +6,125,76,0,0,33.8,0.121,54,Positive +0,198,66,32,274,41.3,0.502,28,Positive +1,87,68,34,77,37.6,0.401,24,Negative +6,99,60,19,54,26.9,0.497,32,Negative +0,91,80,0,0,32.4,0.601,27,Negative +2,95,54,14,88,26.1,0.748,22,Negative +1,99,72,30,18,38.6,0.412,21,Negative +6,92,62,32,126,32,0.085,46,Negative +4,154,72,29,126,31.3,0.338,37,Negative +0,121,66,30,165,34.3,0.203,33,Positive +3,78,70,0,0,32.5,0.27,39,Negative +2,130,96,0,0,22.6,0.268,21,Negative +3,111,58,31,44,29.5,0.43,22,Negative +2,98,60,17,120,34.7,0.198,22,Negative +1,143,86,30,330,30.1,0.892,23,Negative +1,119,44,47,63,35.5,0.28,25,Negative +6,108,44,20,130,24,0.813,35,Negative +2,118,80,0,0,42.9,0.693,21,Positive +10,133,68,0,0,27,0.245,36,Negative +2,197,70,99,0,34.7,0.575,62,Positive +0,151,90,46,0,42.1,0.371,21,Positive +6,109,60,27,0,25,0.206,27,Negative +12,121,78,17,0,26.5,0.259,62,Negative +8,100,76,0,0,38.7,0.19,42,Negative +8,124,76,24,600,28.7,0.687,52,Positive +1,93,56,11,0,22.5,0.417,22,Negative +8,143,66,0,0,34.9,0.129,41,Positive +6,103,66,0,0,24.3,0.249,29,Negative +3,176,86,27,156,33.3,1.154,52,Positive +0,73,0,0,0,21.1,0.342,25,Negative +11,111,84,40,0,46.8,0.925,45,Positive +2,112,78,50,140,39.4,0.175,24,Negative +3,132,80,0,0,34.4,0.402,44,Positive +2,82,52,22,115,28.5,1.699,25,Negative +6,123,72,45,230,33.6,0.733,34,Negative +0,188,82,14,185,32,0.682,22,Positive +0,67,76,0,0,45.3,0.194,46,Negative +1,89,24,19,25,27.8,0.559,21,Negative +1,173,74,0,0,36.8,0.088,38,Positive +1,109,38,18,120,23.1,0.407,26,Negative +1,108,88,19,0,27.1,0.4,24,Negative +6,96,0,0,0,23.7,0.19,28,Negative +1,124,74,36,0,27.8,0.1,30,Negative +7,150,78,29,126,35.2,0.692,54,Positive +4,183,0,0,0,28.4,0.212,36,Positive +1,124,60,32,0,35.8,0.514,21,Negative +1,181,78,42,293,40,1.258,22,Positive +1,92,62,25,41,19.5,0.482,25,Negative +0,152,82,39,272,41.5,0.27,27,Negative +1,111,62,13,182,24,0.138,23,Negative +3,106,54,21,158,30.9,0.292,24,Negative +3,174,58,22,194,32.9,0.593,36,Positive +7,168,88,42,321,38.2,0.787,40,Positive +6,105,80,28,0,32.5,0.878,26,Negative +11,138,74,26,144,36.1,0.557,50,Positive +3,106,72,0,0,25.8,0.207,27,Negative +6,117,96,0,0,28.7,0.157,30,Negative +2,68,62,13,15,20.1,0.257,23,Negative +9,112,82,24,0,28.2,1.282,50,Positive +0,119,0,0,0,32.4,0.141,24,Positive +2,112,86,42,160,38.4,0.246,28,Negative +2,92,76,20,0,24.2,1.698,28,Negative +6,183,94,0,0,40.8,1.461,45,Negative +0,94,70,27,115,43.5,0.347,21,Negative +2,108,64,0,0,30.8,0.158,21,Negative +4,90,88,47,54,37.7,0.362,29,Negative +0,125,68,0,0,24.7,0.206,21,Negative +0,132,78,0,0,32.4,0.393,21,Negative +5,128,80,0,0,34.6,0.144,45,Negative +4,94,65,22,0,24.7,0.148,21,Negative +7,114,64,0,0,27.4,0.732,34,Positive +0,102,78,40,90,34.5,0.238,24,Negative +2,111,60,0,0,26.2,0.343,23,Negative +1,128,82,17,183,27.5,0.115,22,Negative +10,92,62,0,0,25.9,0.167,31,Negative +13,104,72,0,0,31.2,0.465,38,Positive +5,104,74,0,0,28.8,0.153,48,Negative +2,94,76,18,66,31.6,0.649,23,Negative +7,97,76,32,91,40.9,0.871,32,Positive +1,100,74,12,46,19.5,0.149,28,Negative +0,102,86,17,105,29.3,0.695,27,Negative +4,128,70,0,0,34.3,0.303,24,Negative +6,147,80,0,0,29.5,0.178,50,Positive +4,90,0,0,0,28,0.61,31,Negative +3,103,72,30,152,27.6,0.73,27,Negative +2,157,74,35,440,39.4,0.134,30,Negative +1,167,74,17,144,23.4,0.447,33,Positive +0,179,50,36,159,37.8,0.455,22,Positive +11,136,84,35,130,28.3,0.26,42,Positive +0,107,60,25,0,26.4,0.133,23,Negative +1,91,54,25,100,25.2,0.234,23,Negative +1,117,60,23,106,33.8,0.466,27,Negative +5,123,74,40,77,34.1,0.269,28,Negative +2,120,54,0,0,26.8,0.455,27,Negative +1,106,70,28,135,34.2,0.142,22,Negative +2,155,52,27,540,38.7,0.24,25,Positive +2,101,58,35,90,21.8,0.155,22,Negative +1,120,80,48,200,38.9,1.162,41,Negative +11,127,106,0,0,39,0.19,51,Negative +3,80,82,31,70,34.2,1.292,27,Positive +10,162,84,0,0,27.7,0.182,54,Negative +1,199,76,43,0,42.9,1.394,22,Positive +8,167,106,46,231,37.6,0.165,43,Positive +9,145,80,46,130,37.9,0.637,40,Positive +6,115,60,39,0,33.7,0.245,40,Positive +1,112,80,45,132,34.8,0.217,24,Negative +4,145,82,18,0,32.5,0.235,70,Positive +10,111,70,27,0,27.5,0.141,40,Positive +6,98,58,33,190,34,0.43,43,Negative +9,154,78,30,100,30.9,0.164,45,Negative +6,165,68,26,168,33.6,0.631,49,Negative +1,99,58,10,0,25.4,0.551,21,Negative +10,68,106,23,49,35.5,0.285,47,Negative +3,123,100,35,240,57.3,0.88,22,Negative +8,91,82,0,0,35.6,0.587,68,Negative +6,195,70,0,0,30.9,0.328,31,Positive +9,156,86,0,0,24.8,0.23,53,Positive +0,93,60,0,0,35.3,0.263,25,Negative +3,121,52,0,0,36,0.127,25,Positive +2,101,58,17,265,24.2,0.614,23,Negative +2,56,56,28,45,24.2,0.332,22,Negative +0,162,76,36,0,49.6,0.364,26,Positive +0,95,64,39,105,44.6,0.366,22,Negative +4,125,80,0,0,32.3,0.536,27,Positive +5,136,82,0,0,0,0.64,69,Negative +2,129,74,26,205,33.2,0.591,25,Negative +3,130,64,0,0,23.1,0.314,22,Negative +1,107,50,19,0,28.3,0.181,29,Negative +1,140,74,26,180,24.1,0.828,23,Negative +1,144,82,46,180,46.1,0.335,46,Positive +8,107,80,0,0,24.6,0.856,34,Negative +13,158,114,0,0,42.3,0.257,44,Positive +2,121,70,32,95,39.1,0.886,23,Negative +7,129,68,49,125,38.5,0.439,43,Positive +2,90,60,0,0,23.5,0.191,25,Negative +7,142,90,24,480,30.4,0.128,43,Positive +3,169,74,19,125,29.9,0.268,31,Positive +0,99,0,0,0,25,0.253,22,Negative +4,127,88,11,155,34.5,0.598,28,Negative +4,118,70,0,0,44.5,0.904,26,Negative +2,122,76,27,200,35.9,0.483,26,Negative +6,125,78,31,0,27.6,0.565,49,Positive +1,168,88,29,0,35,0.905,52,Positive +2,129,0,0,0,38.5,0.304,41,Negative +4,110,76,20,100,28.4,0.118,27,Negative +6,80,80,36,0,39.8,0.177,28,Negative +10,115,0,0,0,0,0.261,30,Positive +2,127,46,21,335,34.4,0.176,22,Negative +9,164,78,0,0,32.8,0.148,45,Positive +2,93,64,32,160,38,0.674,23,Positive +3,158,64,13,387,31.2,0.295,24,Negative +5,126,78,27,22,29.6,0.439,40,Negative +10,129,62,36,0,41.2,0.441,38,Positive +0,134,58,20,291,26.4,0.352,21,Negative +3,102,74,0,0,29.5,0.121,32,Negative +7,187,50,33,392,33.9,0.826,34,Positive +3,173,78,39,185,33.8,0.97,31,Positive +10,94,72,18,0,23.1,0.595,56,Negative +1,108,60,46,178,35.5,0.415,24,Negative +5,97,76,27,0,35.6,0.378,52,Positive +4,83,86,19,0,29.3,0.317,34,Negative +1,114,66,36,200,38.1,0.289,21,Negative +1,149,68,29,127,29.3,0.349,42,Positive +5,117,86,30,105,39.1,0.251,42,Negative +1,111,94,0,0,32.8,0.265,45,Negative +4,112,78,40,0,39.4,0.236,38,Negative +1,116,78,29,180,36.1,0.496,25,Negative +0,141,84,26,0,32.4,0.433,22,Negative +2,175,88,0,0,22.9,0.326,22,Negative +2,92,52,0,0,30.1,0.141,22,Negative +3,130,78,23,79,28.4,0.323,34,Positive +8,120,86,0,0,28.4,0.259,22,Positive +2,174,88,37,120,44.5,0.646,24,Positive +2,106,56,27,165,29,0.426,22,Negative +2,105,75,0,0,23.3,0.56,53,Negative +4,95,60,32,0,35.4,0.284,28,Negative +0,126,86,27,120,27.4,0.515,21,Negative +8,65,72,23,0,32,0.6,42,Negative +2,99,60,17,160,36.6,0.453,21,Negative +1,102,74,0,0,39.5,0.293,42,Positive +11,120,80,37,150,42.3,0.785,48,Positive +3,102,44,20,94,30.8,0.4,26,Negative +1,109,58,18,116,28.5,0.219,22,Negative +9,140,94,0,0,32.7,0.734,45,Positive +13,153,88,37,140,40.6,1.174,39,Negative +12,100,84,33,105,30,0.488,46,Negative +1,147,94,41,0,49.3,0.358,27,Positive +1,81,74,41,57,46.3,1.096,32,Negative +3,187,70,22,200,36.4,0.408,36,Positive +6,162,62,0,0,24.3,0.178,50,Positive +4,136,70,0,0,31.2,1.182,22,Positive +1,121,78,39,74,39,0.261,28,Negative +3,108,62,24,0,26,0.223,25,Negative +0,181,88,44,510,43.3,0.222,26,Positive +8,154,78,32,0,32.4,0.443,45,Positive +1,128,88,39,110,36.5,1.057,37,Positive +7,137,90,41,0,32,0.391,39,Negative +0,123,72,0,0,36.3,0.258,52,Positive +1,106,76,0,0,37.5,0.197,26,Negative +6,190,92,0,0,35.5,0.278,66,Positive +2,88,58,26,16,28.4,0.766,22,Negative +9,170,74,31,0,44,0.403,43,Positive +9,89,62,0,0,22.5,0.142,33,Negative +10,101,76,48,180,32.9,0.171,63,Negative +2,122,70,27,0,36.8,0.34,27,Negative +5,121,72,23,112,26.2,0.245,30,Negative +1,126,60,0,0,30.1,0.349,47,Positive +1,93,70,31,0,30.4,0.315,23,Negative \ No newline at end of file diff --git a/extra_data_sets/heart.csv b/extra_data_sets/heart.csv new file mode 100644 index 0000000..9e9a1f9 --- /dev/null +++ b/extra_data_sets/heart.csv @@ -0,0 +1,304 @@ +Age,Sex,Cp,Trestbps,Chol,Fbs,Restecg,Thalach,Exang,Oldpeak,Slope,Ca,Thal,Outcome* +63,1,3,145,233,1,0,150,0,2.3,0,0,1,1 +37,1,2,130,250,0,1,187,0,3.5,0,0,2,1 +41,0,1,130,204,0,0,172,0,1.4,2,0,2,1 +56,1,1,120,236,0,1,178,0,0.8,2,0,2,1 +57,0,0,120,354,0,1,163,1,0.6,2,0,2,1 +57,1,0,140,192,0,1,148,0,0.4,1,0,1,1 +56,0,1,140,294,0,0,153,0,1.3,1,0,2,1 +44,1,1,120,263,0,1,173,0,0,2,0,3,1 +52,1,2,172,199,1,1,162,0,0.5,2,0,3,1 +57,1,2,150,168,0,1,174,0,1.6,2,0,2,1 +54,1,0,140,239,0,1,160,0,1.2,2,0,2,1 +48,0,2,130,275,0,1,139,0,0.2,2,0,2,1 +49,1,1,130,266,0,1,171,0,0.6,2,0,2,1 +64,1,3,110,211,0,0,144,1,1.8,1,0,2,1 +58,0,3,150,283,1,0,162,0,1,2,0,2,1 +50,0,2,120,219,0,1,158,0,1.6,1,0,2,1 +58,0,2,120,340,0,1,172,0,0,2,0,2,1 +66,0,3,150,226,0,1,114,0,2.6,0,0,2,1 +43,1,0,150,247,0,1,171,0,1.5,2,0,2,1 +69,0,3,140,239,0,1,151,0,1.8,2,2,2,1 +59,1,0,135,234,0,1,161,0,0.5,1,0,3,1 +44,1,2,130,233,0,1,179,1,0.4,2,0,2,1 +42,1,0,140,226,0,1,178,0,0,2,0,2,1 +61,1,2,150,243,1,1,137,1,1,1,0,2,1 +40,1,3,140,199,0,1,178,1,1.4,2,0,3,1 +71,0,1,160,302,0,1,162,0,0.4,2,2,2,1 +59,1,2,150,212,1,1,157,0,1.6,2,0,2,1 +51,1,2,110,175,0,1,123,0,0.6,2,0,2,1 +65,0,2,140,417,1,0,157,0,0.8,2,1,2,1 +53,1,2,130,197,1,0,152,0,1.2,0,0,2,1 +41,0,1,105,198,0,1,168,0,0,2,1,2,1 +65,1,0,120,177,0,1,140,0,0.4,2,0,3,1 +44,1,1,130,219,0,0,188,0,0,2,0,2,1 +54,1,2,125,273,0,0,152,0,0.5,0,1,2,1 +51,1,3,125,213,0,0,125,1,1.4,2,1,2,1 +46,0,2,142,177,0,0,160,1,1.4,0,0,2,1 +54,0,2,135,304,1,1,170,0,0,2,0,2,1 +54,1,2,150,232,0,0,165,0,1.6,2,0,3,1 +65,0,2,155,269,0,1,148,0,0.8,2,0,2,1 +65,0,2,160,360,0,0,151,0,0.8,2,0,2,1 +51,0,2,140,308,0,0,142,0,1.5,2,1,2,1 +48,1,1,130,245,0,0,180,0,0.2,1,0,2,1 +45,1,0,104,208,0,0,148,1,3,1,0,2,1 +53,0,0,130,264,0,0,143,0,0.4,1,0,2,1 +39,1,2,140,321,0,0,182,0,0,2,0,2,1 +52,1,1,120,325,0,1,172,0,0.2,2,0,2,1 +44,1,2,140,235,0,0,180,0,0,2,0,2,1 +47,1,2,138,257,0,0,156,0,0,2,0,2,1 +53,0,2,128,216,0,0,115,0,0,2,0,0,1 +53,0,0,138,234,0,0,160,0,0,2,0,2,1 +51,0,2,130,256,0,0,149,0,0.5,2,0,2,1 +66,1,0,120,302,0,0,151,0,0.4,1,0,2,1 +62,1,2,130,231,0,1,146,0,1.8,1,3,3,1 +44,0,2,108,141,0,1,175,0,0.6,1,0,2,1 +63,0,2,135,252,0,0,172,0,0,2,0,2,1 +52,1,1,134,201,0,1,158,0,0.8,2,1,2,1 +48,1,0,122,222,0,0,186,0,0,2,0,2,1 +45,1,0,115,260,0,0,185,0,0,2,0,2,1 +34,1,3,118,182,0,0,174,0,0,2,0,2,1 +57,0,0,128,303,0,0,159,0,0,2,1,2,1 +71,0,2,110,265,1,0,130,0,0,2,1,2,1 +54,1,1,108,309,0,1,156,0,0,2,0,3,1 +52,1,3,118,186,0,0,190,0,0,1,0,1,1 +41,1,1,135,203,0,1,132,0,0,1,0,1,1 +58,1,2,140,211,1,0,165,0,0,2,0,2,1 +35,0,0,138,183,0,1,182,0,1.4,2,0,2,1 +51,1,2,100,222,0,1,143,1,1.2,1,0,2,1 +45,0,1,130,234,0,0,175,0,0.6,1,0,2,1 +44,1,1,120,220,0,1,170,0,0,2,0,2,1 +62,0,0,124,209,0,1,163,0,0,2,0,2,1 +54,1,2,120,258,0,0,147,0,0.4,1,0,3,1 +51,1,2,94,227,0,1,154,1,0,2,1,3,1 +29,1,1,130,204,0,0,202,0,0,2,0,2,1 +51,1,0,140,261,0,0,186,1,0,2,0,2,1 +43,0,2,122,213,0,1,165,0,0.2,1,0,2,1 +55,0,1,135,250,0,0,161,0,1.4,1,0,2,1 +51,1,2,125,245,1,0,166,0,2.4,1,0,2,1 +59,1,1,140,221,0,1,164,1,0,2,0,2,1 +52,1,1,128,205,1,1,184,0,0,2,0,2,1 +58,1,2,105,240,0,0,154,1,0.6,1,0,3,1 +41,1,2,112,250,0,1,179,0,0,2,0,2,1 +45,1,1,128,308,0,0,170,0,0,2,0,2,1 +60,0,2,102,318,0,1,160,0,0,2,1,2,1 +52,1,3,152,298,1,1,178,0,1.2,1,0,3,1 +42,0,0,102,265,0,0,122,0,0.6,1,0,2,1 +67,0,2,115,564,0,0,160,0,1.6,1,0,3,1 +68,1,2,118,277,0,1,151,0,1,2,1,3,1 +46,1,1,101,197,1,1,156,0,0,2,0,3,1 +54,0,2,110,214,0,1,158,0,1.6,1,0,2,1 +58,0,0,100,248,0,0,122,0,1,1,0,2,1 +48,1,2,124,255,1,1,175,0,0,2,2,2,1 +57,1,0,132,207,0,1,168,1,0,2,0,3,1 +52,1,2,138,223,0,1,169,0,0,2,4,2,1 +54,0,1,132,288,1,0,159,1,0,2,1,2,1 +45,0,1,112,160,0,1,138,0,0,1,0,2,1 +53,1,0,142,226,0,0,111,1,0,2,0,3,1 +62,0,0,140,394,0,0,157,0,1.2,1,0,2,1 +52,1,0,108,233,1,1,147,0,0.1,2,3,3,1 +43,1,2,130,315,0,1,162,0,1.9,2,1,2,1 +53,1,2,130,246,1,0,173,0,0,2,3,2,1 +42,1,3,148,244,0,0,178,0,0.8,2,2,2,1 +59,1,3,178,270,0,0,145,0,4.2,0,0,3,1 +63,0,1,140,195,0,1,179,0,0,2,2,2,1 +42,1,2,120,240,1,1,194,0,0.8,0,0,3,1 +50,1,2,129,196,0,1,163,0,0,2,0,2,1 +68,0,2,120,211,0,0,115,0,1.5,1,0,2,1 +69,1,3,160,234,1,0,131,0,0.1,1,1,2,1 +45,0,0,138,236,0,0,152,1,0.2,1,0,2,1 +50,0,1,120,244,0,1,162,0,1.1,2,0,2,1 +50,0,0,110,254,0,0,159,0,0,2,0,2,1 +64,0,0,180,325,0,1,154,1,0,2,0,2,1 +57,1,2,150,126,1,1,173,0,0.2,2,1,3,1 +64,0,2,140,313,0,1,133,0,0.2,2,0,3,1 +43,1,0,110,211,0,1,161,0,0,2,0,3,1 +55,1,1,130,262,0,1,155,0,0,2,0,2,1 +37,0,2,120,215,0,1,170,0,0,2,0,2,1 +41,1,2,130,214,0,0,168,0,2,1,0,2,1 +56,1,3,120,193,0,0,162,0,1.9,1,0,3,1 +46,0,1,105,204,0,1,172,0,0,2,0,2,1 +46,0,0,138,243,0,0,152,1,0,1,0,2,1 +64,0,0,130,303,0,1,122,0,2,1,2,2,1 +59,1,0,138,271,0,0,182,0,0,2,0,2,1 +41,0,2,112,268,0,0,172,1,0,2,0,2,1 +54,0,2,108,267,0,0,167,0,0,2,0,2,1 +39,0,2,94,199,0,1,179,0,0,2,0,2,1 +34,0,1,118,210,0,1,192,0,0.7,2,0,2,1 +47,1,0,112,204,0,1,143,0,0.1,2,0,2,1 +67,0,2,152,277,0,1,172,0,0,2,1,2,1 +52,0,2,136,196,0,0,169,0,0.1,1,0,2,1 +74,0,1,120,269,0,0,121,1,0.2,2,1,2,1 +54,0,2,160,201,0,1,163,0,0,2,1,2,1 +49,0,1,134,271,0,1,162,0,0,1,0,2,1 +42,1,1,120,295,0,1,162,0,0,2,0,2,1 +41,1,1,110,235,0,1,153,0,0,2,0,2,1 +41,0,1,126,306,0,1,163,0,0,2,0,2,1 +49,0,0,130,269,0,1,163,0,0,2,0,2,1 +60,0,2,120,178,1,1,96,0,0,2,0,2,1 +62,1,1,128,208,1,0,140,0,0,2,0,2,1 +57,1,0,110,201,0,1,126,1,1.5,1,0,1,1 +64,1,0,128,263,0,1,105,1,0.2,1,1,3,1 +51,0,2,120,295,0,0,157,0,0.6,2,0,2,1 +43,1,0,115,303,0,1,181,0,1.2,1,0,2,1 +42,0,2,120,209,0,1,173,0,0,1,0,2,1 +67,0,0,106,223,0,1,142,0,0.3,2,2,2,1 +76,0,2,140,197,0,2,116,0,1.1,1,0,2,1 +70,1,1,156,245,0,0,143,0,0,2,0,2,1 +44,0,2,118,242,0,1,149,0,0.3,1,1,2,1 +60,0,3,150,240,0,1,171,0,0.9,2,0,2,1 +44,1,2,120,226,0,1,169,0,0,2,0,2,1 +42,1,2,130,180,0,1,150,0,0,2,0,2,1 +66,1,0,160,228,0,0,138,0,2.3,2,0,1,1 +71,0,0,112,149,0,1,125,0,1.6,1,0,2,1 +64,1,3,170,227,0,0,155,0,0.6,1,0,3,1 +66,0,2,146,278,0,0,152,0,0,1,1,2,1 +39,0,2,138,220,0,1,152,0,0,1,0,2,1 +58,0,0,130,197,0,1,131,0,0.6,1,0,2,1 +47,1,2,130,253,0,1,179,0,0,2,0,2,1 +35,1,1,122,192,0,1,174,0,0,2,0,2,1 +58,1,1,125,220,0,1,144,0,0.4,1,4,3,1 +56,1,1,130,221,0,0,163,0,0,2,0,3,1 +56,1,1,120,240,0,1,169,0,0,0,0,2,1 +55,0,1,132,342,0,1,166,0,1.2,2,0,2,1 +41,1,1,120,157,0,1,182,0,0,2,0,2,1 +38,1,2,138,175,0,1,173,0,0,2,4,2,1 +38,1,2,138,175,0,1,173,0,0,2,4,2,1 +67,1,0,160,286,0,0,108,1,1.5,1,3,2,0 +67,1,0,120,229,0,0,129,1,2.6,1,2,3,0 +62,0,0,140,268,0,0,160,0,3.6,0,2,2,0 +63,1,0,130,254,0,0,147,0,1.4,1,1,3,0 +53,1,0,140,203,1,0,155,1,3.1,0,0,3,0 +56,1,2,130,256,1,0,142,1,0.6,1,1,1,0 +48,1,1,110,229,0,1,168,0,1,0,0,3,0 +58,1,1,120,284,0,0,160,0,1.8,1,0,2,0 +58,1,2,132,224,0,0,173,0,3.2,2,2,3,0 +60,1,0,130,206,0,0,132,1,2.4,1,2,3,0 +40,1,0,110,167,0,0,114,1,2,1,0,3,0 +60,1,0,117,230,1,1,160,1,1.4,2,2,3,0 +64,1,2,140,335,0,1,158,0,0,2,0,2,0 +43,1,0,120,177,0,0,120,1,2.5,1,0,3,0 +57,1,0,150,276,0,0,112,1,0.6,1,1,1,0 +55,1,0,132,353,0,1,132,1,1.2,1,1,3,0 +65,0,0,150,225,0,0,114,0,1,1,3,3,0 +61,0,0,130,330,0,0,169,0,0,2,0,2,0 +58,1,2,112,230,0,0,165,0,2.5,1,1,3,0 +50,1,0,150,243,0,0,128,0,2.6,1,0,3,0 +44,1,0,112,290,0,0,153,0,0,2,1,2,0 +60,1,0,130,253,0,1,144,1,1.4,2,1,3,0 +54,1,0,124,266,0,0,109,1,2.2,1,1,3,0 +50,1,2,140,233,0,1,163,0,0.6,1,1,3,0 +41,1,0,110,172,0,0,158,0,0,2,0,3,0 +51,0,0,130,305,0,1,142,1,1.2,1,0,3,0 +58,1,0,128,216,0,0,131,1,2.2,1,3,3,0 +54,1,0,120,188,0,1,113,0,1.4,1,1,3,0 +60,1,0,145,282,0,0,142,1,2.8,1,2,3,0 +60,1,2,140,185,0,0,155,0,3,1,0,2,0 +59,1,0,170,326,0,0,140,1,3.4,0,0,3,0 +46,1,2,150,231,0,1,147,0,3.6,1,0,2,0 +67,1,0,125,254,1,1,163,0,0.2,1,2,3,0 +62,1,0,120,267,0,1,99,1,1.8,1,2,3,0 +65,1,0,110,248,0,0,158,0,0.6,2,2,1,0 +44,1,0,110,197,0,0,177,0,0,2,1,2,0 +60,1,0,125,258,0,0,141,1,2.8,1,1,3,0 +58,1,0,150,270,0,0,111,1,0.8,2,0,3,0 +68,1,2,180,274,1,0,150,1,1.6,1,0,3,0 +62,0,0,160,164,0,0,145,0,6.2,0,3,3,0 +52,1,0,128,255,0,1,161,1,0,2,1,3,0 +59,1,0,110,239,0,0,142,1,1.2,1,1,3,0 +60,0,0,150,258,0,0,157,0,2.6,1,2,3,0 +49,1,2,120,188,0,1,139,0,2,1,3,3,0 +59,1,0,140,177,0,1,162,1,0,2,1,3,0 +57,1,2,128,229,0,0,150,0,0.4,1,1,3,0 +61,1,0,120,260,0,1,140,1,3.6,1,1,3,0 +39,1,0,118,219,0,1,140,0,1.2,1,0,3,0 +61,0,0,145,307,0,0,146,1,1,1,0,3,0 +56,1,0,125,249,1,0,144,1,1.2,1,1,2,0 +43,0,0,132,341,1,0,136,1,3,1,0,3,0 +62,0,2,130,263,0,1,97,0,1.2,1,1,3,0 +63,1,0,130,330,1,0,132,1,1.8,2,3,3,0 +65,1,0,135,254,0,0,127,0,2.8,1,1,3,0 +48,1,0,130,256,1,0,150,1,0,2,2,3,0 +63,0,0,150,407,0,0,154,0,4,1,3,3,0 +55,1,0,140,217,0,1,111,1,5.6,0,0,3,0 +65,1,3,138,282,1,0,174,0,1.4,1,1,2,0 +56,0,0,200,288,1,0,133,1,4,0,2,3,0 +54,1,0,110,239,0,1,126,1,2.8,1,1,3,0 +70,1,0,145,174,0,1,125,1,2.6,0,0,3,0 +62,1,1,120,281,0,0,103,0,1.4,1,1,3,0 +35,1,0,120,198,0,1,130,1,1.6,1,0,3,0 +59,1,3,170,288,0,0,159,0,0.2,1,0,3,0 +64,1,2,125,309,0,1,131,1,1.8,1,0,3,0 +47,1,2,108,243,0,1,152,0,0,2,0,2,0 +57,1,0,165,289,1,0,124,0,1,1,3,3,0 +55,1,0,160,289,0,0,145,1,0.8,1,1,3,0 +64,1,0,120,246,0,0,96,1,2.2,0,1,2,0 +70,1,0,130,322,0,0,109,0,2.4,1,3,2,0 +51,1,0,140,299,0,1,173,1,1.6,2,0,3,0 +58,1,0,125,300,0,0,171,0,0,2,2,3,0 +60,1,0,140,293,0,0,170,0,1.2,1,2,3,0 +77,1,0,125,304,0,0,162,1,0,2,3,2,0 +35,1,0,126,282,0,0,156,1,0,2,0,3,0 +70,1,2,160,269,0,1,112,1,2.9,1,1,3,0 +59,0,0,174,249,0,1,143,1,0,1,0,2,0 +64,1,0,145,212,0,0,132,0,2,1,2,1,0 +57,1,0,152,274,0,1,88,1,1.2,1,1,3,0 +56,1,0,132,184,0,0,105,1,2.1,1,1,1,0 +48,1,0,124,274,0,0,166,0,0.5,1,0,3,0 +56,0,0,134,409,0,0,150,1,1.9,1,2,3,0 +66,1,1,160,246,0,1,120,1,0,1,3,1,0 +54,1,1,192,283,0,0,195,0,0,2,1,3,0 +69,1,2,140,254,0,0,146,0,2,1,3,3,0 +51,1,0,140,298,0,1,122,1,4.2,1,3,3,0 +43,1,0,132,247,1,0,143,1,0.1,1,4,3,0 +62,0,0,138,294,1,1,106,0,1.9,1,3,2,0 +67,1,0,100,299,0,0,125,1,0.9,1,2,2,0 +59,1,3,160,273,0,0,125,0,0,2,0,2,0 +45,1,0,142,309,0,0,147,1,0,1,3,3,0 +58,1,0,128,259,0,0,130,1,3,1,2,3,0 +50,1,0,144,200,0,0,126,1,0.9,1,0,3,0 +62,0,0,150,244,0,1,154,1,1.4,1,0,2,0 +38,1,3,120,231,0,1,182,1,3.8,1,0,3,0 +66,0,0,178,228,1,1,165,1,1,1,2,3,0 +52,1,0,112,230,0,1,160,0,0,2,1,2,0 +53,1,0,123,282,0,1,95,1,2,1,2,3,0 +63,0,0,108,269,0,1,169,1,1.8,1,2,2,0 +54,1,0,110,206,0,0,108,1,0,1,1,2,0 +66,1,0,112,212,0,0,132,1,0.1,2,1,2,0 +55,0,0,180,327,0,2,117,1,3.4,1,0,2,0 +49,1,2,118,149,0,0,126,0,0.8,2,3,2,0 +54,1,0,122,286,0,0,116,1,3.2,1,2,2,0 +56,1,0,130,283,1,0,103,1,1.6,0,0,3,0 +46,1,0,120,249,0,0,144,0,0.8,2,0,3,0 +61,1,3,134,234,0,1,145,0,2.6,1,2,2,0 +67,1,0,120,237,0,1,71,0,1,1,0,2,0 +58,1,0,100,234,0,1,156,0,0.1,2,1,3,0 +47,1,0,110,275,0,0,118,1,1,1,1,2,0 +52,1,0,125,212,0,1,168,0,1,2,2,3,0 +58,1,0,146,218,0,1,105,0,2,1,1,3,0 +57,1,1,124,261,0,1,141,0,0.3,2,0,3,0 +58,0,1,136,319,1,0,152,0,0,2,2,2,0 +61,1,0,138,166,0,0,125,1,3.6,1,1,2,0 +42,1,0,136,315,0,1,125,1,1.8,1,0,1,0 +52,1,0,128,204,1,1,156,1,1,1,0,0,0 +59,1,2,126,218,1,1,134,0,2.2,1,1,1,0 +40,1,0,152,223,0,1,181,0,0,2,0,3,0 +61,1,0,140,207,0,0,138,1,1.9,2,1,3,0 +46,1,0,140,311,0,1,120,1,1.8,1,2,3,0 +59,1,3,134,204,0,1,162,0,0.8,2,2,2,0 +57,1,1,154,232,0,0,164,0,0,2,1,2,0 +57,1,0,110,335,0,1,143,1,3,1,1,3,0 +55,0,0,128,205,0,2,130,1,2,1,1,3,0 +61,1,0,148,203,0,1,161,0,0,2,1,3,0 +58,1,0,114,318,0,2,140,0,4.4,0,3,1,0 +58,0,0,170,225,1,0,146,1,2.8,1,2,1,0 +67,1,2,152,212,0,0,150,0,0.8,1,0,3,0 +44,1,0,120,169,0,1,144,1,2.8,0,0,1,0 +63,1,0,140,187,0,0,144,1,4,2,2,3,0 +63,0,0,124,197,0,1,136,1,0,1,0,2,0 +59,1,0,164,176,1,0,90,0,1,1,2,1,0 +57,0,0,140,241,0,1,123,1,0.2,1,0,3,0 +45,1,3,110,264,0,1,132,0,1.2,1,0,3,0 +68,1,0,144,193,1,1,141,0,3.4,1,2,3,0 +57,1,0,130,131,0,1,115,1,1.2,1,1,3,0 +57,0,1,130,236,0,0,174,0,0,1,1,2,0 diff --git a/extra_data_sets/iris.csv b/extra_data_sets/iris.csv new file mode 100755 index 0000000..7456e9f --- /dev/null +++ b/extra_data_sets/iris.csv @@ -0,0 +1,152 @@ +"sepal_length","sepal_width","petal_length","petal_width","Species*" +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica + diff --git a/extra_data_sets/sonar.csv b/extra_data_sets/sonar.csv new file mode 100644 index 0000000..97ac82a --- /dev/null +++ b/extra_data_sets/sonar.csv @@ -0,0 +1,209 @@ +attribute_1,attribute_2,attribute_3,attribute_4,attribute_5,attribute_6,attribute_7,attribute_8,attribute_9,attribute_10,attribute_11,attribute_12,attribute_13,attribute_14,attribute_15,attribute_16,attribute_17,attribute_18,attribute_19,attribute_20,attribute_21,attribute_22,attribute_23,attribute_24,attribute_25,attribute_26,attribute_27,attribute_28,attribute_29,attribute_30,attribute_31,attribute_32,attribute_33,attribute_34,attribute_35,attribute_36,attribute_37,attribute_38,attribute_39,attribute_40,attribute_41,attribute_42,attribute_43,attribute_44,attribute_45,attribute_46,attribute_47,attribute_48,attribute_49,attribute_50,attribute_51,attribute_52,attribute_53,attribute_54,attribute_55,attribute_56,attribute_57,attribute_58,attribute_59,attribute_60,Class* +0.02,0.0371,0.0428,0.0207,0.0954,0.0986,0.1539,0.1601,0.3109,0.2111,0.1609,0.1582,0.2238,0.0645,0.066,0.2273,0.31,0.2999,0.5078,0.4797,0.5783,0.5071,0.4328,0.555,0.6711,0.6415,0.7104,0.808,0.6791,0.3857,0.1307,0.2604,0.5121,0.7547,0.8537,0.8507,0.6692,0.6097,0.4943,0.2744,0.051,0.2834,0.2825,0.4256,0.2641,0.1386,0.1051,0.1343,0.0383,0.0324,0.0232,0.0027,0.0065,0.0159,0.0072,0.0167,0.018,0.0084,0.009,0.0032,Rock +0.0453,0.0523,0.0843,0.0689,0.1183,0.2583,0.2156,0.3481,0.3337,0.2872,0.4918,0.6552,0.6919,0.7797,0.7464,0.9444,1,0.8874,0.8024,0.7818,0.5212,0.4052,0.3957,0.3914,0.325,0.32,0.3271,0.2767,0.4423,0.2028,0.3788,0.2947,0.1984,0.2341,0.1306,0.4182,0.3835,0.1057,0.184,0.197,0.1674,0.0583,0.1401,0.1628,0.0621,0.0203,0.053,0.0742,0.0409,0.0061,0.0125,0.0084,0.0089,0.0048,0.0094,0.0191,0.014,0.0049,0.0052,0.0044,Rock +0.0262,0.0582,0.1099,0.1083,0.0974,0.228,0.2431,0.3771,0.5598,0.6194,0.6333,0.706,0.5544,0.532,0.6479,0.6931,0.6759,0.7551,0.8929,0.8619,0.7974,0.6737,0.4293,0.3648,0.5331,0.2413,0.507,0.8533,0.6036,0.8514,0.8512,0.5045,0.1862,0.2709,0.4232,0.3043,0.6116,0.6756,0.5375,0.4719,0.4647,0.2587,0.2129,0.2222,0.2111,0.0176,0.1348,0.0744,0.013,0.0106,0.0033,0.0232,0.0166,0.0095,0.018,0.0244,0.0316,0.0164,0.0095,0.0078,Rock +0.01,0.0171,0.0623,0.0205,0.0205,0.0368,0.1098,0.1276,0.0598,0.1264,0.0881,0.1992,0.0184,0.2261,0.1729,0.2131,0.0693,0.2281,0.406,0.3973,0.2741,0.369,0.5556,0.4846,0.314,0.5334,0.5256,0.252,0.209,0.3559,0.626,0.734,0.612,0.3497,0.3953,0.3012,0.5408,0.8814,0.9857,0.9167,0.6121,0.5006,0.321,0.3202,0.4295,0.3654,0.2655,0.1576,0.0681,0.0294,0.0241,0.0121,0.0036,0.015,0.0085,0.0073,0.005,0.0044,0.004,0.0117,Rock +0.0762,0.0666,0.0481,0.0394,0.059,0.0649,0.1209,0.2467,0.3564,0.4459,0.4152,0.3952,0.4256,0.4135,0.4528,0.5326,0.7306,0.6193,0.2032,0.4636,0.4148,0.4292,0.573,0.5399,0.3161,0.2285,0.6995,1,0.7262,0.4724,0.5103,0.5459,0.2881,0.0981,0.1951,0.4181,0.4604,0.3217,0.2828,0.243,0.1979,0.2444,0.1847,0.0841,0.0692,0.0528,0.0357,0.0085,0.023,0.0046,0.0156,0.0031,0.0054,0.0105,0.011,0.0015,0.0072,0.0048,0.0107,0.0094,Rock +0.0286,0.0453,0.0277,0.0174,0.0384,0.099,0.1201,0.1833,0.2105,0.3039,0.2988,0.425,0.6343,0.8198,1,0.9988,0.9508,0.9025,0.7234,0.5122,0.2074,0.3985,0.589,0.2872,0.2043,0.5782,0.5389,0.375,0.3411,0.5067,0.558,0.4778,0.3299,0.2198,0.1407,0.2856,0.3807,0.4158,0.4054,0.3296,0.2707,0.265,0.0723,0.1238,0.1192,0.1089,0.0623,0.0494,0.0264,0.0081,0.0104,0.0045,0.0014,0.0038,0.0013,0.0089,0.0057,0.0027,0.0051,0.0062,Rock +0.0317,0.0956,0.1321,0.1408,0.1674,0.171,0.0731,0.1401,0.2083,0.3513,0.1786,0.0658,0.0513,0.3752,0.5419,0.544,0.515,0.4262,0.2024,0.4233,0.7723,0.9735,0.939,0.5559,0.5268,0.6826,0.5713,0.5429,0.2177,0.2149,0.5811,0.6323,0.2965,0.1873,0.2969,0.5163,0.6153,0.4283,0.5479,0.6133,0.5017,0.2377,0.1957,0.1749,0.1304,0.0597,0.1124,0.1047,0.0507,0.0159,0.0195,0.0201,0.0248,0.0131,0.007,0.0138,0.0092,0.0143,0.0036,0.0103,Rock +0.0519,0.0548,0.0842,0.0319,0.1158,0.0922,0.1027,0.0613,0.1465,0.2838,0.2802,0.3086,0.2657,0.3801,0.5626,0.4376,0.2617,0.1199,0.6676,0.9402,0.7832,0.5352,0.6809,0.9174,0.7613,0.822,0.8872,0.6091,0.2967,0.1103,0.1318,0.0624,0.099,0.4006,0.3666,0.105,0.1915,0.393,0.4288,0.2546,0.1151,0.2196,0.1879,0.1437,0.2146,0.236,0.1125,0.0254,0.0285,0.0178,0.0052,0.0081,0.012,0.0045,0.0121,0.0097,0.0085,0.0047,0.0048,0.0053,Rock +0.0223,0.0375,0.0484,0.0475,0.0647,0.0591,0.0753,0.0098,0.0684,0.1487,0.1156,0.1654,0.3833,0.3598,0.1713,0.1136,0.0349,0.3796,0.7401,0.9925,0.9802,0.889,0.6712,0.4286,0.3374,0.7366,0.9611,0.7353,0.4856,0.1594,0.3007,0.4096,0.317,0.3305,0.3408,0.2186,0.2463,0.2726,0.168,0.2792,0.2558,0.174,0.2121,0.1099,0.0985,0.1271,0.1459,0.1164,0.0777,0.0439,0.0061,0.0145,0.0128,0.0145,0.0058,0.0049,0.0065,0.0093,0.0059,0.0022,Rock +0.0164,0.0173,0.0347,0.007,0.0187,0.0671,0.1056,0.0697,0.0962,0.0251,0.0801,0.1056,0.1266,0.089,0.0198,0.1133,0.2826,0.3234,0.3238,0.4333,0.6068,0.7652,0.9203,0.9719,0.9207,0.7545,0.8289,0.8907,0.7309,0.6896,0.5829,0.4935,0.3101,0.0306,0.0244,0.1108,0.1594,0.1371,0.0696,0.0452,0.062,0.1421,0.1597,0.1384,0.0372,0.0688,0.0867,0.0513,0.0092,0.0198,0.0118,0.009,0.0223,0.0179,0.0084,0.0068,0.0032,0.0035,0.0056,0.004,Rock +0.0039,0.0063,0.0152,0.0336,0.031,0.0284,0.0396,0.0272,0.0323,0.0452,0.0492,0.0996,0.1424,0.1194,0.0628,0.0907,0.1177,0.1429,0.1223,0.1104,0.1847,0.3715,0.4382,0.5707,0.6654,0.7476,0.7654,0.8555,0.972,0.9221,0.7502,0.7209,0.7757,0.6055,0.5021,0.4499,0.3947,0.4281,0.4427,0.3749,0.1972,0.0511,0.0793,0.1269,0.1533,0.069,0.0402,0.0534,0.0228,0.0073,0.0062,0.0062,0.012,0.0052,0.0056,0.0093,0.0042,0.0003,0.0053,0.0036,Rock +0.0123,0.0309,0.0169,0.0313,0.0358,0.0102,0.0182,0.0579,0.1122,0.0835,0.0548,0.0847,0.2026,0.2557,0.187,0.2032,0.1463,0.2849,0.5824,0.7728,0.7852,0.8515,0.5312,0.3653,0.5973,0.8275,1,0.8673,0.6301,0.4591,0.394,0.2576,0.2817,0.2641,0.2757,0.2698,0.3994,0.4576,0.394,0.2522,0.1782,0.1354,0.0516,0.0337,0.0894,0.0861,0.0872,0.0445,0.0134,0.0217,0.0188,0.0133,0.0265,0.0224,0.0074,0.0118,0.0026,0.0092,0.0009,0.0044,Rock +0.0079,0.0086,0.0055,0.025,0.0344,0.0546,0.0528,0.0958,0.1009,0.124,0.1097,0.1215,0.1874,0.3383,0.3227,0.2723,0.3943,0.6432,0.7271,0.8673,0.9674,0.9847,0.948,0.8036,0.6833,0.5136,0.309,0.0832,0.4019,0.2344,0.1905,0.1235,0.1717,0.2351,0.2489,0.3649,0.3382,0.1589,0.0989,0.1089,0.1043,0.0839,0.1391,0.0819,0.0678,0.0663,0.1202,0.0692,0.0152,0.0266,0.0174,0.0176,0.0127,0.0088,0.0098,0.0019,0.0059,0.0058,0.0059,0.0032,Rock +0.009,0.0062,0.0253,0.0489,0.1197,0.1589,0.1392,0.0987,0.0955,0.1895,0.1896,0.2547,0.4073,0.2988,0.2901,0.5326,0.4022,0.1571,0.3024,0.3907,0.3542,0.4438,0.6414,0.4601,0.6009,0.869,0.8345,0.7669,0.5081,0.462,0.538,0.5375,0.3844,0.3601,0.7402,0.7761,0.3858,0.0667,0.3684,0.6114,0.351,0.2312,0.2195,0.3051,0.1937,0.157,0.0479,0.0538,0.0146,0.0068,0.0187,0.0059,0.0095,0.0194,0.008,0.0152,0.0158,0.0053,0.0189,0.0102,Rock +0.0124,0.0433,0.0604,0.0449,0.0597,0.0355,0.0531,0.0343,0.1052,0.212,0.164,0.1901,0.3026,0.2019,0.0592,0.239,0.3657,0.3809,0.5929,0.6299,0.5801,0.4574,0.4449,0.3691,0.6446,0.894,0.8978,0.498,0.3333,0.235,0.1553,0.3666,0.434,0.3082,0.3024,0.4109,0.5501,0.4129,0.5499,0.5018,0.3132,0.2802,0.2351,0.2298,0.1155,0.0724,0.0621,0.0318,0.045,0.0167,0.0078,0.0083,0.0057,0.0174,0.0188,0.0054,0.0114,0.0196,0.0147,0.0062,Rock +0.0298,0.0615,0.065,0.0921,0.1615,0.2294,0.2176,0.2033,0.1459,0.0852,0.2476,0.3645,0.2777,0.2826,0.3237,0.4335,0.5638,0.4555,0.4348,0.6433,0.3932,0.1989,0.354,0.9165,0.9371,0.462,0.2771,0.6613,0.8028,0.42,0.5192,0.6962,0.5792,0.8889,0.7863,0.7133,0.7615,0.4401,0.3009,0.3163,0.2809,0.2898,0.0526,0.1867,0.1553,0.1633,0.1252,0.0748,0.0452,0.0064,0.0154,0.0031,0.0153,0.0071,0.0212,0.0076,0.0152,0.0049,0.02,0.0073,Rock +0.0352,0.0116,0.0191,0.0469,0.0737,0.1185,0.1683,0.1541,0.1466,0.2912,0.2328,0.2237,0.247,0.156,0.3491,0.3308,0.2299,0.2203,0.2493,0.4128,0.3158,0.6191,0.5854,0.3395,0.2561,0.5599,0.8145,0.6941,0.6985,0.866,0.593,0.3664,0.675,0.8697,0.7837,0.7552,0.5789,0.4713,0.1252,0.6087,0.7322,0.5977,0.3431,0.1803,0.2378,0.3424,0.2303,0.0689,0.0216,0.0469,0.0426,0.0346,0.0158,0.0154,0.0109,0.0048,0.0095,0.0015,0.0073,0.0067,Rock +0.0192,0.0607,0.0378,0.0774,0.1388,0.0809,0.0568,0.0219,0.1037,0.1186,0.1237,0.1601,0.352,0.4479,0.3769,0.5761,0.6426,0.679,0.7157,0.5466,0.5399,0.6362,0.7849,0.7756,0.578,0.4862,0.4181,0.2457,0.0716,0.0613,0.1816,0.4493,0.5976,0.3785,0.2495,0.5771,0.8852,0.8409,0.357,0.3133,0.6096,0.6378,0.2709,0.1419,0.126,0.1288,0.079,0.0829,0.052,0.0216,0.036,0.0331,0.0131,0.012,0.0108,0.0024,0.0045,0.0037,0.0112,0.0075,Rock +0.027,0.0092,0.0145,0.0278,0.0412,0.0757,0.1026,0.1138,0.0794,0.152,0.1675,0.137,0.1361,0.1345,0.2144,0.5354,0.683,0.56,0.3093,0.3226,0.443,0.5573,0.5782,0.6173,0.8132,0.9819,0.9823,0.9166,0.7423,0.7736,0.8473,0.7352,0.6671,0.6083,0.6239,0.5972,0.5715,0.5242,0.2924,0.1536,0.2003,0.2031,0.2207,0.1778,0.1353,0.1373,0.0749,0.0472,0.0325,0.0179,0.0045,0.0084,0.001,0.0018,0.0068,0.0039,0.012,0.0132,0.007,0.0088,Rock +0.0126,0.0149,0.0641,0.1732,0.2565,0.2559,0.2947,0.411,0.4983,0.592,0.5832,0.5419,0.5472,0.5314,0.4981,0.6985,0.8292,0.7839,0.8215,0.9363,1,0.9224,0.7839,0.547,0.4562,0.5922,0.5448,0.3971,0.0882,0.2385,0.2005,0.0587,0.2544,0.2009,0.0329,0.1547,0.1212,0.2446,0.3171,0.3195,0.3051,0.0836,0.1266,0.1381,0.1136,0.0516,0.0073,0.0278,0.0372,0.0121,0.0153,0.0092,0.0035,0.0098,0.0121,0.0006,0.0181,0.0094,0.0116,0.0063,Rock +0.0473,0.0509,0.0819,0.1252,0.1783,0.307,0.3008,0.2362,0.383,0.3759,0.3021,0.2909,0.2301,0.1411,0.1582,0.243,0.4474,0.5964,0.6744,0.7969,0.8319,0.7813,0.8626,0.7369,0.4122,0.2596,0.3392,0.3788,0.4488,0.6281,0.7449,0.7328,0.7704,0.787,0.6048,0.586,0.6385,0.7279,0.6286,0.5316,0.4069,0.1791,0.1625,0.2527,0.1903,0.1643,0.0604,0.0209,0.0436,0.0175,0.0107,0.0193,0.0118,0.0064,0.0042,0.0054,0.0049,0.0082,0.0028,0.0027,Rock +0.0664,0.0575,0.0842,0.0372,0.0458,0.0771,0.0771,0.113,0.2353,0.1838,0.2869,0.4129,0.3647,0.1984,0.284,0.4039,0.5837,0.6792,0.6086,0.4858,0.3246,0.2013,0.2082,0.1686,0.2484,0.2736,0.2984,0.4655,0.699,0.7474,0.7956,0.7981,0.6715,0.6942,0.744,0.8169,0.8912,1,0.8753,0.7061,0.6803,0.5898,0.4618,0.3639,0.1492,0.1216,0.1306,0.1198,0.0578,0.0235,0.0135,0.0141,0.019,0.0043,0.0036,0.0026,0.0024,0.0162,0.0109,0.0079,Rock +0.0099,0.0484,0.0299,0.0297,0.0652,0.1077,0.2363,0.2385,0.0075,0.1882,0.1456,0.1892,0.3176,0.134,0.2169,0.2458,0.2589,0.2786,0.2298,0.0656,0.1441,0.1179,0.1668,0.1783,0.2476,0.257,0.1036,0.5356,0.7124,0.6291,0.4756,0.6015,0.7208,0.6234,0.5725,0.7523,0.8712,0.9252,0.9709,0.9297,0.8995,0.7911,0.56,0.2838,0.4407,0.5507,0.4331,0.2905,0.1981,0.0779,0.0396,0.0173,0.0149,0.0115,0.0202,0.0139,0.0029,0.016,0.0106,0.0134,Rock +0.0115,0.015,0.0136,0.0076,0.0211,0.1058,0.1023,0.044,0.0931,0.0734,0.074,0.0622,0.1055,0.1183,0.1721,0.2584,0.3232,0.3817,0.4243,0.4217,0.4449,0.4075,0.3306,0.4012,0.4466,0.5218,0.7552,0.9503,1,0.9084,0.8283,0.7571,0.7262,0.6152,0.568,0.5757,0.5324,0.3672,0.1669,0.0866,0.0646,0.1891,0.2683,0.2887,0.2341,0.1668,0.1015,0.1195,0.0704,0.0167,0.0107,0.0091,0.0016,0.0084,0.0064,0.0026,0.0029,0.0037,0.007,0.0041,Rock +0.0293,0.0644,0.039,0.0173,0.0476,0.0816,0.0993,0.0315,0.0736,0.086,0.0414,0.0472,0.0835,0.0938,0.1466,0.0809,0.1179,0.2179,0.3326,0.3258,0.2111,0.2302,0.3361,0.4259,0.4609,0.2606,0.0874,0.2862,0.5606,0.8344,0.8096,0.725,0.8048,0.9435,1,0.896,0.5516,0.3037,0.2338,0.2382,0.3318,0.3821,0.1575,0.2228,0.1582,0.1433,0.1634,0.1133,0.0567,0.0133,0.017,0.0035,0.0052,0.0083,0.0078,0.0075,0.0105,0.016,0.0095,0.0011,Rock +0.0201,0.0026,0.0138,0.0062,0.0133,0.0151,0.0541,0.021,0.0505,0.1097,0.0841,0.0942,0.1204,0.042,0.0031,0.0162,0.0624,0.2127,0.3436,0.3813,0.3825,0.4764,0.6313,0.7523,0.8675,0.8788,0.7901,0.8357,0.9631,0.9619,0.9236,0.8903,0.9708,0.9647,0.7892,0.5307,0.2718,0.1953,0.1374,0.3105,0.379,0.4105,0.3355,0.2998,0.2748,0.2024,0.1043,0.0453,0.0337,0.0122,0.0072,0.0108,0.007,0.0063,0.003,0.0011,0.0007,0.0024,0.0057,0.0044,Rock +0.0151,0.032,0.0599,0.105,0.1163,0.1734,0.1679,0.1119,0.0889,0.1205,0.0847,0.1518,0.2305,0.2793,0.3404,0.4527,0.695,0.8807,0.9154,0.7542,0.6736,0.7146,0.8335,0.7701,0.6993,0.6543,0.504,0.4926,0.4992,0.4161,0.1631,0.0404,0.0637,0.2962,0.3609,0.1866,0.0476,0.1497,0.2405,0.198,0.3175,0.2379,0.1716,0.1559,0.1556,0.0422,0.0493,0.0476,0.0219,0.0059,0.0086,0.0061,0.0015,0.0084,0.0128,0.0054,0.0011,0.0019,0.0023,0.0062,Rock +0.0177,0.03,0.0288,0.0394,0.063,0.0526,0.0688,0.0633,0.0624,0.0613,0.168,0.3476,0.4561,0.5188,0.6308,0.7201,0.5153,0.3818,0.2644,0.3345,0.4865,0.6628,0.7389,0.9213,1,0.775,0.5593,0.6172,0.8635,0.6592,0.477,0.4983,0.333,0.3076,0.2876,0.2226,0.0794,0.0603,0.1049,0.0606,0.153,0.0983,0.1643,0.1901,0.1107,0.1917,0.1467,0.0392,0.0356,0.027,0.0168,0.0102,0.0122,0.0044,0.0075,0.0124,0.0099,0.0057,0.0032,0.0019,Rock +0.01,0.0275,0.019,0.0371,0.0416,0.0201,0.0314,0.0651,0.1896,0.2668,0.3376,0.3282,0.2432,0.1268,0.1278,0.4441,0.6795,0.7051,0.7966,0.9401,0.9857,0.8193,0.5789,0.6394,0.7043,0.6875,0.4081,0.1811,0.2064,0.3917,0.3791,0.2042,0.2227,0.3341,0.3984,0.5077,0.5534,0.3352,0.2723,0.2278,0.2044,0.1986,0.0835,0.0908,0.138,0.1948,0.1211,0.0843,0.0589,0.0247,0.0118,0.0088,0.0104,0.0036,0.0088,0.0047,0.0117,0.002,0.0091,0.0058,Rock +0.0189,0.0308,0.0197,0.0622,0.008,0.0789,0.144,0.1451,0.1789,0.2522,0.2607,0.371,0.3906,0.2672,0.2716,0.4183,0.6988,0.5733,0.2226,0.2631,0.7473,0.7263,0.3393,0.2824,0.6053,0.5897,0.4967,0.8616,0.8339,0.4084,0.2268,0.1745,0.0507,0.1588,0.304,0.1369,0.1605,0.2061,0.0734,0.0202,0.1638,0.1583,0.183,0.1886,0.1008,0.0663,0.0183,0.0404,0.0108,0.0143,0.0091,0.0038,0.0096,0.0142,0.019,0.014,0.0099,0.0092,0.0052,0.0075,Rock +0.024,0.0218,0.0324,0.0569,0.033,0.0513,0.0897,0.0713,0.0569,0.0389,0.1934,0.2434,0.2906,0.2606,0.3811,0.4997,0.3015,0.3655,0.6791,0.7307,0.5053,0.4441,0.6987,0.8133,0.7781,0.8943,0.8929,0.8913,0.861,0.8063,0.554,0.2446,0.3459,0.1615,0.2467,0.5564,0.4681,0.0979,0.1582,0.0751,0.3321,0.3745,0.2666,0.1078,0.1418,0.1687,0.0738,0.0634,0.0144,0.0226,0.0061,0.0162,0.0146,0.0093,0.0112,0.0094,0.0054,0.0019,0.0066,0.0023,Rock +0.0084,0.0153,0.0291,0.0432,0.0951,0.0752,0.0414,0.0259,0.0692,0.1753,0.197,0.1167,0.1683,0.0814,0.2179,0.5121,0.7231,0.7776,0.6222,0.3501,0.3733,0.2622,0.3776,0.7361,0.8673,0.8223,0.7772,0.7862,0.5652,0.3635,0.3534,0.3865,0.337,0.1693,0.2627,0.3195,0.1388,0.1048,0.1681,0.191,0.1174,0.0933,0.0856,0.0951,0.0986,0.0956,0.0426,0.0407,0.0106,0.0179,0.0056,0.0236,0.0114,0.0136,0.0117,0.006,0.0058,0.0031,0.0072,0.0045,Rock +0.0195,0.0213,0.0058,0.019,0.0319,0.0571,0.1004,0.0668,0.0691,0.0242,0.0728,0.0639,0.3002,0.3854,0.4767,0.4602,0.3175,0.416,0.6428,1,0.8631,0.5212,0.3156,0.5952,0.7732,0.6042,0.4375,0.5487,0.472,0.6235,0.3851,0.159,0.3891,0.5294,0.3504,0.448,0.4041,0.5031,0.6475,0.5493,0.3548,0.2028,0.1882,0.0845,0.1315,0.159,0.0562,0.0617,0.0343,0.037,0.0261,0.0157,0.0074,0.0271,0.0203,0.0089,0.0095,0.0095,0.0021,0.0053,Rock +0.0442,0.0477,0.0049,0.0581,0.0278,0.0678,0.1664,0.149,0.0974,0.1268,0.1109,0.2375,0.2007,0.214,0.1109,0.2036,0.2468,0.6682,0.8345,0.8252,0.8017,0.8982,0.9664,0.8515,0.6626,0.3241,0.2054,0.5669,0.5726,0.4877,0.7532,0.76,0.5185,0.412,0.556,0.5569,0.1336,0.3831,0.4611,0.433,0.2556,0.1466,0.3489,0.2659,0.0944,0.137,0.1344,0.0416,0.0719,0.0637,0.021,0.0204,0.0216,0.0135,0.0055,0.0073,0.008,0.0105,0.0059,0.0105,Rock +0.0311,0.0491,0.0692,0.0831,0.0079,0.02,0.0981,0.1016,0.2025,0.0767,0.1767,0.2555,0.2812,0.2722,0.3227,0.3463,0.5395,0.7911,0.9064,0.8701,0.7672,0.2957,0.4148,0.6043,0.3178,0.3482,0.6158,0.8049,0.6289,0.4999,0.583,0.666,0.4124,0.126,0.2487,0.4676,0.5382,0.315,0.2139,0.1848,0.1679,0.2328,0.1015,0.0713,0.0615,0.0779,0.0761,0.0845,0.0592,0.0068,0.0089,0.0087,0.0032,0.013,0.0188,0.0101,0.0229,0.0182,0.0046,0.0038,Rock +0.0206,0.0132,0.0533,0.0569,0.0647,0.1432,0.1344,0.2041,0.1571,0.1573,0.2327,0.1785,0.1507,0.1916,0.2061,0.2307,0.236,0.1299,0.3812,0.5858,0.4497,0.4876,1,0.8675,0.4718,0.5341,0.6197,0.7143,0.5605,0.3728,0.2481,0.1921,0.1386,0.3325,0.2883,0.3228,0.2607,0.204,0.2396,0.1319,0.0683,0.0334,0.0716,0.0976,0.0787,0.0522,0.05,0.0231,0.0221,0.0144,0.0307,0.0386,0.0147,0.0018,0.01,0.0096,0.0077,0.018,0.0109,0.007,Rock +0.0094,0.0166,0.0398,0.0359,0.0681,0.0706,0.102,0.0893,0.0381,0.1328,0.1303,0.0273,0.0644,0.0712,0.1204,0.0717,0.1224,0.2349,0.3684,0.3918,0.4925,0.8793,0.9606,0.8786,0.6905,0.6937,0.5674,0.654,0.7802,0.7575,0.5836,0.6316,0.8108,0.9039,0.8647,0.6695,0.4027,0.237,0.2685,0.3662,0.3267,0.22,0.2996,0.2205,0.1163,0.0635,0.0465,0.0422,0.0174,0.0172,0.0134,0.0141,0.0191,0.0145,0.0065,0.0129,0.0217,0.0087,0.0077,0.0122,Rock +0.0333,0.0221,0.027,0.0481,0.0679,0.0981,0.0843,0.1172,0.0759,0.092,0.1475,0.0522,0.1119,0.097,0.1174,0.1678,0.1642,0.1205,0.0494,0.1544,0.3485,0.6146,0.9146,0.9364,0.8677,0.8772,0.8553,0.8833,1,0.8296,0.6601,0.5499,0.5716,0.6859,0.6825,0.5142,0.275,0.1358,0.1551,0.2646,0.1994,0.1883,0.2746,0.1651,0.0575,0.0695,0.0598,0.0456,0.0021,0.0068,0.0036,0.0022,0.0032,0.006,0.0054,0.0063,0.0143,0.0132,0.0051,0.0041,Rock +0.0123,0.0022,0.0196,0.0206,0.018,0.0492,0.0033,0.0398,0.0791,0.0475,0.1152,0.052,0.1192,0.1943,0.184,0.2077,0.1956,0.163,0.1218,0.1017,0.1354,0.3157,0.4645,0.5906,0.6776,0.8119,0.8594,0.9228,0.8387,0.7238,0.6292,0.5181,0.4629,0.5255,0.5147,0.3929,0.1279,0.0411,0.0859,0.1131,0.1306,0.1757,0.2648,0.1955,0.0656,0.058,0.0319,0.0301,0.0272,0.0074,0.0149,0.0125,0.0134,0.0026,0.0038,0.0018,0.0113,0.0058,0.0047,0.0071,Rock +0.0091,0.0213,0.0206,0.0505,0.0657,0.0795,0.097,0.0872,0.0743,0.0837,0.1579,0.0898,0.0309,0.1856,0.2969,0.2032,0.1264,0.1655,0.1661,0.2091,0.231,0.446,0.6634,0.6933,0.7663,0.8206,0.7049,0.756,0.7466,0.6387,0.4846,0.3328,0.5356,0.8741,0.8573,0.6718,0.3446,0.315,0.2702,0.2598,0.2742,0.3594,0.4382,0.246,0.0758,0.0187,0.0797,0.0748,0.0367,0.0155,0.03,0.0112,0.0112,0.0102,0.0026,0.0097,0.0098,0.0043,0.0071,0.0108,Rock +0.0068,0.0232,0.0513,0.0444,0.0249,0.0637,0.0422,0.113,0.1911,0.2475,0.1606,0.0922,0.2398,0.322,0.4295,0.2652,0.0666,0.1442,0.2373,0.2595,0.2493,0.3903,0.6384,0.8037,0.7026,0.6874,0.6997,0.8558,1,0.9621,0.8996,0.7575,0.6902,0.5686,0.4396,0.4546,0.2959,0.1587,0.1681,0.0842,0.1173,0.1754,0.2728,0.1705,0.0194,0.0213,0.0354,0.042,0.0093,0.0204,0.0199,0.0173,0.0163,0.0055,0.0045,0.0068,0.0041,0.0052,0.0194,0.0105,Rock +0.0093,0.0185,0.0056,0.0064,0.026,0.0458,0.047,0.0057,0.0425,0.064,0.0888,0.1599,0.1541,0.2768,0.2176,0.2799,0.3491,0.2824,0.2479,0.3005,0.43,0.4684,0.452,0.5026,0.6217,0.6571,0.6632,0.7321,0.8534,1,0.8448,0.6354,0.6308,0.6211,0.6976,0.5868,0.4889,0.3683,0.2043,0.1469,0.222,0.1449,0.149,0.1211,0.1144,0.0791,0.0365,0.0152,0.0085,0.012,0.0022,0.0069,0.0064,0.0129,0.0114,0.0054,0.0089,0.005,0.0058,0.0025,Rock +0.0211,0.0319,0.0415,0.0286,0.0121,0.0438,0.1299,0.139,0.0695,0.0568,0.0869,0.1935,0.1478,0.1871,0.1994,0.3283,0.6861,0.5814,0.25,0.1734,0.3363,0.5588,0.6592,0.7012,0.8099,0.8901,0.8745,0.7887,0.8725,0.9376,0.892,0.7508,0.6832,0.761,0.9017,1,0.9123,0.7388,0.5915,0.4057,0.3019,0.2331,0.2931,0.2298,0.2391,0.191,0.1096,0.03,0.0171,0.0383,0.0053,0.009,0.0042,0.0153,0.0106,0.002,0.0105,0.0049,0.007,0.008,Rock +0.0093,0.0269,0.0217,0.0339,0.0305,0.1172,0.145,0.0638,0.074,0.136,0.2132,0.3738,0.3738,0.2673,0.2333,0.5367,0.7312,0.7659,0.6271,0.4395,0.433,0.4326,0.5544,0.736,0.8589,0.8989,0.942,0.9401,0.9379,0.8575,0.7284,0.67,0.7547,0.8773,0.9919,0.9922,0.9419,0.8388,0.6605,0.4816,0.2917,0.1769,0.1136,0.0701,0.1578,0.1938,0.1106,0.0693,0.0176,0.0205,0.0309,0.0212,0.0091,0.0056,0.0086,0.0092,0.007,0.0116,0.006,0.011,Rock +0.0257,0.0447,0.0388,0.0239,0.1315,0.1323,0.1608,0.2145,0.0847,0.0561,0.0891,0.0861,0.1531,0.1524,0.1849,0.2871,0.2009,0.2748,0.5017,0.2172,0.4978,0.5265,0.3647,0.5768,0.5161,0.5715,0.4006,0.365,0.6685,0.8659,0.8052,0.4082,0.3379,0.5092,0.6776,0.7313,0.6062,0.704,0.8849,0.8979,0.7751,0.7247,0.7733,0.7762,0.6009,0.4514,0.3096,0.1859,0.0956,0.0206,0.0206,0.0096,0.0153,0.0096,0.0131,0.0198,0.0025,0.0199,0.0255,0.018,Rock +0.0408,0.0653,0.0397,0.0604,0.0496,0.1817,0.1178,0.1024,0.0583,0.2176,0.2459,0.3332,0.3087,0.2613,0.3232,0.3731,0.4203,0.5364,0.7062,0.8196,0.8835,0.8299,0.7609,0.7605,0.8367,0.8905,0.7652,0.5897,0.3037,0.0823,0.2787,0.7241,0.8032,0.805,0.7676,0.7468,0.6253,0.173,0.2916,0.5003,0.522,0.4824,0.4004,0.3877,0.1651,0.0442,0.0663,0.0418,0.0475,0.0235,0.0066,0.0062,0.0129,0.0184,0.0069,0.0198,0.0199,0.0102,0.007,0.0055,Rock +0.0308,0.0339,0.0202,0.0889,0.157,0.175,0.092,0.1353,0.1593,0.2795,0.3336,0.294,0.1608,0.3335,0.4985,0.7295,0.735,0.8253,0.8793,0.9657,1,0.8707,0.6471,0.5973,0.8218,0.7755,0.6111,0.4195,0.299,0.1354,0.2438,0.5624,0.5555,0.6963,0.7298,0.7022,0.5468,0.1421,0.4738,0.641,0.4375,0.3178,0.2377,0.2808,0.1374,0.1136,0.1034,0.0688,0.0422,0.0117,0.007,0.0167,0.0127,0.0138,0.009,0.0051,0.0029,0.0122,0.0056,0.002,Rock +0.0373,0.0281,0.0232,0.0225,0.0179,0.0733,0.0841,0.1031,0.0993,0.0802,0.1564,0.2565,0.2624,0.1179,0.0597,0.1563,0.2241,0.3586,0.1792,0.3256,0.6079,0.6988,0.8391,0.8553,0.771,0.6215,0.5736,0.4402,0.4056,0.4411,0.513,0.5965,0.7272,0.6539,0.5902,0.5393,0.4897,0.4081,0.4145,0.6003,0.7196,0.6633,0.6287,0.4087,0.3212,0.2518,0.1482,0.0988,0.0317,0.0269,0.0066,0.0008,0.0045,0.0024,0.0006,0.0073,0.0096,0.0054,0.0085,0.006,Rock +0.019,0.0038,0.0642,0.0452,0.0333,0.069,0.0901,0.1454,0.074,0.0349,0.1459,0.3473,0.3197,0.2823,0.0166,0.0572,0.2164,0.4563,0.3819,0.5627,0.6484,0.7235,0.8242,0.8766,1,0.8582,0.6563,0.5087,0.4817,0.453,0.4521,0.4532,0.5385,0.5308,0.5356,0.5271,0.426,0.2436,0.1205,0.3845,0.4107,0.5067,0.4216,0.2479,0.1586,0.1124,0.0651,0.0789,0.0325,0.007,0.0026,0.0093,0.0118,0.0112,0.0094,0.014,0.0072,0.0022,0.0055,0.0122,Rock +0.0119,0.0582,0.0623,0.06,0.1397,0.1883,0.1422,0.1447,0.0487,0.0864,0.2143,0.372,0.2665,0.2113,0.1103,0.1136,0.1934,0.4142,0.3279,0.6222,0.7468,0.7676,0.7867,0.8253,1,0.9481,0.7539,0.6008,0.5437,0.5387,0.5619,0.5141,0.6084,0.5621,0.5956,0.6078,0.5025,0.2829,0.0477,0.2811,0.3422,0.5147,0.4372,0.247,0.1708,0.1343,0.0838,0.0755,0.0304,0.0074,0.0069,0.0025,0.0103,0.0074,0.0123,0.0069,0.0076,0.0073,0.003,0.0138,Rock +0.0353,0.0713,0.0326,0.0272,0.037,0.0792,0.1083,0.0687,0.0298,0.088,0.1078,0.0979,0.225,0.2819,0.2099,0.124,0.1699,0.0939,0.1091,0.141,0.1268,0.3151,0.143,0.2264,0.5756,0.7876,0.7158,0.5998,0.5583,0.6295,0.7659,0.894,0.8436,0.6807,0.838,1,0.9497,0.7866,0.5647,0.348,0.2585,0.2304,0.2948,0.3363,0.3017,0.2193,0.1316,0.1078,0.0559,0.0035,0.0098,0.0163,0.0242,0.0043,0.0202,0.0108,0.0037,0.0096,0.0093,0.0053,Rock +0.0131,0.0068,0.0308,0.0311,0.0085,0.0767,0.0771,0.064,0.0726,0.0901,0.075,0.0844,0.1226,0.1619,0.2317,0.2934,0.3526,0.3657,0.3221,0.3093,0.4084,0.4285,0.4663,0.5956,0.6948,0.8386,0.8875,0.6404,0.3308,0.3425,0.492,0.4592,0.3034,0.4366,0.5175,0.5122,0.4746,0.4902,0.4603,0.446,0.4196,0.2873,0.2296,0.0949,0.0095,0.0527,0.0383,0.0107,0.0108,0.0077,0.0109,0.0062,0.0028,0.004,0.0075,0.0039,0.0053,0.0013,0.0052,0.0023,Rock +0.0087,0.0046,0.0081,0.023,0.0586,0.0682,0.0993,0.0717,0.0576,0.0818,0.1315,0.1862,0.2789,0.2579,0.224,0.2568,0.2933,0.2991,0.3924,0.4691,0.5665,0.6464,0.6774,0.7577,0.8856,0.9419,1,0.8564,0.679,0.5587,0.4147,0.2946,0.2025,0.0688,0.1171,0.2157,0.2216,0.2776,0.2309,0.1444,0.1513,0.1745,0.1756,0.1424,0.0908,0.0138,0.0469,0.048,0.0159,0.0045,0.0015,0.0052,0.0038,0.0079,0.0114,0.005,0.003,0.0064,0.0058,0.003,Rock +0.0293,0.0378,0.0257,0.0062,0.013,0.0612,0.0895,0.1107,0.0973,0.0751,0.0528,0.1209,0.1763,0.2039,0.2727,0.2321,0.2676,0.2934,0.3295,0.491,0.5402,0.6257,0.6826,0.7527,0.8504,0.8938,0.9928,0.9134,0.708,0.6318,0.6126,0.4638,0.2797,0.1721,0.1665,0.2561,0.2735,0.3209,0.2724,0.188,0.1552,0.2522,0.2121,0.1801,0.1473,0.0681,0.1091,0.0919,0.0397,0.0093,0.0076,0.0065,0.0072,0.0108,0.0051,0.0102,0.0041,0.0055,0.005,0.0087,Rock +0.0132,0.008,0.0188,0.0141,0.0436,0.0668,0.0609,0.0131,0.0899,0.0922,0.1445,0.1475,0.2087,0.2558,0.2603,0.1985,0.2394,0.3134,0.4077,0.4529,0.4893,0.5666,0.6234,0.6741,0.8282,0.8823,0.9196,0.8965,0.7549,0.6736,0.6463,0.5007,0.3663,0.2298,0.1362,0.2123,0.2395,0.2673,0.2865,0.206,0.1659,0.2633,0.2552,0.1696,0.1467,0.1286,0.0926,0.0716,0.0325,0.0258,0.0136,0.0044,0.0028,0.0021,0.0022,0.0048,0.0138,0.014,0.0028,0.0064,Rock +0.0201,0.0116,0.0123,0.0245,0.0547,0.0208,0.0891,0.0836,0.1335,0.1199,0.1742,0.1387,0.2042,0.258,0.2616,0.2097,0.2532,0.3213,0.4327,0.476,0.5328,0.6057,0.6696,0.7476,0.893,0.9405,1,0.9785,0.8473,0.7639,0.6701,0.4989,0.3718,0.2196,0.1416,0.268,0.263,0.3104,0.3392,0.2123,0.117,0.2655,0.2203,0.1541,0.1464,0.1044,0.1225,0.0745,0.049,0.0224,0.0032,0.0076,0.0045,0.0056,0.0075,0.0037,0.0045,0.0029,0.0008,0.0018,Rock +0.0152,0.0102,0.0113,0.0263,0.0097,0.0391,0.0857,0.0915,0.0949,0.1504,0.1911,0.2115,0.2249,0.2573,0.1701,0.2023,0.2538,0.3417,0.4026,0.4553,0.5525,0.5991,0.5854,0.7114,0.95,0.9858,1,0.9578,0.8642,0.7128,0.5893,0.4323,0.2897,0.1744,0.077,0.2297,0.2459,0.3101,0.3312,0.222,0.0871,0.2064,0.1808,0.1624,0.112,0.0815,0.1117,0.095,0.0412,0.012,0.0048,0.0049,0.0041,0.0036,0.0013,0.0046,0.0037,0.0011,0.0034,0.0033,Rock +0.0216,0.0124,0.0174,0.0152,0.0608,0.1026,0.1139,0.0877,0.116,0.0866,0.1564,0.078,0.0997,0.0915,0.0662,0.1134,0.174,0.2573,0.3294,0.391,0.5438,0.6115,0.7022,0.761,0.7973,0.9105,0.8807,0.7949,0.799,0.718,0.6407,0.6312,0.5929,0.6168,0.6498,0.6764,0.6253,0.5117,0.389,0.3273,0.2509,0.153,0.1323,0.1657,0.1215,0.0978,0.0452,0.0273,0.0179,0.0092,0.0018,0.0052,0.0049,0.0096,0.0134,0.0122,0.0047,0.0018,0.0006,0.0023,Rock +0.0225,0.0019,0.0075,0.0097,0.0445,0.0906,0.0889,0.0655,0.1624,0.1452,0.1442,0.0948,0.0618,0.1641,0.0708,0.0844,0.259,0.2679,0.3094,0.4678,0.5958,0.7245,0.8773,0.9214,0.9282,0.9942,1,0.9071,0.8545,0.7293,0.6499,0.6071,0.5588,0.5967,0.6275,0.5459,0.4786,0.3965,0.2087,0.1651,0.1836,0.0652,0.0758,0.0486,0.0353,0.0297,0.0241,0.0379,0.0119,0.0073,0.0051,0.0034,0.0129,0.01,0.0044,0.0057,0.003,0.0035,0.0021,0.0027,Rock +0.0125,0.0152,0.0218,0.0175,0.0362,0.0696,0.0873,0.0616,0.1252,0.1302,0.0888,0.05,0.0628,0.1274,0.0801,0.0742,0.2048,0.295,0.3193,0.4567,0.5959,0.7101,0.8225,0.8425,0.9065,0.9802,1,0.8752,0.7583,0.6616,0.5786,0.5128,0.4776,0.4994,0.5197,0.5071,0.4577,0.3505,0.1845,0.189,0.1967,0.1041,0.055,0.0492,0.0622,0.0505,0.0247,0.0219,0.0102,0.0047,0.0019,0.0041,0.0074,0.003,0.005,0.0048,0.0017,0.0041,0.0086,0.0058,Rock +0.013,0.0006,0.0088,0.0456,0.0525,0.0778,0.0931,0.0941,0.1711,0.1483,0.1532,0.11,0.089,0.1236,0.1197,0.1145,0.2137,0.2838,0.364,0.543,0.6673,0.7979,0.9273,0.9027,0.9192,1,0.9821,0.9092,0.8184,0.6962,0.59,0.5447,0.5142,0.5389,0.5531,0.5318,0.4826,0.379,0.1831,0.175,0.1679,0.0674,0.0609,0.0375,0.0533,0.0278,0.0179,0.0114,0.0073,0.0116,0.0092,0.0078,0.0041,0.0013,0.0011,0.0045,0.0039,0.0022,0.0023,0.0016,Rock +0.0135,0.0045,0.0051,0.0289,0.0561,0.0929,0.1031,0.0883,0.1596,0.1908,0.1576,0.1112,0.1197,0.1174,0.1415,0.2215,0.2658,0.2713,0.3862,0.5717,0.6797,0.8747,1,0.8948,0.842,0.9174,0.9307,0.905,0.8228,0.6986,0.5831,0.4924,0.4563,0.5159,0.567,0.5284,0.5144,0.3742,0.2282,0.1193,0.1088,0.0431,0.107,0.0583,0.0046,0.0473,0.0408,0.029,0.0192,0.0094,0.0025,0.0037,0.0084,0.0102,0.0096,0.0024,0.0037,0.0028,0.003,0.003,Rock +0.0086,0.0215,0.0242,0.0445,0.0667,0.0771,0.0499,0.0906,0.1229,0.1185,0.0775,0.1101,0.1042,0.0853,0.0456,0.1304,0.269,0.2947,0.3669,0.4948,0.6275,0.8162,0.9237,0.871,0.8052,0.8756,1,0.9858,0.9427,0.8114,0.6987,0.681,0.6591,0.6954,0.729,0.668,0.5917,0.4899,0.3439,0.2366,0.1716,0.1013,0.0766,0.0845,0.026,0.0333,0.0205,0.0309,0.0101,0.0095,0.0047,0.0072,0.0054,0.0022,0.0016,0.0029,0.0058,0.005,0.0024,0.003,Rock +0.0067,0.0096,0.0024,0.0058,0.0197,0.0618,0.0432,0.0951,0.0836,0.118,0.0978,0.0909,0.0656,0.0593,0.0832,0.1297,0.2038,0.3811,0.4451,0.5224,0.5911,0.6566,0.6308,0.5998,0.4958,0.5647,0.6906,0.8513,1,0.9166,0.7676,0.6177,0.5468,0.5516,0.5463,0.5515,0.4561,0.3466,0.3384,0.2853,0.2502,0.1641,0.1605,0.1491,0.1326,0.0687,0.0602,0.0561,0.0306,0.0154,0.0029,0.0048,0.0023,0.002,0.004,0.0019,0.0034,0.0034,0.0051,0.0031,Rock +0.0071,0.0103,0.0135,0.0494,0.0253,0.0806,0.0701,0.0738,0.0117,0.0898,0.0289,0.1554,0.1437,0.1035,0.1424,0.1227,0.0892,0.2047,0.0827,0.1524,0.3031,0.1608,0.0667,0.1426,0.0395,0.1653,0.3399,0.4855,0.5206,0.5508,0.6102,0.5989,0.6764,0.8897,1,0.9517,0.8459,0.7073,0.6697,0.6326,0.5102,0.4161,0.2816,0.1705,0.1421,0.0971,0.0879,0.0863,0.0355,0.0233,0.0252,0.0043,0.0048,0.0076,0.0124,0.0105,0.0054,0.0032,0.0073,0.0063,Rock +0.0176,0.0172,0.0501,0.0285,0.0262,0.0351,0.0362,0.0535,0.0258,0.0474,0.0526,0.1854,0.104,0.0948,0.0912,0.1688,0.1568,0.0375,0.1316,0.2086,0.1976,0.0946,0.1965,0.1242,0.0616,0.2141,0.4642,0.6471,0.634,0.6107,0.7046,0.5376,0.5934,0.8443,0.9481,0.9705,0.7766,0.6313,0.576,0.6148,0.545,0.4813,0.3406,0.1916,0.1134,0.064,0.0911,0.098,0.0563,0.0187,0.0088,0.0042,0.0175,0.0171,0.0079,0.005,0.0112,0.0179,0.0294,0.0063,Rock +0.0265,0.044,0.0137,0.0084,0.0305,0.0438,0.0341,0.078,0.0844,0.0779,0.0327,0.206,0.1908,0.1065,0.1457,0.2232,0.207,0.1105,0.1078,0.1165,0.2224,0.0689,0.206,0.2384,0.0904,0.2278,0.5872,0.8457,0.8467,0.7679,0.8055,0.626,0.6545,0.8747,0.9885,0.9348,0.696,0.5733,0.5872,0.6663,0.5651,0.5247,0.3684,0.1997,0.1512,0.0508,0.0931,0.0982,0.0524,0.0188,0.01,0.0038,0.0187,0.0156,0.0068,0.0097,0.0073,0.0081,0.0086,0.0095,Rock +0.0368,0.0403,0.0317,0.0293,0.082,0.1342,0.1161,0.0663,0.0155,0.0506,0.0906,0.2545,0.1464,0.1272,0.1223,0.1669,0.1424,0.1285,0.1857,0.1136,0.2069,0.0219,0.24,0.2547,0.024,0.1923,0.4753,0.7003,0.6825,0.6443,0.7063,0.5373,0.6601,0.8708,0.9518,0.9605,0.7712,0.6772,0.6431,0.672,0.6035,0.5155,0.3802,0.2278,0.1522,0.0801,0.0804,0.0752,0.0566,0.0175,0.0058,0.0091,0.016,0.016,0.0081,0.007,0.0135,0.0067,0.0078,0.0068,Rock +0.0195,0.0142,0.0181,0.0406,0.0391,0.0249,0.0892,0.0973,0.084,0.1191,0.1522,0.1322,0.1434,0.1244,0.0653,0.089,0.1226,0.1846,0.388,0.3658,0.2297,0.261,0.4193,0.5848,0.5643,0.5448,0.4772,0.6897,0.9797,1,0.9546,0.8835,0.7662,0.6547,0.5447,0.4593,0.4679,0.1987,0.0699,0.1493,0.1713,0.1654,0.26,0.3846,0.3754,0.2414,0.1077,0.0224,0.0155,0.0187,0.0125,0.0028,0.0067,0.012,0.0012,0.0022,0.0058,0.0042,0.0067,0.0012,Rock +0.0216,0.0215,0.0273,0.0139,0.0357,0.0785,0.0906,0.0908,0.1151,0.0973,0.1203,0.1102,0.1192,0.1762,0.239,0.2138,0.1929,0.1765,0.0746,0.1265,0.2005,0.1571,0.2605,0.5386,0.844,1,0.8684,0.6742,0.5537,0.4638,0.3609,0.2055,0.162,0.2092,0.31,0.2344,0.1058,0.0383,0.0528,0.1291,0.2241,0.1915,0.1587,0.0942,0.084,0.067,0.0342,0.0469,0.0357,0.0136,0.0082,0.014,0.0044,0.0052,0.0073,0.0021,0.0047,0.0024,0.0009,0.0017,Rock +0.0065,0.0122,0.0068,0.0108,0.0217,0.0284,0.0527,0.0575,0.1054,0.1109,0.0937,0.0827,0.092,0.0911,0.1487,0.1666,0.1268,0.1374,0.1095,0.1286,0.2146,0.2889,0.4238,0.6168,0.8167,0.9622,0.828,0.5816,0.4667,0.3539,0.2727,0.141,0.1863,0.2176,0.236,0.1725,0.0589,0.0621,0.1847,0.2452,0.2984,0.3041,0.2275,0.148,0.1102,0.1178,0.0608,0.0333,0.0276,0.01,0.0023,0.0069,0.0025,0.0027,0.0052,0.0036,0.0026,0.0036,0.0006,0.0035,Rock +0.0036,0.0078,0.0092,0.0387,0.053,0.1197,0.1243,0.1026,0.1239,0.0888,0.0937,0.1245,0.1599,0.1542,0.1846,0.1732,0.1477,0.1748,0.1455,0.1579,0.2257,0.1975,0.3368,0.5828,0.8505,1,0.8457,0.6624,0.5564,0.3925,0.3233,0.2054,0.192,0.2227,0.3147,0.2268,0.0795,0.0748,0.1166,0.1969,0.2619,0.2507,0.1983,0.0948,0.0931,0.0965,0.0381,0.0435,0.0336,0.0055,0.0079,0.0119,0.0055,0.0035,0.0036,0.0004,0.0018,0.0049,0.0024,0.0016,Rock +0.0208,0.0186,0.0131,0.0211,0.061,0.0613,0.0612,0.0506,0.0989,0.1093,0.1063,0.1179,0.1291,0.1591,0.168,0.1918,0.1615,0.1647,0.1397,0.1426,0.2429,0.2816,0.429,0.6443,0.9061,1,0.8087,0.6119,0.526,0.3677,0.2746,0.102,0.1339,0.1582,0.1952,0.1787,0.0429,0.1096,0.1762,0.2481,0.315,0.292,0.1902,0.0696,0.0758,0.091,0.0441,0.0244,0.0265,0.0095,0.014,0.0074,0.0063,0.0081,0.0087,0.0044,0.0028,0.0019,0.0049,0.0023,Rock +0.0139,0.0222,0.0089,0.0108,0.0215,0.0136,0.0659,0.0954,0.0786,0.1015,0.1261,0.0828,0.0493,0.0848,0.1514,0.1396,0.1066,0.1923,0.2991,0.3247,0.3797,0.5658,0.7483,0.8757,0.9048,0.7511,0.6858,0.7043,0.5864,0.3773,0.2206,0.2628,0.2672,0.2907,0.1982,0.2288,0.3186,0.2871,0.2921,0.2806,0.2682,0.2112,0.1513,0.1789,0.185,0.1717,0.0898,0.0656,0.0445,0.011,0.0024,0.0062,0.0072,0.0113,0.0012,0.0022,0.0025,0.0059,0.0039,0.0048,Rock +0.0109,0.0093,0.0121,0.0378,0.0679,0.0863,0.1004,0.0664,0.0941,0.1036,0.0972,0.0501,0.1546,0.3404,0.4804,0.657,0.7738,0.7827,0.8152,0.8129,0.8297,0.8535,0.887,0.8894,0.898,0.9667,1,0.9134,0.6762,0.4659,0.2895,0.2959,0.1746,0.2112,0.2569,0.2276,0.2149,0.1601,0.0371,0.0117,0.0488,0.0288,0.0597,0.0431,0.0369,0.0025,0.0327,0.0257,0.0182,0.0108,0.0124,0.0077,0.0023,0.0117,0.0053,0.0077,0.0076,0.0056,0.0055,0.0039,Rock +0.0202,0.0104,0.0325,0.0239,0.0807,0.1529,0.1154,0.0608,0.1317,0.137,0.0843,0.0269,0.1254,0.3046,0.5584,0.7973,0.8341,0.8057,0.8616,0.8769,0.9413,0.9403,0.9409,1,0.9725,0.9309,0.9351,0.7317,0.4421,0.3244,0.4161,0.4611,0.4031,0.3,0.2459,0.1348,0.2541,0.2255,0.1598,0.1485,0.0845,0.0569,0.0855,0.1262,0.1153,0.057,0.0426,0.0425,0.0235,0.0006,0.0188,0.0127,0.0081,0.0067,0.0043,0.0065,0.0049,0.0054,0.0073,0.0054,Rock +0.0239,0.0189,0.0466,0.044,0.0657,0.0742,0.138,0.1099,0.1384,0.1376,0.0938,0.0259,0.1499,0.2851,0.5743,0.8278,0.8669,0.8131,0.9045,0.9046,1,0.9976,0.9872,0.9761,0.9009,0.9724,0.9675,0.7633,0.4434,0.3822,0.4727,0.4007,0.3381,0.3172,0.2222,0.0733,0.2692,0.1888,0.0712,0.1062,0.0694,0.03,0.0893,0.1459,0.1348,0.0391,0.0546,0.0469,0.0201,0.0095,0.0155,0.0091,0.0151,0.008,0.0018,0.0078,0.0045,0.0026,0.0036,0.0024,Rock +0.0336,0.0294,0.0476,0.0539,0.0794,0.0804,0.1136,0.1228,0.1235,0.0842,0.0357,0.0689,0.1705,0.3257,0.4602,0.6225,0.7327,0.7843,0.7988,0.8261,1,0.9814,0.962,0.9601,0.9118,0.9086,0.7931,0.5877,0.3474,0.4235,0.4633,0.341,0.2849,0.2847,0.1742,0.0549,0.1192,0.1154,0.0855,0.1811,0.1264,0.0799,0.0378,0.1268,0.1125,0.0505,0.0949,0.0677,0.0259,0.017,0.0033,0.015,0.0111,0.0032,0.0035,0.0169,0.0137,0.0015,0.0069,0.0051,Rock +0.0231,0.0351,0.003,0.0304,0.0339,0.086,0.1738,0.1351,0.1063,0.0347,0.0575,0.1382,0.2274,0.4038,0.5223,0.6847,0.7521,0.776,0.7708,0.8627,1,0.8873,0.8057,0.876,0.9066,0.943,0.8846,0.65,0.297,0.2423,0.2992,0.2285,0.2277,0.1529,0.1037,0.0352,0.1073,0.1373,0.1331,0.1454,0.1115,0.044,0.0762,0.1381,0.0831,0.0654,0.0844,0.0595,0.0497,0.0313,0.0154,0.0106,0.0097,0.0022,0.0052,0.0072,0.0056,0.0038,0.0043,0.003,Rock +0.0108,0.0086,0.0058,0.046,0.0752,0.0887,0.1015,0.0494,0.0472,0.0393,0.1106,0.1412,0.2202,0.2976,0.4116,0.4754,0.539,0.6279,0.706,0.7918,0.9493,1,0.9645,0.9432,0.8658,0.7895,0.6501,0.4492,0.4739,0.6153,0.4929,0.3195,0.3735,0.3336,0.1052,0.0671,0.0379,0.0461,0.1694,0.2169,0.1677,0.0644,0.0159,0.0778,0.0653,0.021,0.0509,0.0387,0.0262,0.0101,0.0161,0.0029,0.0078,0.0114,0.0083,0.0058,0.0003,0.0023,0.0026,0.0027,Rock +0.0229,0.0369,0.004,0.0375,0.0455,0.1452,0.2211,0.1188,0.075,0.1631,0.2709,0.3358,0.4091,0.44,0.5485,0.7213,0.8137,0.9185,1,0.9418,0.9116,0.9349,0.7484,0.5146,0.4106,0.3443,0.6981,0.8713,0.9013,0.8014,0.438,0.1319,0.1709,0.2484,0.3044,0.2312,0.1338,0.2056,0.2474,0.279,0.161,0.0056,0.0351,0.1148,0.1331,0.0276,0.0763,0.0631,0.0309,0.024,0.0115,0.0064,0.0022,0.0122,0.0151,0.0056,0.0026,0.0029,0.0104,0.0163,Rock +0.01,0.0194,0.0155,0.0489,0.0839,0.1009,0.1627,0.2071,0.2696,0.299,0.3242,0.3565,0.3951,0.5201,0.6953,0.8468,1,0.9278,0.851,0.801,0.8142,0.8825,0.7302,0.6107,0.7159,0.8458,0.6319,0.4808,0.6291,0.7152,0.6005,0.4235,0.4106,0.3992,0.173,0.1975,0.237,0.1339,0.1583,0.3151,0.1968,0.2054,0.1272,0.1129,0.1946,0.2195,0.193,0.1498,0.0773,0.0196,0.0122,0.013,0.0073,0.0077,0.0075,0.006,0.008,0.0019,0.0053,0.0019,Rock +0.0409,0.0421,0.0573,0.013,0.0183,0.1019,0.1054,0.107,0.2302,0.2259,0.2373,0.3323,0.3827,0.484,0.6812,0.7555,0.9522,0.9826,0.8871,0.8268,0.7561,0.8217,0.6967,0.6444,0.6948,0.8014,0.6053,0.6084,0.8877,0.8557,0.5563,0.2897,0.3638,0.4786,0.2908,0.0899,0.2043,0.1707,0.0407,0.1286,0.1581,0.2191,0.1701,0.0971,0.2217,0.2732,0.1874,0.1062,0.0665,0.0405,0.0113,0.0028,0.0036,0.0105,0.012,0.0087,0.0061,0.0061,0.003,0.0078,Rock +0.0217,0.034,0.0392,0.0236,0.1081,0.1164,0.1398,0.1009,0.1147,0.1777,0.4079,0.4113,0.3973,0.5078,0.6509,0.8073,0.9819,1,0.9407,0.8452,0.8106,0.846,0.6212,0.5815,0.7745,0.8204,0.5601,0.2989,0.5009,0.6628,0.5753,0.4055,0.3746,0.3481,0.158,0.1422,0.213,0.1866,0.1003,0.2396,0.2241,0.2029,0.071,0.1606,0.1669,0.17,0.1829,0.1403,0.0506,0.0224,0.0095,0.0031,0.0103,0.0078,0.0077,0.0094,0.0031,0.003,0.0013,0.0069,Rock +0.0378,0.0318,0.0423,0.035,0.1787,0.1635,0.0887,0.0817,0.1779,0.2053,0.3135,0.3118,0.3686,0.3885,0.585,0.7868,0.9739,1,0.9843,0.861,0.8443,0.9061,0.5847,0.4033,0.5946,0.6793,0.6389,0.5002,0.5578,0.4831,0.4729,0.3318,0.3969,0.3894,0.2314,0.1036,0.1312,0.0864,0.2569,0.3179,0.2649,0.2714,0.1713,0.0584,0.123,0.22,0.2198,0.1074,0.0423,0.0162,0.0093,0.0046,0.0044,0.0078,0.0102,0.0065,0.0061,0.0062,0.0043,0.0053,Rock +0.0365,0.1632,0.1636,0.1421,0.113,0.1306,0.2112,0.2268,0.2992,0.3735,0.3042,0.0387,0.2679,0.5397,0.6204,0.7257,0.835,0.6888,0.445,0.3921,0.5605,0.7545,0.8311,1,0.8762,0.7092,0.7009,0.5014,0.3942,0.4456,0.4072,0.0773,0.1423,0.0401,0.3597,0.6847,0.7076,0.3597,0.0612,0.3027,0.3966,0.3868,0.238,0.2059,0.2288,0.1704,0.1587,0.1792,0.1022,0.0151,0.0223,0.011,0.0071,0.0205,0.0164,0.0063,0.0078,0.0094,0.011,0.0068,Rock +0.0188,0.037,0.0953,0.0824,0.0249,0.0488,0.1424,0.1972,0.1873,0.1806,0.2139,0.1523,0.1975,0.4844,0.7298,0.7807,0.7906,0.6122,0.42,0.2807,0.5148,0.7569,0.8596,1,0.8457,0.6797,0.6971,0.5843,0.4772,0.5201,0.4241,0.1592,0.1668,0.0588,0.3967,0.7147,0.7319,0.3509,0.0589,0.269,0.42,0.3874,0.244,0.2,0.2307,0.1886,0.196,0.1701,0.1366,0.0398,0.0143,0.0093,0.0033,0.0113,0.003,0.0057,0.009,0.0057,0.0068,0.0024,Rock +0.0856,0.0454,0.0382,0.0203,0.0385,0.0534,0.214,0.311,0.2837,0.2751,0.2707,0.0946,0.102,0.4519,0.6737,0.6699,0.7066,0.5632,0.3785,0.2721,0.5297,0.7697,0.8643,0.9304,0.9372,0.6247,0.6024,0.681,0.5047,0.5775,0.4754,0.24,0.2779,0.1997,0.5305,0.7409,0.7775,0.4424,0.1416,0.3508,0.4482,0.4208,0.3054,0.2235,0.2611,0.2798,0.2392,0.2021,0.1326,0.0358,0.0128,0.0172,0.0138,0.0079,0.0037,0.0051,0.0258,0.0102,0.0037,0.0037,Rock +0.0274,0.0242,0.0621,0.056,0.1129,0.0973,0.1823,0.1745,0.144,0.1808,0.2366,0.0906,0.1749,0.4012,0.5187,0.7312,0.9062,0.926,0.7434,0.4463,0.5103,0.6952,0.7755,0.8364,0.7283,0.6399,0.5759,0.4146,0.3495,0.4437,0.2665,0.2024,0.1942,0.0765,0.3725,0.5843,0.4827,0.2347,0.0999,0.3244,0.399,0.2975,0.1684,0.1761,0.1683,0.0729,0.119,0.1297,0.0748,0.0067,0.0255,0.0113,0.0108,0.0085,0.0047,0.0074,0.0104,0.0161,0.022,0.0173,Rock +0.0235,0.0291,0.0749,0.0519,0.0227,0.0834,0.0677,0.2002,0.2876,0.3674,0.2974,0.0837,0.1912,0.504,0.6352,0.6804,0.7505,0.6595,0.4509,0.2964,0.4019,0.6794,0.8297,1,0.824,0.7115,0.7726,0.6124,0.4936,0.5648,0.4906,0.182,0.1811,0.1107,0.4603,0.665,0.6423,0.2166,0.1951,0.4947,0.4925,0.4041,0.2402,0.1392,0.1779,0.1946,0.1723,0.1522,0.0929,0.0179,0.0242,0.0083,0.0037,0.0095,0.0105,0.003,0.0132,0.0068,0.0108,0.009,Rock +0.0126,0.0519,0.0621,0.0518,0.1072,0.2587,0.2304,0.2067,0.3416,0.4284,0.3015,0.1207,0.3299,0.5707,0.6962,0.9751,1,0.9293,0.621,0.4586,0.5001,0.5032,0.7082,0.842,0.8109,0.769,0.8105,0.6203,0.2356,0.2595,0.6299,0.6762,0.2903,0.4393,0.8529,0.718,0.4801,0.5856,0.4993,0.2866,0.0601,0.1167,0.2737,0.2812,0.2078,0.066,0.0491,0.0345,0.0172,0.0287,0.0027,0.0208,0.0048,0.0199,0.0126,0.0022,0.0037,0.0034,0.0114,0.0077,Rock +0.0253,0.0808,0.0507,0.0244,0.1724,0.3823,0.3729,0.3583,0.3429,0.2197,0.2653,0.3223,0.5582,0.6916,0.7943,0.7152,0.3512,0.2008,0.2676,0.4299,0.528,0.3489,0.143,0.5453,0.6338,0.7712,0.6838,0.8015,0.8073,0.831,0.7792,0.5049,0.1413,0.2767,0.5084,0.4787,0.1356,0.2299,0.2789,0.3833,0.2933,0.1155,0.1705,0.1294,0.0909,0.08,0.0567,0.0198,0.0114,0.0151,0.0085,0.0178,0.0073,0.0079,0.0038,0.0116,0.0033,0.0039,0.0081,0.0053,Rock +0.026,0.0192,0.0254,0.0061,0.0352,0.0701,0.1263,0.108,0.1523,0.163,0.103,0.2187,0.1542,0.263,0.294,0.2978,0.0699,0.1401,0.299,0.3915,0.3598,0.2403,0.4208,0.5675,0.6094,0.6323,0.6549,0.7673,1,0.8463,0.5509,0.4444,0.5169,0.4268,0.1802,0.0791,0.0535,0.1906,0.2561,0.2153,0.2769,0.2841,0.1733,0.0815,0.0335,0.0933,0.1018,0.0309,0.0208,0.0318,0.0132,0.0118,0.012,0.0051,0.007,0.0015,0.0035,0.0008,0.0044,0.0077,Rock +0.0459,0.0437,0.0347,0.0456,0.0067,0.089,0.1798,0.1741,0.1598,0.1408,0.2693,0.3259,0.4545,0.5785,0.4471,0.2231,0.2164,0.3201,0.2915,0.4235,0.446,0.238,0.6415,0.8966,0.8918,0.7529,0.6838,0.839,1,0.8362,0.5427,0.4577,0.8067,0.6973,0.3915,0.1558,0.1598,0.2161,0.5178,0.4782,0.2344,0.3599,0.2785,0.1807,0.0352,0.0473,0.0322,0.0408,0.0163,0.0088,0.0121,0.0067,0.0032,0.0109,0.0164,0.0151,0.007,0.0085,0.0117,0.0056,Rock +0.0025,0.0309,0.0171,0.0228,0.0434,0.1224,0.1947,0.1661,0.1368,0.143,0.0994,0.225,0.2444,0.3239,0.3039,0.241,0.0367,0.1672,0.3038,0.4069,0.3613,0.1994,0.4611,0.6849,0.7272,0.7152,0.7102,0.8516,1,0.769,0.4841,0.3717,0.6096,0.511,0.2586,0.0916,0.0947,0.2287,0.348,0.2095,0.1901,0.2941,0.2211,0.1524,0.0746,0.0606,0.0692,0.0446,0.0344,0.0082,0.0108,0.0149,0.0077,0.0036,0.0114,0.0085,0.0101,0.0016,0.0028,0.0014,Rock +0.0291,0.04,0.0771,0.0809,0.0521,0.1051,0.0145,0.0674,0.1294,0.1146,0.0942,0.0794,0.0252,0.1191,0.1045,0.205,0.1556,0.269,0.3784,0.4024,0.347,0.1395,0.1208,0.2827,0.15,0.2626,0.4468,0.752,0.9036,0.7812,0.4766,0.2483,0.5372,0.6279,0.3647,0.4572,0.6359,0.6474,0.552,0.3253,0.2292,0.0653,0,0,0,0,0,0,0,0,0,0.0056,0.0237,0.0204,0.005,0.0137,0.0164,0.0081,0.0139,0.0111,Rock +0.0181,0.0146,0.0026,0.0141,0.0421,0.0473,0.0361,0.0741,0.1398,0.1045,0.0904,0.0671,0.0997,0.1056,0.0346,0.1231,0.1626,0.3652,0.3262,0.2995,0.2109,0.2104,0.2085,0.2282,0.0747,0.1969,0.4086,0.6385,0.797,0.7508,0.5517,0.2214,0.4672,0.4479,0.2297,0.3235,0.448,0.5581,0.652,0.5354,0.2478,0.2268,0.1788,0.0898,0.0536,0.0374,0.099,0.0956,0.0317,0.0142,0.0076,0.0223,0.0255,0.0145,0.0233,0.0041,0.0018,0.0048,0.0089,0.0085,Rock +0.0491,0.0279,0.0592,0.127,0.1772,0.1908,0.2217,0.0768,0.1246,0.2028,0.0947,0.2497,0.2209,0.3195,0.334,0.3323,0.278,0.2975,0.2948,0.1729,0.3264,0.3834,0.3523,0.541,0.5228,0.4475,0.534,0.5323,0.3907,0.3456,0.4091,0.4639,0.558,0.5727,0.6355,0.7563,0.6903,0.6176,0.5379,0.5622,0.6508,0.4797,0.3736,0.2804,0.1982,0.2438,0.1789,0.1706,0.0762,0.0238,0.0268,0.0081,0.0129,0.0161,0.0063,0.0119,0.0194,0.014,0.0332,0.0439,Mine +0.1313,0.2339,0.3059,0.4264,0.401,0.1791,0.1853,0.0055,0.1929,0.2231,0.2907,0.2259,0.3136,0.3302,0.366,0.3956,0.4386,0.467,0.5255,0.3735,0.2243,0.1973,0.4337,0.6532,0.507,0.2796,0.4163,0.595,0.5242,0.4178,0.3714,0.2375,0.0863,0.1437,0.2896,0.4577,0.3725,0.3372,0.3803,0.4181,0.3603,0.2711,0.1653,0.1951,0.2811,0.2246,0.1921,0.15,0.0665,0.0193,0.0156,0.0362,0.021,0.0154,0.018,0.0013,0.0106,0.0127,0.0178,0.0231,Mine +0.0201,0.0423,0.0554,0.0783,0.062,0.0871,0.1201,0.2707,0.1206,0.0279,0.2251,0.2615,0.177,0.3709,0.4533,0.5553,0.4616,0.3797,0.345,0.2665,0.2395,0.1127,0.2556,0.5169,0.3779,0.4082,0.5353,0.5116,0.4544,0.4258,0.3869,0.3939,0.4661,0.3974,0.2194,0.1816,0.1023,0.2108,0.3253,0.3697,0.2912,0.301,0.2563,0.1927,0.2062,0.1751,0.0841,0.1035,0.0641,0.0153,0.0081,0.0191,0.0182,0.016,0.029,0.009,0.0242,0.0224,0.019,0.0096,Mine +0.0629,0.1065,0.1526,0.1229,0.1437,0.119,0.0884,0.0907,0.2107,0.3597,0.5466,0.5205,0.5127,0.5395,0.6558,0.8705,0.9786,0.9335,0.7917,0.7383,0.6908,0.385,0.0671,0.0502,0.2717,0.2839,0.2234,0.1911,0.0408,0.2531,0.1979,0.1891,0.2433,0.1956,0.2667,0.134,0.1073,0.2023,0.1794,0.0227,0.1313,0.1775,0.1549,0.1626,0.0708,0.0129,0.0795,0.0762,0.0117,0.0061,0.0257,0.0089,0.0262,0.0108,0.0138,0.0187,0.023,0.0057,0.0113,0.0131,Mine +0.0335,0.0134,0.0696,0.118,0.0348,0.118,0.1948,0.1607,0.3036,0.4372,0.5533,0.5771,0.7022,0.7067,0.7367,0.7391,0.8622,0.9458,0.8782,0.7913,0.576,0.3061,0.0563,0.0239,0.2554,0.4862,0.5027,0.4402,0.2847,0.1797,0.356,0.3522,0.3321,0.3112,0.3638,0.0754,0.1834,0.182,0.1815,0.1593,0.0576,0.0954,0.1086,0.0812,0.0784,0.0487,0.0439,0.0586,0.037,0.0185,0.0302,0.0244,0.0232,0.0093,0.0159,0.0193,0.0032,0.0377,0.0126,0.0156,Mine +0.0587,0.121,0.1268,0.1498,0.1436,0.0561,0.0832,0.0672,0.1372,0.2352,0.3208,0.4257,0.5201,0.4914,0.595,0.7221,0.9039,0.9111,0.8723,0.7686,0.7326,0.5222,0.3097,0.3172,0.227,0.164,0.1746,0.1835,0.2048,0.1674,0.2767,0.3104,0.3399,0.4441,0.5046,0.2814,0.1681,0.2633,0.3198,0.1933,0.0934,0.0443,0.078,0.0722,0.0405,0.0553,0.1081,0.1139,0.0767,0.0265,0.0215,0.0331,0.0111,0.0088,0.0158,0.0122,0.0038,0.0101,0.0228,0.0124,Mine +0.0162,0.0253,0.0262,0.0386,0.0645,0.0472,0.1056,0.1388,0.0598,0.1334,0.2969,0.4754,0.5677,0.569,0.6421,0.7487,0.8999,1,0.969,0.9032,0.7685,0.6998,0.6644,0.5964,0.3711,0.0921,0.0481,0.0876,0.104,0.1714,0.3264,0.4612,0.3939,0.505,0.4833,0.3511,0.2319,0.4029,0.3676,0.151,0.0745,0.1395,0.1552,0.0377,0.0636,0.0443,0.0264,0.0223,0.0187,0.0077,0.0137,0.0071,0.0082,0.0232,0.0198,0.0074,0.0035,0.01,0.0048,0.0019,Mine +0.0307,0.0523,0.0653,0.0521,0.0611,0.0577,0.0665,0.0664,0.146,0.2792,0.3877,0.4992,0.4981,0.4972,0.5607,0.7339,0.823,0.9173,0.9975,0.9911,0.824,0.6498,0.598,0.4862,0.315,0.1543,0.0989,0.0284,0.1008,0.2636,0.2694,0.293,0.2925,0.3998,0.366,0.3172,0.4609,0.4374,0.182,0.3376,0.6202,0.4448,0.1863,0.142,0.0589,0.0576,0.0672,0.0269,0.0245,0.019,0.0063,0.0321,0.0189,0.0137,0.0277,0.0152,0.0052,0.0121,0.0124,0.0055,Mine +0.0116,0.0179,0.0449,0.1096,0.1913,0.0924,0.0761,0.1092,0.0757,0.1006,0.25,0.3988,0.3809,0.4753,0.6165,0.6464,0.8024,0.9208,0.9832,0.9634,0.8646,0.8325,0.8276,0.8007,0.6102,0.4853,0.4355,0.4307,0.4399,0.3833,0.3032,0.3035,0.3197,0.2292,0.2131,0.2347,0.3201,0.4455,0.3655,0.2715,0.1747,0.1781,0.2199,0.1056,0.0573,0.0307,0.0237,0.047,0.0102,0.0057,0.0031,0.0163,0.0099,0.0084,0.027,0.0277,0.0097,0.0054,0.0148,0.0092,Mine +0.0331,0.0423,0.0474,0.0818,0.0835,0.0756,0.0374,0.0961,0.0548,0.0193,0.0897,0.1734,0.1936,0.2803,0.3313,0.502,0.636,0.7096,0.8333,0.873,0.8073,0.7507,0.7526,0.7298,0.6177,0.4946,0.4531,0.4099,0.454,0.4124,0.3139,0.3194,0.3692,0.3776,0.4469,0.4777,0.4716,0.4664,0.3893,0.4255,0.4064,0.3712,0.3863,0.2802,0.1283,0.1117,0.1303,0.0787,0.0436,0.0224,0.0133,0.0078,0.0174,0.0176,0.0038,0.0129,0.0066,0.0044,0.0134,0.0092,Mine +0.0428,0.0555,0.0708,0.0618,0.1215,0.1524,0.1543,0.0391,0.061,0.0113,0.1255,0.2473,0.3011,0.3747,0.452,0.5392,0.6588,0.7113,0.7602,0.8672,0.8416,0.7974,0.8385,0.9317,0.8555,0.6162,0.4139,0.3269,0.3108,0.2554,0.3367,0.4465,0.5,0.5111,0.5194,0.4619,0.4234,0.4372,0.4277,0.4433,0.37,0.3324,0.2564,0.2527,0.2137,0.1789,0.101,0.0528,0.0453,0.0118,0.0009,0.0142,0.0179,0.0079,0.006,0.0131,0.0089,0.0084,0.0113,0.0049,Mine +0.0599,0.0474,0.0498,0.0387,0.1026,0.0773,0.0853,0.0447,0.1094,0.0351,0.1582,0.2023,0.2268,0.2829,0.3819,0.4665,0.6687,0.8647,0.9361,0.9367,0.9144,0.9162,0.9311,0.8604,0.7327,0.5763,0.4162,0.4113,0.4146,0.3149,0.2936,0.3169,0.3149,0.4132,0.3994,0.4195,0.4532,0.4419,0.4737,0.3431,0.3194,0.337,0.2493,0.265,0.1748,0.0932,0.053,0.0081,0.0342,0.0137,0.0028,0.0013,0.0005,0.0227,0.0209,0.0081,0.0117,0.0114,0.0112,0.01,Mine +0.0264,0.0071,0.0342,0.0793,0.1043,0.0783,0.1417,0.1176,0.0453,0.0945,0.1132,0.084,0.0717,0.1968,0.2633,0.4191,0.505,0.6711,0.7922,0.8381,0.8759,0.9422,1,0.9931,0.9575,0.8647,0.7215,0.5801,0.4964,0.4886,0.4079,0.2443,0.1768,0.2472,0.3518,0.3762,0.2909,0.2311,0.3168,0.3554,0.3741,0.4443,0.3261,0.1963,0.0864,0.1688,0.1991,0.1217,0.0628,0.0323,0.0253,0.0214,0.0262,0.0177,0.0037,0.0068,0.0121,0.0077,0.0078,0.0066,Mine +0.021,0.0121,0.0203,0.1036,0.1675,0.0418,0.0723,0.0828,0.0494,0.0686,0.1125,0.1741,0.271,0.3087,0.3575,0.4998,0.6011,0.647,0.8067,0.9008,0.8906,0.9338,1,0.9102,0.8496,0.7867,0.7688,0.7718,0.6268,0.4301,0.2077,0.1198,0.166,0.2618,0.3862,0.3958,0.3248,0.2302,0.325,0.4022,0.4344,0.4008,0.337,0.2518,0.2101,0.1181,0.115,0.055,0.0293,0.0183,0.0104,0.0117,0.0101,0.0061,0.0031,0.0099,0.008,0.0107,0.0161,0.0133,Mine +0.053,0.0885,0.1997,0.2604,0.3225,0.2247,0.0617,0.2287,0.095,0.074,0.161,0.2226,0.2703,0.3365,0.4266,0.4144,0.5655,0.6921,0.8547,0.9234,0.9171,1,0.9532,0.9101,0.8337,0.7053,0.6534,0.4483,0.246,0.202,0.1446,0.0994,0.151,0.2392,0.4434,0.5023,0.4441,0.4571,0.3927,0.29,0.3408,0.499,0.3632,0.1387,0.18,0.1299,0.0523,0.0817,0.0469,0.0114,0.0299,0.0244,0.0199,0.0257,0.0082,0.0151,0.0171,0.0146,0.0134,0.0056,Mine +0.0454,0.0472,0.0697,0.1021,0.1397,0.1493,0.1487,0.0771,0.1171,0.1675,0.2799,0.3323,0.4012,0.4296,0.535,0.5411,0.687,0.8045,0.9194,0.9169,1,0.9972,0.9093,0.7918,0.6705,0.5324,0.3572,0.2484,0.3161,0.3775,0.3138,0.1713,0.2937,0.5234,0.5926,0.5437,0.4516,0.3379,0.3215,0.2178,0.1674,0.2634,0.298,0.2037,0.1155,0.0919,0.0882,0.0228,0.038,0.0142,0.0137,0.012,0.0042,0.0238,0.0129,0.0084,0.0218,0.0321,0.0154,0.0053,Mine +0.0283,0.0599,0.0656,0.0229,0.0839,0.1673,0.1154,0.1098,0.137,0.1767,0.1995,0.2869,0.3275,0.3769,0.4169,0.5036,0.618,0.8025,0.9333,0.9399,0.9275,0.945,0.8328,0.7773,0.7007,0.6154,0.581,0.4454,0.3707,0.2891,0.2185,0.1711,0.3578,0.3947,0.2867,0.2401,0.3619,0.3314,0.3763,0.4767,0.4059,0.3661,0.232,0.145,0.1017,0.1111,0.0655,0.0271,0.0244,0.0179,0.0109,0.0147,0.017,0.0158,0.0046,0.0073,0.0054,0.0033,0.0045,0.0079,Mine +0.0114,0.0222,0.0269,0.0384,0.1217,0.2062,0.1489,0.0929,0.135,0.1799,0.2486,0.2973,0.3672,0.4394,0.5258,0.6755,0.7402,0.8284,0.9033,0.9584,1,0.9982,0.8899,0.7493,0.6367,0.6744,0.7207,0.6821,0.5512,0.4789,0.3924,0.2533,0.1089,0.139,0.2551,0.3301,0.2818,0.2142,0.2266,0.2142,0.2354,0.2871,0.2596,0.1925,0.1256,0.1003,0.0951,0.121,0.0728,0.0174,0.0213,0.0269,0.0152,0.0257,0.0097,0.0041,0.005,0.0145,0.0103,0.0025,Mine +0.0414,0.0436,0.0447,0.0844,0.0419,0.1215,0.2002,0.1516,0.0818,0.1975,0.2309,0.3025,0.3938,0.505,0.5872,0.661,0.7417,0.8006,0.8456,0.7939,0.8804,0.8384,0.7852,0.8479,0.7434,0.6433,0.5514,0.3519,0.3168,0.3346,0.2056,0.1032,0.3168,0.404,0.4282,0.4538,0.3704,0.3741,0.3839,0.3494,0.438,0.4265,0.2854,0.2808,0.2395,0.0369,0.0805,0.0541,0.0177,0.0065,0.0222,0.0045,0.0136,0.0113,0.0053,0.0165,0.0141,0.0077,0.0246,0.0198,Mine +0.0094,0.0333,0.0306,0.0376,0.1296,0.1795,0.1909,0.1692,0.187,0.1725,0.2228,0.3106,0.4144,0.5157,0.5369,0.5107,0.6441,0.7326,0.8164,0.8856,0.9891,1,0.875,0.8631,0.9074,0.8674,0.775,0.66,0.5615,0.4016,0.2331,0.1164,0.1095,0.0431,0.0619,0.1956,0.212,0.3242,0.4102,0.2939,0.1911,0.1702,0.101,0.1512,0.1427,0.1097,0.1173,0.0972,0.0703,0.0281,0.0216,0.0153,0.0112,0.0241,0.0164,0.0055,0.0078,0.0055,0.0091,0.0067,Mine +0.0228,0.0106,0.013,0.0842,0.1117,0.1506,0.1776,0.0997,0.1428,0.2227,0.2621,0.3109,0.2859,0.3316,0.3755,0.4499,0.4765,0.6254,0.7304,0.8702,0.9349,0.9614,0.9126,0.9443,1,0.9455,0.8815,0.752,0.7068,0.5986,0.3857,0.251,0.2162,0.0968,0.1323,0.1344,0.225,0.3244,0.3939,0.3806,0.3258,0.3654,0.2983,0.1779,0.1535,0.1199,0.0959,0.0765,0.0649,0.0313,0.0185,0.0098,0.0178,0.0077,0.0074,0.0095,0.0055,0.0045,0.0063,0.0039,Mine +0.0363,0.0478,0.0298,0.021,0.1409,0.1916,0.1349,0.1613,0.1703,0.1444,0.1989,0.2154,0.2863,0.357,0.398,0.4359,0.5334,0.6304,0.6995,0.7435,0.8379,0.8641,0.9014,0.9432,0.9536,1,0.9547,0.9745,0.8962,0.7196,0.5462,0.3156,0.2525,0.1969,0.2189,0.1533,0.0711,0.1498,0.1755,0.2276,0.1322,0.1056,0.1973,0.1692,0.1881,0.1177,0.0779,0.0495,0.0492,0.0194,0.025,0.0115,0.019,0.0055,0.0096,0.005,0.0066,0.0114,0.0073,0.0033,Mine +0.0261,0.0266,0.0223,0.0749,0.1364,0.1513,0.1316,0.1654,0.1864,0.2013,0.289,0.365,0.351,0.3495,0.4325,0.5398,0.6237,0.6876,0.7329,0.8107,0.8396,0.8632,0.8747,0.9607,0.9716,0.9121,0.8576,0.8798,0.772,0.5711,0.4264,0.286,0.3114,0.2066,0.1165,0.0185,0.1302,0.248,0.1637,0.1103,0.2144,0.2033,0.1887,0.137,0.1376,0.0307,0.0373,0.0606,0.0399,0.0169,0.0135,0.0222,0.0175,0.0127,0.0022,0.0124,0.0054,0.0021,0.0028,0.0023,Mine +0.0346,0.0509,0.0079,0.0243,0.0432,0.0735,0.0938,0.1134,0.1228,0.1508,0.1809,0.239,0.2947,0.2866,0.401,0.5325,0.5486,0.5823,0.6041,0.6749,0.7084,0.789,0.9284,0.9781,0.9738,1,0.9702,0.9956,0.8235,0.602,0.5342,0.4867,0.3526,0.1566,0.0946,0.1613,0.2824,0.339,0.3019,0.2945,0.2978,0.2676,0.2055,0.2069,0.1625,0.1216,0.1013,0.0744,0.0386,0.005,0.0146,0.004,0.0122,0.0107,0.0112,0.0102,0.0052,0.0024,0.0079,0.0031,Mine +0.0162,0.0041,0.0239,0.0441,0.063,0.0921,0.1368,0.1078,0.1552,0.1779,0.2164,0.2568,0.3089,0.3829,0.4393,0.5335,0.5996,0.6728,0.7309,0.8092,0.8941,0.9668,1,0.9893,0.9376,0.8991,0.9184,0.9128,0.7811,0.6018,0.3765,0.33,0.228,0.0212,0.1117,0.1788,0.2373,0.2843,0.2241,0.2715,0.3363,0.2546,0.1867,0.216,0.1278,0.0768,0.107,0.0946,0.0636,0.0227,0.0128,0.0173,0.0135,0.0114,0.0062,0.0157,0.0088,0.0036,0.0053,0.003,Mine +0.0249,0.0119,0.0277,0.076,0.1218,0.1538,0.1192,0.1229,0.2119,0.2531,0.2855,0.2961,0.3341,0.4287,0.5205,0.6087,0.7236,0.7577,0.7726,0.8098,0.8995,0.9247,0.9365,0.9853,0.9776,1,0.9896,0.9076,0.7306,0.5758,0.4469,0.3719,0.2079,0.0955,0.0488,0.1406,0.2554,0.2054,0.1614,0.2232,0.1773,0.2293,0.2521,0.1464,0.0673,0.0965,0.1492,0.1128,0.0463,0.0193,0.014,0.0027,0.0068,0.015,0.0012,0.0133,0.0048,0.0244,0.0077,0.0074,Mine +0.027,0.0163,0.0341,0.0247,0.0822,0.1256,0.1323,0.1584,0.2017,0.2122,0.221,0.2399,0.2964,0.4061,0.5095,0.5512,0.6613,0.6804,0.652,0.6788,0.7811,0.8369,0.8969,0.9856,1,0.9395,0.8917,0.8105,0.6828,0.5572,0.4301,0.3339,0.2035,0.0798,0.0809,0.1525,0.2626,0.2456,0.198,0.2412,0.2409,0.1901,0.2077,0.1767,0.1119,0.0779,0.1344,0.096,0.0598,0.033,0.0197,0.0189,0.0204,0.0085,0.0043,0.0092,0.0138,0.0094,0.0105,0.0093,Mine +0.0388,0.0324,0.0688,0.0898,0.1267,0.1515,0.2134,0.2613,0.2832,0.2718,0.3645,0.3934,0.3843,0.4677,0.5364,0.4823,0.4835,0.5862,0.7579,0.6997,0.6918,0.8633,0.9107,0.9346,0.7884,0.8585,0.9261,0.708,0.5779,0.5215,0.4505,0.3129,0.1448,0.1046,0.182,0.1519,0.1017,0.1438,0.1986,0.2039,0.2778,0.2879,0.1331,0.114,0.131,0.1433,0.0624,0.01,0.0098,0.0131,0.0152,0.0255,0.0071,0.0263,0.0079,0.0111,0.0107,0.0068,0.0097,0.0067,Mine +0.0228,0.0853,0.1,0.0428,0.1117,0.1651,0.1597,0.2116,0.3295,0.3517,0.333,0.3643,0.402,0.4731,0.5196,0.6573,0.8426,0.8476,0.8344,0.8453,0.7999,0.8537,0.9642,1,0.9357,0.9409,0.907,0.7104,0.632,0.5667,0.3501,0.2447,0.1698,0.329,0.3674,0.2331,0.2413,0.2556,0.1892,0.194,0.3074,0.2785,0.0308,0.1238,0.1854,0.1753,0.1079,0.0728,0.0242,0.0191,0.0159,0.0172,0.0191,0.026,0.014,0.0125,0.0116,0.0093,0.0012,0.0036,Mine +0.0715,0.0849,0.0587,0.0218,0.0862,0.1801,0.1916,0.1896,0.296,0.4186,0.4867,0.5249,0.5959,0.6855,0.8573,0.9718,0.8693,0.8711,0.8954,0.9922,0.898,0.8158,0.8373,0.7541,0.5893,0.5488,0.5643,0.5406,0.4783,0.4439,0.3698,0.2574,0.1478,0.1743,0.1229,0.1588,0.1803,0.1436,0.1667,0.263,0.2234,0.1239,0.0869,0.2092,0.1499,0.0676,0.0899,0.0927,0.0658,0.0086,0.0216,0.0153,0.0121,0.0096,0.0196,0.0042,0.0066,0.0099,0.0083,0.0124,Mine +0.0209,0.0261,0.012,0.0768,0.1064,0.168,0.3016,0.346,0.3314,0.4125,0.3943,0.1334,0.4622,0.997,0.9137,0.8292,0.6994,0.7825,0.8789,0.8501,0.892,0.9473,1,0.8975,0.7806,0.8321,0.6502,0.4548,0.4732,0.3391,0.2747,0.0978,0.0477,0.1403,0.1834,0.2148,0.1271,0.1912,0.3391,0.3444,0.2369,0.1195,0.2665,0.2587,0.1393,0.1083,0.1383,0.1321,0.1069,0.0325,0.0316,0.0057,0.0159,0.0085,0.0372,0.0101,0.0127,0.0288,0.0129,0.0023,Mine +0.0374,0.0586,0.0628,0.0534,0.0255,0.1422,0.2072,0.2734,0.307,0.2597,0.3483,0.3999,0.4574,0.595,0.7924,0.8272,0.8087,0.8977,0.9828,0.8982,0.889,0.9367,0.9122,0.7936,0.6718,0.6318,0.4865,0.3388,0.4832,0.3822,0.3075,0.1267,0.0743,0.151,0.1906,0.1817,0.1709,0.0946,0.2829,0.3006,0.1602,0.1483,0.2875,0.2047,0.1064,0.1395,0.1065,0.0527,0.0395,0.0183,0.0353,0.0118,0.0063,0.0237,0.0032,0.0087,0.0124,0.0113,0.0098,0.0126,Mine +0.1371,0.1226,0.1385,0.1484,0.1776,0.1428,0.1773,0.2161,0.163,0.2067,0.4257,0.5484,0.7131,0.7003,0.6777,0.7939,0.9382,0.8925,0.9146,0.7832,0.796,0.7983,0.7716,0.6615,0.486,0.5572,0.4697,0.564,0.4517,0.3369,0.2684,0.2339,0.3052,0.3016,0.2753,0.1041,0.1757,0.3156,0.3603,0.2736,0.1301,0.2458,0.3404,0.1753,0.0679,0.1062,0.0643,0.0532,0.0531,0.0272,0.0171,0.0118,0.0129,0.0344,0.0065,0.0067,0.0022,0.0079,0.0146,0.0051,Mine +0.0443,0.0446,0.0235,0.1008,0.2252,0.2611,0.2061,0.1668,0.1801,0.3083,0.3794,0.5364,0.6173,0.7842,0.8392,0.9016,1,0.8911,0.8753,0.7886,0.7156,0.7581,0.6372,0.321,0.2076,0.2279,0.3309,0.2847,0.1949,0.1671,0.1025,0.1362,0.2212,0.1124,0.1677,0.1039,0.2562,0.2624,0.2236,0.118,0.1103,0.2831,0.2385,0.0255,0.1967,0.1483,0.0434,0.0627,0.0513,0.0473,0.0248,0.0274,0.0205,0.0141,0.0185,0.0055,0.0045,0.0115,0.0152,0.01,Mine +0.115,0.1163,0.0866,0.0358,0.0232,0.1267,0.2417,0.2661,0.4346,0.5378,0.3816,0.0991,0.0616,0.1795,0.3907,0.3602,0.3041,0.2428,0.406,0.8395,0.9777,0.468,0.061,0.2143,0.1348,0.2854,0.1617,0.2649,0.4565,0.6502,0.2848,0.3296,0.537,0.6627,0.8626,0.8547,0.7848,0.9016,0.8827,0.6086,0.281,0.0906,0.1177,0.2694,0.5214,0.4232,0.234,0.1928,0.1092,0.0507,0.0228,0.0099,0.0065,0.0085,0.0166,0.011,0.019,0.0141,0.0068,0.0086,Mine +0.0968,0.0821,0.0629,0.0608,0.0617,0.1207,0.0944,0.4223,0.5744,0.5025,0.3488,0.17,0.2076,0.3087,0.4224,0.5312,0.2436,0.1884,0.1908,0.8321,1,0.4076,0.096,0.1928,0.2419,0.379,0.2893,0.3451,0.3777,0.5213,0.2316,0.3335,0.4781,0.6116,0.6705,0.7375,0.7356,0.7792,0.6788,0.5259,0.2762,0.1545,0.2019,0.2231,0.4221,0.3067,0.1329,0.1349,0.1057,0.0499,0.0206,0.0073,0.0081,0.0303,0.019,0.0212,0.0126,0.0201,0.021,0.0041,Mine +0.079,0.0707,0.0352,0.166,0.133,0.0226,0.0771,0.2678,0.5664,0.6609,0.5002,0.2583,0.165,0.4347,0.4515,0.4579,0.3366,0.4,0.5325,0.901,0.9939,0.3689,0.1012,0.0248,0.2318,0.3981,0.2259,0.5247,0.6898,0.8316,0.4326,0.3741,0.5756,0.8043,0.7963,0.7174,0.7056,0.8148,0.7601,0.6034,0.4554,0.4729,0.4478,0.3722,0.4693,0.3839,0.0768,0.1467,0.0777,0.0469,0.0193,0.0298,0.039,0.0294,0.0175,0.0249,0.0141,0.0073,0.0025,0.0101,Mine +0.1083,0.107,0.0257,0.0837,0.0748,0.1125,0.3322,0.459,0.5526,0.5966,0.5304,0.2251,0.2402,0.2689,0.6646,0.6632,0.1674,0.0837,0.4331,0.8718,0.7992,0.3712,0.1703,0.1611,0.2086,0.2847,0.2211,0.6134,0.5807,0.6925,0.3825,0.4303,0.7791,0.8703,1,0.9212,0.9386,0.9303,0.7314,0.4791,0.2087,0.2016,0.1669,0.2872,0.4374,0.3097,0.1578,0.0553,0.0334,0.0209,0.0172,0.018,0.011,0.0234,0.0276,0.0032,0.0084,0.0122,0.0082,0.0143,Mine +0.0094,0.0611,0.1136,0.1203,0.0403,0.1227,0.2495,0.4566,0.6587,0.5079,0.335,0.0834,0.3004,0.3957,0.3769,0.3828,0.1247,0.1363,0.2678,0.9188,0.9779,0.3236,0.1944,0.1874,0.0885,0.3443,0.2953,0.5908,0.4564,0.7334,0.1969,0.279,0.6212,0.8681,0.8621,0.938,0.8327,0.948,0.6721,0.4436,0.5163,0.3809,0.1557,0.1449,0.2662,0.1806,0.1699,0.2559,0.1129,0.0201,0.048,0.0234,0.0175,0.0352,0.0158,0.0326,0.0201,0.0168,0.0245,0.0154,Mine +0.1088,0.1278,0.0926,0.1234,0.1276,0.1731,0.1948,0.4262,0.6828,0.5761,0.4733,0.2362,0.1023,0.2904,0.4713,0.4659,0.1415,0.0849,0.3257,0.9007,0.9312,0.4856,0.1346,0.1604,0.2737,0.5609,0.3654,0.6139,0.547,0.8474,0.5638,0.5443,0.5086,0.6253,0.8497,0.8406,0.842,0.9136,0.7713,0.4882,0.3724,0.4469,0.4586,0.4491,0.5616,0.4305,0.0945,0.0794,0.0274,0.0154,0.014,0.0455,0.0213,0.0082,0.0124,0.0167,0.0103,0.0205,0.0178,0.0187,Mine +0.043,0.0902,0.0833,0.0813,0.0165,0.0277,0.0569,0.2057,0.3887,0.7106,0.7342,0.5033,0.3,0.1951,0.2767,0.3737,0.2507,0.2507,0.3292,0.4871,0.6527,0.8454,0.9739,1,0.6665,0.5323,0.4024,0.3444,0.4239,0.4182,0.4393,0.1162,0.4336,0.6553,0.6172,0.4373,0.4118,0.3641,0.4572,0.4367,0.2964,0.4312,0.4155,0.1824,0.1487,0.0138,0.1164,0.2052,0.1069,0.0199,0.0208,0.0176,0.0197,0.021,0.0141,0.0049,0.0027,0.0162,0.0059,0.0021,Mine +0.0731,0.1249,0.1665,0.1496,0.1443,0.277,0.2555,0.1712,0.0466,0.1114,0.1739,0.316,0.3249,0.2164,0.2031,0.258,0.1796,0.2422,0.3609,0.181,0.2604,0.6572,0.9734,0.9757,0.8079,0.6521,0.4915,0.5363,0.7649,0.525,0.5101,0.4219,0.416,0.1906,0.0223,0.4219,0.5496,0.2483,0.2034,0.2729,0.2837,0.4463,0.3178,0.0807,0.1192,0.2134,0.3241,0.2945,0.1474,0.0211,0.0361,0.0444,0.023,0.029,0.0141,0.0161,0.0177,0.0194,0.0207,0.0057,Mine +0.0164,0.0627,0.0738,0.0608,0.0233,0.1048,0.1338,0.0644,0.1522,0.078,0.1791,0.2681,0.1788,0.1039,0.198,0.3234,0.3748,0.2586,0.368,0.3508,0.5606,0.5231,0.5469,0.6954,0.6352,0.6757,0.8499,0.8025,0.6563,0.8591,0.6655,0.5369,0.3118,0.3763,0.2801,0.0875,0.3319,0.4237,0.1801,0.3743,0.4627,0.1614,0.2494,0.3202,0.2265,0.1146,0.0476,0.0943,0.0824,0.0171,0.0244,0.0258,0.0143,0.0226,0.0187,0.0185,0.011,0.0094,0.0078,0.0112,Mine +0.0412,0.1135,0.0518,0.0232,0.0646,0.1124,0.1787,0.2407,0.2682,0.2058,0.1546,0.2671,0.3141,0.2904,0.3531,0.5079,0.4639,0.1859,0.4474,0.4079,0.54,0.4786,0.4332,0.6113,0.5091,0.4606,0.7243,0.8987,0.8826,0.9201,0.8005,0.6033,0.212,0.2866,0.4033,0.2803,0.3087,0.355,0.2545,0.1432,0.5869,0.6431,0.5826,0.4286,0.4894,0.5777,0.4315,0.264,0.1794,0.0772,0.0798,0.0376,0.0143,0.0272,0.0127,0.0166,0.0095,0.0225,0.0098,0.0085,Mine +0.0707,0.1252,0.1447,0.1644,0.1693,0.0844,0.0715,0.0947,0.1583,0.1247,0.234,0.1764,0.2284,0.3115,0.4725,0.5543,0.5386,0.3746,0.4583,0.5961,0.7464,0.7644,0.5711,0.6257,0.6695,0.7131,0.7567,0.8077,0.8477,0.9289,0.9513,0.7995,0.4362,0.4048,0.4952,0.1712,0.3652,0.3763,0.2841,0.0427,0.5331,0.6952,0.4288,0.3063,0.5835,0.5692,0.263,0.1196,0.0983,0.0374,0.0291,0.0156,0.0197,0.0135,0.0127,0.0138,0.0133,0.0131,0.0154,0.0218,Mine +0.0526,0.0563,0.1219,0.1206,0.0246,0.1022,0.0539,0.0439,0.2291,0.1632,0.2544,0.2807,0.3011,0.3361,0.3024,0.2285,0.291,0.1316,0.1151,0.3404,0.5562,0.6379,0.6553,0.7384,0.6534,0.5423,0.6877,0.7325,0.7726,0.8229,0.8787,0.9108,0.6705,0.6092,0.7505,0.4775,0.1666,0.3749,0.3776,0.2106,0.5886,0.5628,0.2577,0.5245,0.6149,0.5123,0.3385,0.1499,0.0546,0.027,0.038,0.0339,0.0149,0.0335,0.0376,0.0174,0.0132,0.0103,0.0364,0.0208,Mine +0.0516,0.0944,0.0622,0.0415,0.0995,0.2431,0.1777,0.2018,0.2611,0.1294,0.2646,0.2778,0.4432,0.3672,0.2035,0.2764,0.3252,0.1536,0.2784,0.3508,0.5187,0.7052,0.7143,0.6814,0.51,0.5308,0.6131,0.8388,0.9031,0.8607,0.9656,0.9168,0.7132,0.6898,0.731,0.4134,0.158,0.1819,0.1381,0.296,0.6935,0.8246,0.5351,0.4403,0.6448,0.6214,0.3016,0.1379,0.0364,0.0355,0.0456,0.0432,0.0274,0.0152,0.012,0.0129,0.002,0.0109,0.0074,0.0078,Mine +0.0299,0.0688,0.0992,0.1021,0.08,0.0629,0.013,0.0813,0.1761,0.0998,0.0523,0.0904,0.2655,0.3099,0.352,0.3892,0.3962,0.2449,0.2355,0.3045,0.3112,0.4698,0.5534,0.4532,0.4464,0.467,0.4621,0.6988,0.7626,0.7025,0.7382,0.7446,0.7927,0.5227,0.3967,0.3042,0.1309,0.2408,0.178,0.1598,0.5657,0.6443,0.4241,0.4567,0.576,0.5293,0.3287,0.1283,0.0698,0.0334,0.0342,0.0459,0.0277,0.0172,0.0087,0.0046,0.0203,0.013,0.0115,0.0015,Mine +0.0721,0.1574,0.1112,0.1085,0.0666,0.18,0.1108,0.2794,0.1408,0.0795,0.2534,0.392,0.3375,0.161,0.1889,0.3308,0.2282,0.2177,0.1853,0.5167,0.5342,0.6298,0.8437,0.6756,0.5825,0.6141,0.8809,0.8375,0.3869,0.5051,0.5455,0.4241,0.1534,0.495,0.6983,0.7109,0.5647,0.487,0.5515,0.4433,0.525,0.6075,0.5251,0.1359,0.4268,0.4442,0.2193,0.09,0.12,0.0628,0.0234,0.0309,0.0127,0.0082,0.0281,0.0117,0.0092,0.0147,0.0157,0.0129,Mine +0.1021,0.083,0.0577,0.0627,0.0635,0.1328,0.0988,0.1787,0.1199,0.1369,0.2509,0.2631,0.2796,0.2977,0.3823,0.3129,0.3956,0.2093,0.3218,0.3345,0.3184,0.2887,0.361,0.2566,0.4106,0.4591,0.4722,0.7278,0.7591,0.6579,0.7514,0.6666,0.4903,0.5962,0.6552,0.4014,0.1188,0.3245,0.3107,0.1354,0.5109,0.7988,0.7517,0.5508,0.5858,0.7292,0.5522,0.3339,0.1608,0.0475,0.1004,0.0709,0.0317,0.0309,0.0252,0.0087,0.0177,0.0214,0.0227,0.0106,Mine +0.0654,0.0649,0.0737,0.1132,0.2482,0.1257,0.1797,0.0989,0.246,0.3422,0.2128,0.1377,0.4032,0.5684,0.2398,0.4331,0.5954,0.5772,0.8176,0.8835,0.5248,0.6373,0.8375,0.6699,0.7756,0.875,0.83,0.6896,0.3372,0.6405,0.7138,0.8202,0.6657,0.5254,0.296,0.0704,0.097,0.3941,0.6028,0.3521,0.3924,0.4808,0.4602,0.4164,0.5438,0.5649,0.3195,0.2484,0.1299,0.0825,0.0243,0.021,0.0361,0.0239,0.0447,0.0394,0.0355,0.044,0.0243,0.0098,Mine +0.0712,0.0901,0.1276,0.1497,0.1284,0.1165,0.1285,0.1684,0.183,0.2127,0.2891,0.3985,0.4576,0.5821,0.5027,0.193,0.2579,0.3177,0.2745,0.6186,0.8958,0.7442,0.5188,0.2811,0.1773,0.6607,0.7576,0.5122,0.4701,0.5479,0.4347,0.1276,0.0846,0.0927,0.0313,0.0998,0.1781,0.1586,0.3001,0.2208,0.1455,0.2895,0.3203,0.1414,0.0629,0.0734,0.0805,0.0608,0.0565,0.0286,0.0154,0.0154,0.0156,0.0054,0.003,0.0048,0.0087,0.0101,0.0095,0.0068,Mine +0.0207,0.0535,0.0334,0.0818,0.074,0.0324,0.0918,0.107,0.1553,0.1234,0.1796,0.1787,0.1247,0.2577,0.337,0.399,0.1647,0.2266,0.3219,0.5356,0.8159,1,0.8701,0.6889,0.6299,0.5738,0.5707,0.5976,0.4301,0.2058,0.1,0.2247,0.2308,0.3977,0.3317,0.1726,0.1429,0.2168,0.1967,0.214,0.3674,0.2023,0.0778,0.0925,0.2388,0.34,0.2594,0.1102,0.0911,0.0462,0.0171,0.0033,0.005,0.019,0.0103,0.0121,0.0042,0.009,0.007,0.0099,Mine +0.0209,0.0278,0.0115,0.0445,0.0427,0.0766,0.1458,0.143,0.1894,0.1853,0.1748,0.1556,0.1476,0.1378,0.2584,0.3827,0.4784,0.536,0.6192,0.7912,0.9264,1,0.908,0.7435,0.5557,0.3172,0.1295,0.0598,0.2722,0.3616,0.3293,0.4855,0.3936,0.1845,0.0342,0.2489,0.3837,0.3514,0.2654,0.176,0.1599,0.0866,0.059,0.0813,0.0492,0.0417,0.0495,0.0367,0.0115,0.0118,0.0133,0.0096,0.0014,0.0049,0.0039,0.0029,0.0078,0.0047,0.0021,0.0011,Mine +0.0231,0.0315,0.017,0.0226,0.041,0.0116,0.0223,0.0805,0.2365,0.2461,0.2245,0.152,0.1732,0.3099,0.438,0.5595,0.682,0.6164,0.6803,0.8435,0.9921,1,0.7983,0.5426,0.3952,0.5179,0.565,0.3042,0.1881,0.396,0.2286,0.3544,0.4187,0.2398,0.1847,0.376,0.4331,0.3626,0.2519,0.187,0.1046,0.2339,0.1991,0.11,0.0684,0.0303,0.0674,0.0785,0.0455,0.0246,0.0151,0.0125,0.0036,0.0123,0.0043,0.0114,0.0052,0.0091,0.0008,0.0092,Mine +0.0131,0.0201,0.0045,0.0217,0.023,0.0481,0.0742,0.0333,0.1369,0.2079,0.2295,0.199,0.1184,0.1891,0.2949,0.5343,0.685,0.7923,0.822,0.729,0.7352,0.7918,0.8057,0.4898,0.1934,0.2924,0.6255,0.8546,0.8966,0.7821,0.5168,0.484,0.4038,0.3411,0.2849,0.2353,0.2699,0.4442,0.4323,0.3314,0.1195,0.1669,0.3702,0.3072,0.0945,0.1545,0.1394,0.0772,0.0615,0.023,0.0111,0.0168,0.0086,0.0045,0.0062,0.0065,0.003,0.0066,0.0029,0.0053,Mine +0.0233,0.0394,0.0416,0.0547,0.0993,0.1515,0.1674,0.1513,0.1723,0.2078,0.1239,0.0236,0.1771,0.3115,0.499,0.6707,0.7655,0.8485,0.9805,1,1,0.9992,0.9067,0.6803,0.5103,0.4716,0.498,0.6196,0.7171,0.6316,0.3554,0.2897,0.4316,0.3791,0.2421,0.0944,0.0351,0.0844,0.0436,0.113,0.2045,0.1937,0.0834,0.1502,0.1675,0.1058,0.1111,0.0849,0.0596,0.0201,0.0071,0.0104,0.0062,0.0026,0.0025,0.0061,0.0038,0.0101,0.0078,0.0006,Mine +0.0117,0.0069,0.0279,0.0583,0.0915,0.1267,0.1577,0.1927,0.2361,0.2169,0.118,0.0754,0.2782,0.3758,0.5093,0.6592,0.7071,0.7532,0.8357,0.8593,0.9615,0.9838,0.8705,0.6403,0.5067,0.5395,0.6934,0.8487,0.8213,0.5962,0.295,0.2758,0.2885,0.1893,0.1446,0.0955,0.0888,0.0836,0.0894,0.1547,0.2318,0.2225,0.1035,0.1721,0.2017,0.1787,0.1112,0.0398,0.0305,0.0084,0.0039,0.0053,0.0029,0.002,0.0013,0.0029,0.002,0.0062,0.0026,0.0052,Mine +0.0211,0.0128,0.0015,0.045,0.0711,0.1563,0.1518,0.1206,0.1666,0.1345,0.0785,0.0367,0.1227,0.2614,0.428,0.6122,0.7435,0.813,0.9006,0.9603,0.9162,0.914,0.7851,0.5134,0.3439,0.329,0.2571,0.3685,0.5765,0.619,0.4613,0.3615,0.4434,0.3864,0.3093,0.2138,0.1112,0.1386,0.1523,0.0996,0.1644,0.1902,0.1313,0.1776,0.2,0.0765,0.0727,0.0749,0.0449,0.0134,0.0174,0.0117,0.0023,0.0047,0.0049,0.0031,0.0024,0.0039,0.0051,0.0015,Mine +0.0047,0.0059,0.008,0.0554,0.0883,0.1278,0.1674,0.1373,0.2922,0.3469,0.3265,0.3263,0.2301,0.1253,0.2102,0.2401,0.1928,0.1673,0.1228,0.0902,0.1557,0.3291,0.5268,0.674,0.7906,0.8938,0.9395,0.9493,0.904,0.9151,0.8828,0.8086,0.718,0.672,0.6447,0.6879,0.6241,0.4936,0.4144,0.424,0.4546,0.4392,0.4323,0.4921,0.471,0.3196,0.2241,0.1806,0.099,0.0251,0.0129,0.0095,0.0126,0.0069,0.0039,0.0068,0.006,0.0045,0.0002,0.0029,Mine +0.0201,0.0178,0.0274,0.0232,0.0724,0.0833,0.1232,0.1298,0.2085,0.272,0.2188,0.3037,0.2959,0.2059,0.0906,0.161,0.18,0.218,0.2026,0.1506,0.0521,0.2143,0.4333,0.5943,0.6926,0.7576,0.8787,0.906,0.8528,0.9087,0.9657,0.9306,0.7774,0.6643,0.6604,0.6884,0.6938,0.5932,0.5774,0.6223,0.5841,0.4527,0.4911,0.5762,0.5013,0.4042,0.3123,0.2232,0.1085,0.0414,0.0253,0.0131,0.0049,0.0104,0.0102,0.0092,0.0083,0.002,0.0048,0.0036,Mine +0.0107,0.0453,0.0289,0.0713,0.1075,0.1019,0.1606,0.2119,0.3061,0.2936,0.3104,0.3431,0.2456,0.1887,0.1184,0.208,0.2736,0.3274,0.2344,0.126,0.0576,0.1241,0.3239,0.4357,0.5734,0.7825,0.9252,0.9349,0.9348,1,0.9308,0.8478,0.7605,0.704,0.7539,0.799,0.7673,0.5955,0.4731,0.484,0.434,0.3954,0.4837,0.5379,0.4485,0.2674,0.1541,0.1359,0.0941,0.0261,0.0079,0.0164,0.012,0.0113,0.0021,0.0097,0.0072,0.006,0.0017,0.0036,Mine +0.0235,0.022,0.0167,0.0516,0.0746,0.1121,0.1258,0.1717,0.3074,0.3199,0.2946,0.2484,0.251,0.1806,0.1413,0.3019,0.3635,0.3887,0.298,0.2219,0.1624,0.1343,0.2046,0.3791,0.5771,0.7545,0.8406,0.8547,0.9036,1,0.9646,0.7912,0.6412,0.5986,0.6835,0.7771,0.8084,0.7426,0.6295,0.5708,0.4433,0.3361,0.3795,0.495,0.4373,0.2404,0.1128,0.1654,0.0933,0.0225,0.0214,0.0221,0.0152,0.0083,0.0058,0.0023,0.0057,0.0052,0.0027,0.0021,Mine +0.0258,0.0433,0.0547,0.0681,0.0784,0.125,0.1296,0.1729,0.2794,0.2954,0.2506,0.2601,0.2249,0.2115,0.127,0.1193,0.1794,0.2185,0.1646,0.074,0.0625,0.2381,0.4824,0.6372,0.7531,0.8959,0.9941,0.9957,0.9328,0.9344,0.8854,0.769,0.6865,0.639,0.6378,0.6629,0.5983,0.4565,0.3129,0.4158,0.4325,0.4031,0.4201,0.4557,0.3955,0.2966,0.2095,0.1558,0.0884,0.0265,0.0121,0.0091,0.0062,0.0019,0.0045,0.0079,0.0031,0.0063,0.0048,0.005,Mine +0.0305,0.0363,0.0214,0.0227,0.0456,0.0665,0.0939,0.0972,0.2535,0.3127,0.2192,0.2621,0.2419,0.2179,0.1159,0.1237,0.0886,0.1755,0.1758,0.154,0.0512,0.1805,0.4039,0.5697,0.6577,0.7474,0.8543,0.9085,0.8668,0.8892,0.9065,0.8522,0.7204,0.62,0.6253,0.6848,0.7337,0.6281,0.5725,0.6119,0.5597,0.4965,0.5027,0.5772,0.5907,0.4803,0.3877,0.2779,0.1427,0.0424,0.0271,0.02,0.007,0.007,0.0086,0.0089,0.0074,0.0042,0.0055,0.0021,Mine +0.0217,0.0152,0.0346,0.0346,0.0484,0.0526,0.0773,0.0862,0.1451,0.211,0.2343,0.2087,0.1645,0.1689,0.165,0.1967,0.2934,0.3709,0.4309,0.4161,0.5116,0.6501,0.7717,0.8491,0.9104,0.8912,0.8189,0.6779,0.5368,0.5207,0.5651,0.5749,0.525,0.4255,0.333,0.2331,0.1451,0.1648,0.2694,0.373,0.4467,0.4133,0.3743,0.3021,0.2069,0.179,0.1689,0.1341,0.0769,0.0222,0.0205,0.0123,0.0067,0.0011,0.0026,0.0049,0.0029,0.0022,0.0022,0.0032,Mine +0.0072,0.0027,0.0089,0.0061,0.042,0.0865,0.1182,0.0999,0.1976,0.2318,0.2472,0.288,0.2126,0.0708,0.1194,0.2808,0.4221,0.5279,0.5857,0.6153,0.6753,0.7873,0.8974,0.9828,1,0.846,0.6055,0.3036,0.0144,0.2526,0.4335,0.4918,0.5409,0.5961,0.5248,0.3777,0.2369,0.172,0.1878,0.325,0.2575,0.2423,0.2706,0.2323,0.1724,0.1457,0.1175,0.0868,0.0392,0.0131,0.0092,0.0078,0.0071,0.0081,0.0034,0.0064,0.0037,0.0036,0.0012,0.0037,Mine +0.0163,0.0198,0.0202,0.0386,0.0752,0.1444,0.1487,0.1484,0.2442,0.2822,0.3691,0.375,0.3927,0.3308,0.1085,0.1139,0.3446,0.5441,0.647,0.7276,0.7894,0.8264,0.8697,0.7836,0.714,0.5698,0.2908,0.4636,0.6409,0.7405,0.8069,0.842,1,0.9536,0.6755,0.3905,0.1249,0.3629,0.6356,0.8116,0.7664,0.5417,0.2614,0.1723,0.2814,0.2764,0.1985,0.1502,0.1219,0.0493,0.0027,0.0077,0.0026,0.0031,0.0083,0.002,0.0084,0.0108,0.0083,0.0033,Mine +0.0221,0.0065,0.0164,0.0487,0.0519,0.0849,0.0812,0.1833,0.2228,0.181,0.2549,0.2984,0.2624,0.1893,0.0668,0.2666,0.4274,0.6291,0.7782,0.7686,0.8099,0.8493,0.944,0.945,0.9655,0.8045,0.4969,0.396,0.3856,0.5574,0.7309,0.8549,0.9425,0.8726,0.6673,0.4694,0.1546,0.1748,0.3607,0.5208,0.5177,0.3702,0.224,0.0816,0.0395,0.0785,0.1052,0.1034,0.0764,0.0216,0.0167,0.0089,0.0051,0.0015,0.0075,0.0058,0.0016,0.007,0.0074,0.0038,Mine +0.0411,0.0277,0.0604,0.0525,0.0489,0.0385,0.0611,0.1117,0.1237,0.23,0.137,0.1335,0.2137,0.1526,0.0775,0.1196,0.0903,0.0689,0.2071,0.2975,0.2836,0.3353,0.3622,0.3202,0.3452,0.3562,0.3892,0.6622,0.9254,1,0.8528,0.6297,0.525,0.4012,0.2901,0.2007,0.3356,0.4799,0.6147,0.6246,0.4973,0.3492,0.2662,0.3137,0.4282,0.4262,0.3511,0.2458,0.1259,0.0327,0.0181,0.0217,0.0038,0.0019,0.0065,0.0132,0.0108,0.005,0.0085,0.0044,Mine +0.0137,0.0297,0.0116,0.0082,0.0241,0.0253,0.0279,0.013,0.0489,0.0874,0.11,0.1084,0.1094,0.1023,0.0601,0.0906,0.1313,0.2758,0.366,0.5269,0.581,0.6181,0.5875,0.4639,0.5424,0.7367,0.9089,1,0.8247,0.5441,0.3349,0.0877,0.16,0.4169,0.6576,0.739,0.7963,0.7493,0.6795,0.4713,0.2355,0.1704,0.2728,0.4016,0.4125,0.347,0.2739,0.179,0.0922,0.0276,0.0169,0.0081,0.004,0.0025,0.0036,0.0058,0.0067,0.0035,0.0043,0.0033,Mine +0.0015,0.0186,0.0289,0.0195,0.0515,0.0817,0.1005,0.0124,0.1168,0.1476,0.2118,0.2575,0.2354,0.1334,0.0092,0.1951,0.3685,0.4646,0.5418,0.626,0.742,0.8257,0.8609,0.84,0.8949,0.9945,1,0.9649,0.8747,0.6257,0.2184,0.2945,0.3645,0.5012,0.7843,0.9361,0.8195,0.6207,0.4513,0.3004,0.2674,0.2241,0.3141,0.3693,0.2986,0.2226,0.0849,0.0359,0.0289,0.0122,0.0045,0.0108,0.0075,0.0089,0.0036,0.0029,0.0013,0.001,0.0032,0.0047,Mine +0.013,0.012,0.0436,0.0624,0.0428,0.0349,0.0384,0.0446,0.1318,0.1375,0.2026,0.2389,0.2112,0.1444,0.0742,0.1533,0.3052,0.4116,0.5466,0.5933,0.6663,0.7333,0.7136,0.7014,0.7758,0.9137,0.9964,1,0.8881,0.6585,0.2707,0.1746,0.2709,0.4853,0.7184,0.8209,0.7536,0.6496,0.4708,0.3482,0.3508,0.3181,0.3524,0.3659,0.2846,0.1714,0.0694,0.0303,0.0292,0.0116,0.0024,0.0084,0.01,0.0018,0.0035,0.0058,0.0011,0.0009,0.0033,0.0026,Mine +0.0134,0.0172,0.0178,0.0363,0.0444,0.0744,0.08,0.0456,0.0368,0.125,0.2405,0.2325,0.2523,0.1472,0.0669,0.11,0.2353,0.3282,0.4416,0.5167,0.6508,0.7793,0.7978,0.7786,0.8587,0.9321,0.9454,0.8645,0.722,0.485,0.1357,0.2951,0.4715,0.6036,0.8083,0.987,0.88,0.6411,0.4276,0.2702,0.2642,0.3342,0.4335,0.4542,0.396,0.2525,0.1084,0.0372,0.0286,0.0099,0.0046,0.0094,0.0048,0.0047,0.0016,0.0008,0.0042,0.0024,0.0027,0.0041,Mine +0.0179,0.0136,0.0408,0.0633,0.0596,0.0808,0.209,0.3465,0.5276,0.5965,0.6254,0.4507,0.3693,0.2864,0.1635,0.0422,0.1785,0.4394,0.695,0.8097,0.855,0.8717,0.8601,0.9201,0.8729,0.8084,0.8694,0.8411,0.5793,0.3754,0.3485,0.4639,0.6495,0.6901,0.5666,0.5188,0.506,0.3885,0.3762,0.3738,0.2605,0.1591,0.1875,0.2267,0.1577,0.1211,0.0883,0.085,0.0355,0.0219,0.0086,0.0123,0.006,0.0187,0.0111,0.0126,0.0081,0.0155,0.016,0.0085,Mine +0.018,0.0444,0.0476,0.0698,0.1615,0.0887,0.0596,0.1071,0.3175,0.2918,0.3273,0.3035,0.3033,0.2587,0.1682,0.1308,0.2803,0.4519,0.6641,0.7683,0.696,0.4393,0.2432,0.2886,0.4974,0.8172,1,0.9238,0.8519,0.7722,0.5772,0.519,0.6824,0.622,0.5054,0.3578,0.3809,0.3813,0.3359,0.2771,0.3648,0.3834,0.3453,0.2096,0.1031,0.0798,0.0701,0.0526,0.0241,0.0117,0.0122,0.0122,0.0114,0.0098,0.0027,0.0025,0.0026,0.005,0.0073,0.0022,Mine +0.0329,0.0216,0.0386,0.0627,0.1158,0.1482,0.2054,0.1605,0.2532,0.2672,0.3056,0.3161,0.2314,0.2067,0.1804,0.2808,0.4423,0.5947,0.6601,0.5844,0.4539,0.4789,0.5646,0.5281,0.7115,1,0.9564,0.609,0.5112,0.4,0.0482,0.1852,0.2186,0.1436,0.1757,0.1428,0.1644,0.3089,0.3648,0.4441,0.3859,0.2813,0.1238,0.0953,0.1201,0.0825,0.0618,0.0141,0.0108,0.0124,0.0104,0.0095,0.0151,0.0059,0.0015,0.0053,0.0016,0.0042,0.0053,0.0074,Mine +0.0191,0.0173,0.0291,0.0301,0.0463,0.069,0.0576,0.1103,0.2423,0.3134,0.4786,0.5239,0.4393,0.344,0.2869,0.3889,0.442,0.3892,0.4088,0.5006,0.7271,0.9385,1,0.9831,0.9932,0.9161,0.8237,0.6957,0.4536,0.3281,0.2522,0.3964,0.4154,0.3308,0.1445,0.1923,0.3208,0.3367,0.5683,0.5505,0.3231,0.0448,0.3131,0.3387,0.413,0.3639,0.2069,0.0859,0.06,0.0267,0.0125,0.004,0.0136,0.0137,0.0172,0.0132,0.011,0.0122,0.0114,0.0068,Mine +0.0294,0.0123,0.0117,0.0113,0.0497,0.0998,0.1326,0.1117,0.2984,0.3473,0.4231,0.5044,0.5237,0.4398,0.3236,0.2956,0.3286,0.3231,0.4528,0.6339,0.7044,0.8314,0.8449,0.8512,0.9138,0.9985,1,0.7544,0.4661,0.3924,0.3849,0.4674,0.4245,0.3095,0.0752,0.2885,0.4072,0.317,0.2863,0.2634,0.0541,0.1874,0.3459,0.4646,0.4366,0.2581,0.1319,0.0505,0.0112,0.0059,0.0041,0.0056,0.0104,0.0079,0.0014,0.0054,0.0015,0.0006,0.0081,0.0043,Mine +0.0635,0.0709,0.0453,0.0333,0.0185,0.126,0.1015,0.1918,0.3362,0.39,0.4674,0.5632,0.5506,0.4343,0.3052,0.3492,0.3975,0.3875,0.528,0.7198,0.7702,0.8562,0.8688,0.9236,1,0.9662,0.9822,0.736,0.4158,0.2918,0.328,0.369,0.345,0.2863,0.0864,0.3724,0.4649,0.3488,0.1817,0.1142,0.122,0.2621,0.4461,0.4726,0.3263,0.1423,0.039,0.0406,0.0311,0.0086,0.0154,0.0048,0.0025,0.0087,0.0072,0.0095,0.0086,0.0085,0.004,0.0051,Mine +0.0201,0.0165,0.0344,0.033,0.0397,0.0443,0.0684,0.0903,0.1739,0.2571,0.2931,0.3108,0.3603,0.3002,0.2718,0.2007,0.1801,0.2234,0.3568,0.5492,0.7209,0.8318,0.8864,0.952,0.9637,1,0.9673,0.8664,0.7896,0.6345,0.5351,0.4056,0.2563,0.2894,0.3588,0.4296,0.4773,0.4516,0.3765,0.3051,0.1921,0.1184,0.1984,0.157,0.066,0.1294,0.0797,0.0052,0.0233,0.0152,0.0125,0.0054,0.0057,0.0137,0.0109,0.0035,0.0056,0.0105,0.0082,0.0036,Mine +0.0197,0.0394,0.0384,0.0076,0.0251,0.0629,0.0747,0.0578,0.1357,0.1695,0.1734,0.247,0.3141,0.3297,0.2759,0.2056,0.1162,0.1884,0.339,0.3926,0.4282,0.5418,0.6448,0.7223,0.7853,0.7984,0.8847,0.9582,0.899,0.6831,0.6108,0.548,0.5058,0.4476,0.2401,0.1405,0.1772,0.1742,0.3326,0.4021,0.3009,0.2075,0.1206,0.0255,0.0298,0.0691,0.0781,0.0777,0.0369,0.0057,0.0091,0.0134,0.0097,0.0042,0.0058,0.0072,0.0041,0.0045,0.0047,0.0054,Mine +0.0394,0.042,0.0446,0.0551,0.0597,0.1416,0.0956,0.0802,0.1618,0.2558,0.3078,0.3404,0.34,0.3951,0.3352,0.2252,0.2086,0.2248,0.3382,0.4578,0.6474,0.6708,0.7007,0.7619,0.7745,0.6767,0.7373,0.7834,0.9619,1,0.8086,0.5558,0.5409,0.4988,0.3108,0.2897,0.2244,0.096,0.2287,0.3228,0.3454,0.3882,0.324,0.0926,0.1173,0.0566,0.0766,0.0969,0.0588,0.005,0.0118,0.0146,0.004,0.0114,0.0032,0.0062,0.0101,0.0068,0.0053,0.0087,Mine +0.031,0.0221,0.0433,0.0191,0.0964,0.1827,0.1106,0.1702,0.2804,0.4432,0.5222,0.5611,0.5379,0.4048,0.2245,0.1784,0.2297,0.272,0.5209,0.6898,0.8202,0.878,0.76,0.7616,0.7152,0.7288,0.8686,0.9509,0.8348,0.573,0.4363,0.4289,0.424,0.3156,0.1287,0.1477,0.2062,0.24,0.5173,0.5168,0.1491,0.2407,0.3415,0.4494,0.4624,0.2001,0.0775,0.1232,0.0783,0.0089,0.0249,0.0204,0.0059,0.0053,0.0079,0.0037,0.0015,0.0056,0.0067,0.0054,Mine +0.0423,0.0321,0.0709,0.0108,0.107,0.0973,0.0961,0.1323,0.2462,0.2696,0.3412,0.4292,0.3682,0.394,0.2965,0.3172,0.2825,0.305,0.2408,0.542,0.6802,0.632,0.5824,0.6805,0.5984,0.8412,0.9911,0.9187,0.8005,0.6713,0.5632,0.7332,0.6038,0.2575,0.0349,0.1799,0.3039,0.476,0.5756,0.4254,0.5046,0.7179,0.6163,0.5663,0.5749,0.3593,0.2526,0.2299,0.1271,0.0356,0.0367,0.0176,0.0035,0.0093,0.0121,0.0075,0.0056,0.0021,0.0043,0.0017,Mine +0.0095,0.0308,0.0539,0.0411,0.0613,0.1039,0.1016,0.1394,0.2592,0.3745,0.4229,0.4499,0.5404,0.4303,0.3333,0.3496,0.3426,0.2851,0.4062,0.6833,0.765,0.667,0.5703,0.5995,0.6484,0.8614,0.9819,0.938,0.8435,0.6074,0.5403,0.689,0.5977,0.3244,0.0516,0.3157,0.359,0.3881,0.5716,0.4314,0.3051,0.4393,0.4302,0.4831,0.5084,0.1952,0.1539,0.2037,0.1054,0.0251,0.0357,0.0181,0.0019,0.0102,0.0133,0.004,0.0042,0.003,0.0031,0.0033,Mine +0.0096,0.0404,0.0682,0.0688,0.0887,0.0932,0.0955,0.214,0.2546,0.2952,0.4025,0.5148,0.4901,0.4127,0.3575,0.3447,0.3068,0.2945,0.4351,0.7264,0.8147,0.8103,0.6665,0.6958,0.7748,0.8688,1,0.9941,0.8793,0.6482,0.5876,0.6408,0.4972,0.2755,0.03,0.3356,0.3167,0.4133,0.6281,0.4977,0.2613,0.4697,0.4806,0.4921,0.5294,0.2216,0.1401,0.1888,0.0947,0.0134,0.031,0.0237,0.0078,0.0144,0.017,0.0012,0.0109,0.0036,0.0043,0.0018,Mine +0.0269,0.0383,0.0505,0.0707,0.1313,0.2103,0.2263,0.2524,0.3595,0.5915,0.6675,0.5679,0.5175,0.3334,0.2002,0.2856,0.2937,0.3424,0.5949,0.7526,0.8959,0.8147,0.7109,0.7378,0.7201,0.8254,0.8917,0.982,0.8179,0.4848,0.3203,0.2775,0.2382,0.2911,0.1675,0.3156,0.1869,0.3391,0.5993,0.4124,0.1181,0.3651,0.4655,0.4777,0.3517,0.092,0.1227,0.1785,0.1085,0.03,0.0346,0.0167,0.0199,0.0145,0.0081,0.0045,0.0043,0.0027,0.0055,0.0057,Mine +0.034,0.0625,0.0381,0.0257,0.0441,0.1027,0.1287,0.185,0.2647,0.4117,0.5245,0.5341,0.5554,0.3915,0.295,0.3075,0.3021,0.2719,0.5443,0.7932,0.8751,0.8667,0.7107,0.6911,0.7287,0.8792,1,0.9816,0.8984,0.6048,0.4934,0.5371,0.4586,0.2908,0.0774,0.2249,0.1602,0.3958,0.6117,0.5196,0.2321,0.437,0.3797,0.4322,0.4892,0.1901,0.094,0.1364,0.0906,0.0144,0.0329,0.0141,0.0019,0.0067,0.0099,0.0042,0.0057,0.0051,0.0033,0.0058,Mine +0.0209,0.0191,0.0411,0.0321,0.0698,0.1579,0.1438,0.1402,0.3048,0.3914,0.3504,0.3669,0.3943,0.3311,0.3331,0.3002,0.2324,0.1381,0.345,0.4428,0.489,0.3677,0.4379,0.4864,0.6207,0.7256,0.6624,0.7689,0.7981,0.8577,0.9273,0.7009,0.4851,0.3409,0.1406,0.1147,0.1433,0.182,0.3605,0.5529,0.5988,0.5077,0.5512,0.5027,0.7034,0.5904,0.4069,0.2761,0.1584,0.051,0.0054,0.0078,0.0201,0.0104,0.0039,0.0031,0.0062,0.0087,0.007,0.0042,Mine +0.0368,0.0279,0.0103,0.0566,0.0759,0.0679,0.097,0.1473,0.2164,0.2544,0.2936,0.2935,0.2657,0.3187,0.2794,0.2534,0.198,0.1929,0.2826,0.3245,0.3504,0.3324,0.4217,0.4774,0.4808,0.6325,0.8334,0.9458,1,0.8425,0.5524,0.4795,0.52,0.3968,0.194,0.1519,0.201,0.1736,0.1029,0.2244,0.3717,0.4449,0.3939,0.203,0.201,0.2187,0.184,0.1477,0.0971,0.0224,0.0151,0.0105,0.0024,0.0018,0.0057,0.0092,0.0009,0.0086,0.011,0.0052,Mine +0.0089,0.0274,0.0248,0.0237,0.0224,0.0845,0.1488,0.1224,0.1569,0.2119,0.3003,0.3094,0.2743,0.2547,0.187,0.1452,0.1457,0.2429,0.3259,0.3679,0.3355,0.31,0.3914,0.528,0.6409,0.7707,0.8754,1,0.9806,0.6969,0.4973,0.502,0.5359,0.3842,0.1848,0.1149,0.157,0.1311,0.1583,0.2631,0.3103,0.4512,0.3785,0.1269,0.1459,0.1092,0.1485,0.1385,0.0716,0.0176,0.0199,0.0096,0.0103,0.0093,0.0025,0.0044,0.0021,0.0069,0.006,0.0018,Mine +0.0158,0.0239,0.015,0.0494,0.0988,0.1425,0.1463,0.1219,0.1697,0.1923,0.2361,0.2719,0.3049,0.2986,0.2226,0.1745,0.2459,0.31,0.3572,0.4283,0.4268,0.3735,0.4585,0.6094,0.7221,0.7595,0.8706,1,0.9815,0.7187,0.5848,0.4192,0.3756,0.3263,0.1944,0.1394,0.167,0.1275,0.1666,0.2574,0.2258,0.2777,0.1613,0.1335,0.1976,0.1234,0.1554,0.1057,0.049,0.0097,0.0223,0.0121,0.0108,0.0057,0.0028,0.0079,0.0034,0.0046,0.0022,0.0021,Mine +0.0156,0.021,0.0282,0.0596,0.0462,0.0779,0.1365,0.078,0.1038,0.1567,0.2476,0.2783,0.2896,0.2956,0.3189,0.1892,0.173,0.2226,0.2427,0.3149,0.4102,0.3808,0.4896,0.6292,0.7519,0.7985,0.883,0.9915,0.9223,0.6981,0.6167,0.5069,0.3921,0.3524,0.2183,0.1245,0.1592,0.1626,0.2356,0.2483,0.2437,0.2715,0.1184,0.1157,0.1449,0.1883,0.1954,0.1492,0.0511,0.0155,0.0189,0.015,0.006,0.0082,0.0091,0.0038,0.0056,0.0056,0.0048,0.0024,Mine +0.0315,0.0252,0.0167,0.0479,0.0902,0.1057,0.1024,0.1209,0.1241,0.1533,0.2128,0.2536,0.2686,0.2803,0.1886,0.1485,0.216,0.2417,0.2989,0.3341,0.3786,0.3956,0.5232,0.6913,0.7868,0.8337,0.9199,1,0.899,0.6456,0.5967,0.4355,0.2997,0.2294,0.1866,0.0922,0.1829,0.1743,0.2452,0.2407,0.2518,0.3184,0.1685,0.0675,0.1186,0.1833,0.1878,0.1114,0.031,0.0143,0.0138,0.0108,0.0062,0.0044,0.0072,0.0007,0.0054,0.0035,0.0001,0.0055,Mine +0.0056,0.0267,0.0221,0.0561,0.0936,0.1146,0.0706,0.0996,0.1673,0.1859,0.2481,0.2712,0.2934,0.2637,0.188,0.1405,0.2028,0.2613,0.2778,0.3346,0.383,0.4003,0.5114,0.686,0.749,0.7843,0.9021,1,0.8888,0.6511,0.6083,0.4463,0.2948,0.1729,0.1488,0.0801,0.177,0.1382,0.2404,0.2046,0.197,0.2778,0.1377,0.0685,0.0664,0.1665,0.1807,0.1245,0.0516,0.0044,0.0185,0.0072,0.0055,0.0074,0.0068,0.0084,0.0037,0.0024,0.0034,0.0007,Mine +0.0203,0.0121,0.038,0.0128,0.0537,0.0874,0.1021,0.0852,0.1136,0.1747,0.2198,0.2721,0.2105,0.1727,0.204,0.1786,0.1318,0.226,0.2358,0.3107,0.3906,0.3631,0.4809,0.6531,0.7812,0.8395,0.918,0.9769,0.8937,0.7022,0.65,0.5069,0.3903,0.3009,0.1565,0.0985,0.22,0.2243,0.2736,0.2152,0.2438,0.3154,0.2112,0.0991,0.0594,0.194,0.1937,0.1082,0.0336,0.0177,0.0209,0.0134,0.0094,0.0047,0.0045,0.0042,0.0028,0.0036,0.0013,0.0016,Mine +0.0392,0.0108,0.0267,0.0257,0.041,0.0491,0.1053,0.169,0.2105,0.2471,0.268,0.3049,0.2863,0.2294,0.1165,0.2127,0.2062,0.2222,0.3241,0.433,0.5071,0.5944,0.7078,0.7641,0.8878,0.9711,0.988,0.9812,0.9464,0.8542,0.6457,0.3397,0.3828,0.3204,0.1331,0.044,0.1234,0.203,0.1652,0.1043,0.1066,0.211,0.2417,0.1631,0.0769,0.0723,0.0912,0.0812,0.0496,0.0101,0.0089,0.0083,0.008,0.0026,0.0079,0.0042,0.0071,0.0044,0.0022,0.0014,Mine +0.0129,0.0141,0.0309,0.0375,0.0767,0.0787,0.0662,0.1108,0.1777,0.2245,0.2431,0.3134,0.3206,0.2917,0.2249,0.2347,0.2143,0.2939,0.4898,0.6127,0.7531,0.7718,0.7432,0.8673,0.9308,0.9836,1,0.9595,0.8722,0.6862,0.4901,0.328,0.3115,0.1969,0.1019,0.0317,0.0756,0.0907,0.1066,0.138,0.0665,0.1475,0.247,0.2788,0.2709,0.2283,0.1818,0.1185,0.0546,0.0219,0.0204,0.0124,0.0093,0.0072,0.0019,0.0027,0.0054,0.0017,0.0024,0.0029,Mine +0.005,0.0017,0.027,0.045,0.0958,0.083,0.0879,0.122,0.1977,0.2282,0.2521,0.3484,0.3309,0.2614,0.1782,0.2055,0.2298,0.3545,0.6218,0.7265,0.8346,0.8268,0.8366,0.9408,0.951,0.9801,0.9974,1,0.9036,0.6409,0.3857,0.2908,0.204,0.1653,0.1769,0.114,0.074,0.0941,0.0621,0.0426,0.0572,0.1068,0.1909,0.2229,0.2203,0.2265,0.1766,0.1097,0.0558,0.0142,0.0281,0.0165,0.0056,0.001,0.0027,0.0062,0.0024,0.0063,0.0017,0.0028,Mine +0.0366,0.0421,0.0504,0.025,0.0596,0.0252,0.0958,0.0991,0.1419,0.1847,0.2222,0.2648,0.2508,0.2291,0.1555,0.1863,0.2387,0.3345,0.5233,0.6684,0.7766,0.7928,0.794,0.9129,0.9498,0.9835,1,0.9471,0.8237,0.6252,0.4181,0.3209,0.2658,0.2196,0.1588,0.0561,0.0948,0.17,0.1215,0.1282,0.0386,0.1329,0.2331,0.2468,0.196,0.1985,0.157,0.0921,0.0549,0.0194,0.0166,0.0132,0.0027,0.0022,0.0059,0.0016,0.0025,0.0017,0.0027,0.0027,Mine +0.0238,0.0318,0.0422,0.0399,0.0788,0.0766,0.0881,0.1143,0.1594,0.2048,0.2652,0.31,0.2381,0.1918,0.143,0.1735,0.1781,0.2852,0.5036,0.6166,0.7616,0.8125,0.7793,0.8788,0.8813,0.947,1,0.9739,0.8446,0.6151,0.4302,0.3165,0.2869,0.2017,0.1206,0.0271,0.058,0.1262,0.1072,0.1082,0.036,0.1197,0.2061,0.2054,0.1878,0.2047,0.1716,0.1069,0.0477,0.017,0.0186,0.0096,0.0071,0.0084,0.0038,0.0026,0.0028,0.0013,0.0035,0.006,Mine +0.0116,0.0744,0.0367,0.0225,0.0076,0.0545,0.111,0.1069,0.1708,0.2271,0.3171,0.2882,0.2657,0.2307,0.1889,0.1791,0.2298,0.3715,0.6223,0.726,0.7934,0.8045,0.8067,0.9173,0.9327,0.9562,1,0.9818,0.8684,0.6381,0.3997,0.3242,0.2835,0.2413,0.2321,0.126,0.0693,0.0701,0.1439,0.1475,0.0438,0.0469,0.1476,0.1742,0.1555,0.1651,0.1181,0.072,0.0321,0.0056,0.0202,0.0141,0.0103,0.01,0.0034,0.0026,0.0037,0.0044,0.0057,0.0035,Mine +0.0131,0.0387,0.0329,0.0078,0.0721,0.1341,0.1626,0.1902,0.261,0.3193,0.3468,0.3738,0.3055,0.1926,0.1385,0.2122,0.2758,0.4576,0.6487,0.7154,0.801,0.7924,0.8793,1,0.9865,0.9474,0.9474,0.9315,0.8326,0.6213,0.3772,0.2822,0.2042,0.219,0.2223,0.1327,0.0521,0.0618,0.1416,0.146,0.0846,0.1055,0.1639,0.1916,0.2085,0.2335,0.1964,0.13,0.0633,0.0183,0.0137,0.015,0.0076,0.0032,0.0037,0.0071,0.004,0.0009,0.0015,0.0085,Mine +0.0335,0.0258,0.0398,0.057,0.0529,0.1091,0.1709,0.1684,0.1865,0.266,0.3188,0.3553,0.3116,0.1965,0.178,0.2794,0.287,0.3969,0.5599,0.6936,0.7969,0.7452,0.8203,0.9261,0.881,0.8814,0.9301,0.9955,0.8576,0.6069,0.3934,0.2464,0.1645,0.114,0.0956,0.008,0.0702,0.0936,0.0894,0.1127,0.0873,0.102,0.1964,0.2256,0.1814,0.2012,0.1688,0.1037,0.0501,0.0136,0.013,0.012,0.0039,0.0053,0.0062,0.0046,0.0045,0.0022,0.0005,0.0031,Mine +0.0272,0.0378,0.0488,0.0848,0.1127,0.1103,0.1349,0.2337,0.3113,0.3997,0.3941,0.3309,0.2926,0.176,0.1739,0.2043,0.2088,0.2678,0.2434,0.1839,0.2802,0.6172,0.8015,0.8313,0.844,0.8494,0.9168,1,0.7896,0.5371,0.6472,0.6505,0.4959,0.2175,0.099,0.0434,0.1708,0.1979,0.188,0.1108,0.1702,0.0585,0.0638,0.1391,0.0638,0.0581,0.0641,0.1044,0.0732,0.0275,0.0146,0.0091,0.0045,0.0043,0.0043,0.0098,0.0054,0.0051,0.0065,0.0103,Mine +0.0187,0.0346,0.0168,0.0177,0.0393,0.163,0.2028,0.1694,0.2328,0.2684,0.3108,0.2933,0.2275,0.0994,0.1801,0.22,0.2732,0.2862,0.2034,0.174,0.413,0.6879,0.812,0.8453,0.8919,0.93,0.9987,1,0.8104,0.6199,0.6041,0.5547,0.416,0.1472,0.0849,0.0608,0.0969,0.1411,0.1676,0.12,0.1201,0.1036,0.1977,0.1339,0.0902,0.1085,0.1521,0.1363,0.0858,0.029,0.0203,0.0116,0.0098,0.0199,0.0033,0.0101,0.0065,0.0115,0.0193,0.0157,Mine +0.0323,0.0101,0.0298,0.0564,0.076,0.0958,0.099,0.1018,0.103,0.2154,0.3085,0.3425,0.299,0.1402,0.1235,0.1534,0.1901,0.2429,0.212,0.2395,0.3272,0.5949,0.8302,0.9045,0.9888,0.9912,0.9448,1,0.9092,0.7412,0.7691,0.7117,0.5304,0.2131,0.0928,0.1297,0.1159,0.1226,0.1768,0.0345,0.1562,0.0824,0.1149,0.1694,0.0954,0.008,0.079,0.1255,0.0647,0.0179,0.0051,0.0061,0.0093,0.0135,0.0063,0.0063,0.0034,0.0032,0.0062,0.0067,Mine +0.0522,0.0437,0.018,0.0292,0.0351,0.1171,0.1257,0.1178,0.1258,0.2529,0.2716,0.2374,0.1878,0.0983,0.0683,0.1503,0.1723,0.2339,0.1962,0.1395,0.3164,0.5888,0.7631,0.8473,0.9424,0.9986,0.9699,1,0.863,0.6979,0.7717,0.7305,0.5197,0.1786,0.1098,0.1446,0.1066,0.144,0.1929,0.0325,0.149,0.0328,0.0537,0.1309,0.091,0.0757,0.1059,0.1005,0.0535,0.0235,0.0155,0.016,0.0029,0.0051,0.0062,0.0089,0.014,0.0138,0.0077,0.0031,Mine +0.0303,0.0353,0.049,0.0608,0.0167,0.1354,0.1465,0.1123,0.1945,0.2354,0.2898,0.2812,0.1578,0.0273,0.0673,0.1444,0.207,0.2645,0.2828,0.4293,0.5685,0.699,0.7246,0.7622,0.9242,1,0.9979,0.8297,0.7032,0.7141,0.6893,0.4961,0.2584,0.0969,0.0776,0.0364,0.1572,0.1823,0.1349,0.0849,0.0492,0.1367,0.1552,0.1548,0.1319,0.0985,0.1258,0.0954,0.0489,0.0241,0.0042,0.0086,0.0046,0.0126,0.0036,0.0035,0.0034,0.0079,0.0036,0.0048,Mine +0.026,0.0363,0.0136,0.0272,0.0214,0.0338,0.0655,0.14,0.1843,0.2354,0.272,0.2442,0.1665,0.0336,0.1302,0.1708,0.2177,0.3175,0.3714,0.4552,0.57,0.7397,0.8062,0.8837,0.9432,1,0.9375,0.7603,0.7123,0.8358,0.7622,0.4567,0.1715,0.1549,0.1641,0.1869,0.2655,0.1713,0.0959,0.0768,0.0847,0.2076,0.2505,0.1862,0.1439,0.147,0.0991,0.0041,0.0154,0.0116,0.0181,0.0146,0.0129,0.0047,0.0039,0.0061,0.004,0.0036,0.0061,0.0115,Mine diff --git a/extra_data_sets/stance.csv b/extra_data_sets/stance.csv new file mode 100644 index 0000000..c837151 --- /dev/null +++ b/extra_data_sets/stance.csv @@ -0,0 +1,2096 @@ +"!","'",",","-",":",";","a","about","actually","after","again","against","all","almost","already","also","always","am","an","and","another","any","are","around","as","at","away","back","banks","be","because","become","been","before","being","believe","best","better","between","blog","both","brexit","britain","british","but","by","cameron","campaign","can","cannot","case","change","clear","come","common","corbyn","could","countries","country","course","d","day","deal","democracy","did","different","do","does","don","done","down","economic","economy","election","end","enough","eu","euro","europe","european","even","ever","every","expect","fact","far","few","find","first","for","from","further","future","germany","get","given","go","going","good","got","government","greece","greek","had","hard","has","have","he","help","her","here","him","his","how","however","i","idea","if","immigration","in","independence","into","is","issue","it","its","itself","just","know","labour","last","least","leave","left","less","let","life","like","likely","little","long","look","m","made","majority","make","many","may","me","means","member","membership","might","money","more","most","much","must","my","national","need","needs","never","new","next","no","not","now","of","off","on","one","only","open","opinion","or","other","our","out","over","own","parliament","part","parties","party","people","point","policy","political","politics","polls","power","probably","problem","public","put","quite","rather","re","read","really","referendum","right","rights","s","said","same","say","scotland","scottish","second","see","seem","seems","she","should","since","snp","so","social","some","something","states","still","such","support","sure","system","t","take","than","that","the","their","them","then","there","these","they","thing","things","think","this","those","though","thought","through","time","to","too","tories","tory","trade","two","uk","ukip","under","union","up","us","use","ve","very","vote","voters","voting","want","war","was","way","we","week","well","were","what","when","where","whether","which","while","who","why","will","win","wish","with","within","without","won","work","world","would","year","years","yes","yet","you","your","–","—","Category*" +0,2,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,1,0,0,0,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,0,0,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,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,0,0,0,1,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,1,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,1,1,0,0,0 +0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,2,0,1,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,2,0,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,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,2,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,4,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,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,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,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,1,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,1,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,3,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,2,0,2,0,1,0,0,1,0,0,0,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,0,0,0,0,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0 +0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,0,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,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,1,0,0,0,0,0,1,3,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,1,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,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,1,0,0,0,1,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,0,0,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,2,0,0 +0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0 +0,0,5,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,1,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,1,0,0,0,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,1,3,0,0,0,0,0,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,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 +1,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,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,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,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,0,0,0,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,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,2,0,0,0,0,0,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,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,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,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,2,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,1,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,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,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,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,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 +0,0,2,0,0,0,0,1,0,0,0,0,1,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,1,0,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,1,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,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,1,0,1,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,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,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,1,0,0,0,0,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,1,0,0,0,0,0,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,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,3,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,3,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,1,0,0,0,0,0,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,0,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,1,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,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,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,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,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,1,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,1,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,1,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,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,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,1,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0 +0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,1,0,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,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,2,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,1,0,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,1,0,0,0,0,0,0,1,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,1,0,0,0,1,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,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,0,0,0,0,0,0,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,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,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,4,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,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,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,2,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +0,1,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,2,0,0,0,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,0,0,1,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,1,0,0,1,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,1,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,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,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,1,0,0,0,0,1,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,1,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,1,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,1,0,1,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,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,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,2,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0 +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,1,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,1,0,0,0,0,0,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,0,0,0,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,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,0,0,0,1,0,0,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,3,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,1,0,1,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,1,0,0,0,0,0,3,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,3,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,1,0,0,0,0,0,0 +0,2,1,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,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,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,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,0,1,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,0,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,0,1,0,0,1,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,0,3,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,0,0,0,0,0,0,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,3,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,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,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,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,0,0,1,0,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,0,0,0,0,0,0,0,0,1,1,0,0,0,2,0,0,0,0,0,0,1,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,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,1,0,0,0,0 +0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,1,0,0,0,3,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,1,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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 +1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,1,0,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,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,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,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,0,0,0,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,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,1,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,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,0,0,0,0,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,1,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,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,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,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,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,1,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,1,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,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,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,1,0,1,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,1,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,2,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,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 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,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,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,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,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,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,2,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,5,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,0,0,0 +0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,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,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,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,1,0,0,0,1,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,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,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,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,1,2,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,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,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,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,1,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,1,3,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,1,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,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,1,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,1,0,0,0,0,1,1,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,6,0,0,0,0,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,0,0,0,0,0,1,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,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,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,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0 +0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,2,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,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,0,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 +0,1,1,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,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,1,0,1,0,0 +0,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,1,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,3,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0 +0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,1,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,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,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,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,1,0,0,1,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,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,1,1,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,1,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,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,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,1,0,0,0,0,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,0,0,0,0,0,0,1,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,1,0,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,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +0,1,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,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,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,1,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,0,0,0,0,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,1,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,1,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,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 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,4,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,1,0,0,0,0,0,1,2,0,0,0,0,0,0,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,0,0,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 +0,1,2,0,0,1,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,3,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,5,0,0,0,2,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,1,0,1,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,1,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,2,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,2,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,5,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,1,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,1,0,0,0,1,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,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,1,0,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,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,0,2,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,2,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,3,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,3,1,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,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,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,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,1,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,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,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,1,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,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 +0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,3,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,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,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,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,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,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,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,0 +0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,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,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,1,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,2,3,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,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,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,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,0,0,0,1,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,0,0,0,0,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,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,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,1,0,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,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,1,0,3,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,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,1,0,0,0,0 +0,0,1,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,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,1,0,0,1,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,0,0,0,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,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,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,1,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,1,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,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,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,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,3,2,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,1,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,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,0,0,1,0,0,0,0,1,0,2,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,1,4,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,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,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,1,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,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,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,0,0,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,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,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,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,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,1,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,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,0,0,0,0,0,0,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,0,0,0,0,1,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,0,0,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,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,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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 +0,1,2,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,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,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,2,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0 +0,0,5,0,0,0,4,0,0,0,0,0,0,0,0,1,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,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,1,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,1,0,0,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,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,1,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,0,0,0,0,0,0,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,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,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,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,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,1,3,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,1,0,0,0,0,0,0,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,1,0,0,0,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,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,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,3,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0 +0,0,1,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,2,0,0,1,0,0,0,1,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,3,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,2,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,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,1,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,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,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,2,1,2,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,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,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,1,3,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,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,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,1,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,2,0,0,0,0,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,0,1,0,1,0,0,0,0,0 +0,1,1,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,1,0,0,0,1,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,2,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,1,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,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,0,0,0,0,0,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,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,2,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,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,2,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,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,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,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,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,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,1,0,0,0,0,1,5,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,1,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,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,1,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,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,1,0,0,0,0,0,0,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,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,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,2,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,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,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,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,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,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,4,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,1,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,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,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +0,0,2,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,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,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,3,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,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,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,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,2,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,0,0,0,0,0,0,0,0,1,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,1,1,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,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,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,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,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,3,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,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,0,0,0,0,0,0,0,2,0,0,0,0 +1,1,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,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,1,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,1,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0 +0,0,0,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,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,0,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,1,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,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,1,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,3,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,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,1,1,0,0,0,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,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,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,1,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,0,0,0,0,0,1,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,0,0,0,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,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,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,0,1,0,0,0,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,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,4,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,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,1,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,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,0,0,0,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,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,2,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,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,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,2,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,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,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,0,0,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,1,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,1,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,2,1,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,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,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,1,0,0,0,0,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,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,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,2,0,0,0,0,0,0,0,0,0,0,0,2,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,1,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,1,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,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,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,1,0,0,0,0,0,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,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,2,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,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,1,0,0,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,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,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,0,1,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,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,1,1,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,1,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,0,0,0,1,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,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,1,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,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,1,1,0,0,0,0,0,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,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,4,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,3,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,2,1,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,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0 +0,1,2,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,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,1,0,0,0,0,0,0,0,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,0,0,0,3,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,1,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,1,0,0,0,0,0,1,0,0,0,0,0,0,1,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,4,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,1,0,0,0,0,0,0,0,0,0,1,0,0,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,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,1,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,1,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,1,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,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,0,0,0,0,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,1,0,0,0,1,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1,2,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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 +1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,1,0,0,0,0,0,1,4,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,1,0,0,0,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,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,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,0,0,0,0,0,1,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,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,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1,0,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,1,0,0,0,1,0,0,0,0,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,0,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,1,0,0,2,2,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,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,4,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,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,0,0 +0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,0,0,0,1,0,0,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,1,0,0,0,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,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,1,0,0,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 +1,0,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0 +0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,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,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,1,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,1,1,0,0,0,1,0,0,0,0,0,1,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,2,0,0,1,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,2,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,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,0,0,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,2,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,1,0,0,0,0,0,0,0,3,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,1,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,2,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,0,0,0,0,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,1,0,1,0,0,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,0,0,2,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,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,1,1,1,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,0,0,0,0,0,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,1,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,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,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,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,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,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,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,2,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,1,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,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,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,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 +0,1,2,0,0,0,1,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,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,1,0,0,0,0,0,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,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,2,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,1,0,0,0,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,0,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,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,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,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,1,0,0,0,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,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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,3,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,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,1,1,0,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,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,0,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,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,1,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,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,1,1,1,0,0,0,0,0,0,0,1,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,2,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,2,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,1,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,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,1,0,0,0,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,0,0,0,0,0,0,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 +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,2,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,1,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,1,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,2,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,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,1,0,0,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,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,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,0,0,0,0,0,0,0,1,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,1,0,0,3,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,0,0,0,0,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,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,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,0,0,0,0,0,0,0,1,2,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,1,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,0,0,0,0,0,0,0 +0,1,2,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,3,0,0,0,1,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,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,1,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,0,1,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,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,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,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,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0 +0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,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,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,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,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,1,1,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,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,0,0,0,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,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,1,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,0,0,0,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,1,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,2,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,3,3,0,0,0,0,0,0,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,1,0,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,1,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,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,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,3,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,4,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,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,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,1,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0 +0,0,2,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,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,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,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,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,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,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,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,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,1,0,0,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,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,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,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,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,0,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,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,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,0,0,0,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,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,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,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,0,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,1,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,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,0,0,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,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,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,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,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,1,0,0,0,1,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,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,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,2,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,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,1,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,1,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,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,0,0,0,1,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,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,1,0,0,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,1,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,1,1,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,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,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,1,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,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,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,4,2,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,2,0,0,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,0,0,0,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,0,1,0,0,1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,0,0,0,0,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,1,0,0,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,1,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,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,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,1,2,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,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,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,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,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,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0 +0,2,0,0,0,0,0,2,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,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0 +0,2,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,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,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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 +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,3,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,1,0,0,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,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,2,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,6,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,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,0,0,0 +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,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,0,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,1,0,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,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,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,1,0,0,0,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,2,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,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,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,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,0,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,1,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,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,0,0,0,0,0,0,0,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,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,0,0,0,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,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,0,0,0,0,0,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,3,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,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,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,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,0,0,0,0,0,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,1,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,1,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,1,0,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,0,0,0,0,0,2,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,2,4,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,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,0,0,0,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,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,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,1,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,1,0,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,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,0,0,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,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,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,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,0,1,0,0,0,0,0,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,3,2,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,1,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,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,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,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,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,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,2,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,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,1,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,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,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,1,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,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,1,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,2,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,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,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,5,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,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,8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,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,3,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,1,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,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,1,0,0,1,0,0 +0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,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,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,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,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,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,2,1,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,1,0,0,0,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,3,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,1,0,0,0,0,0,1,0,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,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,1,0,0,0,0,1,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,3,0,0,0,1,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,1,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,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,1,0,0,0,0,0,0,0,0,0,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,0,1,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,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,3,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,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,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,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,0,0,0,0,2,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,2,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,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,1,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,1,0,0,0,0,0,0,0,0,0 +0,1,3,0,0,0,1,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,1,0,0,0,0,0,0,1,0,1,0,0,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,1,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,1,0,0,0,0,0,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,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,0,0,0,0,0,1,1,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,1,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,1,0,0,0 +0,0,5,0,0,0,2,0,0,0,0,0,1,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,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,1,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,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,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,1,0,0,0,0 +0,0,4,0,1,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0 +0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,0,0,3,0,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,1,0,0,1,1,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,1,0,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,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,1,2,0,0,0,0,0,0,0,0,0,3,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,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,1,0,0,0,0,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,0,0,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,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,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,1,0,0,0,0,0,4,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,1,0,0,0 +0,1,1,0,0,0,1,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,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,3,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,1,0,0,0,0,0,0,0,2,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,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,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,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,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,1,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0 +0,0,1,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,1,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,1,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,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,0,2,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,1,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,1,2,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,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,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,1,0,0,0,0,0,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,2,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,0,0,0,0,0,0,0,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,5,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,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,0,0,0,1,0,0,0,0,0,0,0,0,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,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,2,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,4,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,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,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,0,0,0,0,0,0,0,0,1,0,0,0,0,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,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0 +0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0 +0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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 +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,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,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,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,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,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,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,0,0,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,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,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,4,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,2,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,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,1,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,2,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,0,0,0 +0,3,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,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,2,0 +0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,2,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,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,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,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,1,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,1,0,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,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,1,0,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,3,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,1,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,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,1,0,0,0,0 +0,1,1,0,0,0,1,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,0,0,0,0 +0,2,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,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,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +0,2,1,0,0,0,1,1,0,1,0,0,0,0,0,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,0,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,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,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,1,0,0,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,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,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,2,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,2,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,2,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 +0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,0,0,0,0,0,0,0,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,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,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,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,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 +0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,4,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,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,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,1,0,0,0,0,0,1,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,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 +0,3,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,1,0,0,1,1,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,1,0,0,0,0,1,0,0,0,0,0,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,0,0,0,0,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,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,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,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,2,0,2,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,0,0,0,1,0,0,1,0,0,1,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,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,2,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,2,0,0 +0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,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,1,1,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,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,2,0,0,1,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,1,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0 +0,1,1,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,7,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,4,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,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,0,1,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,1,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,2,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,1,0,2,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,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,2,3,0,0,0,0,0,1,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,0,1,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,1,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,0,0,1,0,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,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,2,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,1,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,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,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,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,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,1,2,0,0,0,0,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,1,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,1,0,1,0,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,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,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,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,0,0,0,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,1,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 +0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,0,0,0,0,2,1,0,1,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,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,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,2,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,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,5,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,1,0,0,0,0,0,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,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,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,4,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,2,0,1,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,1,0,0,1,1,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,1,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,1,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,0,1,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,0,0,0,1,2,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,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,0,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,1,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,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,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,0,0,0,0,0,0 +0,2,2,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,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,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,1,2,0,0,0,0,0,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,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,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,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,0,0,0,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,5,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,2,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,0,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,2,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,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,0,0,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,5,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,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,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,1,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,2,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,1,5,0,0,0,0,0,0,0,0,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,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,1,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,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,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,0,0,0,0,0,0,0,0,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,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,5,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,1,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,2,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,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,1,2,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,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,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,0,0,0,0,1,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,1,0,0,0,0,1,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,1,0,0,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,1,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,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,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,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,1,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0 +0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,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,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,4,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,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,1,0,0,0,0,0,1,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,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,2,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,0,0,0,0,0,2,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,1,1,2,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,3,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,1,2,0,0,0,2,0,0,0,0,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,3,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,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,1,0,0,0,0,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,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,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,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0 +0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,1,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,0,0,0,0,0,0,1,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,5,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,2,0,0,1,2,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,2,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,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,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,1,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,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,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,1,0,0,0,0,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,1,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,1,0,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,4,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,0,0,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,3,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,2,0,1,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,2,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,1,0,0,0,0,0,0,0,0,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,0,0,0 +0,1,1,0,0,0,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,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0 +0,1,2,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,1,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,0,0,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,1,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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 +1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,2,0,0,1,1,0,0,0,0,0,1,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,0,1,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,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,0,0,0 +0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,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,1,0,0,0,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,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,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,0,0,0,0,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,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,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,1,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,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,0,0,0,0,0,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,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,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,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,1,0,0,0,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,1,0,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,2,0,0,0,0,0,1,0,0,0,0,0,0,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,0,0,1,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 +0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,1,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,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,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,1,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,3,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,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,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,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,0,0,0,0,2,3,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,2,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,1,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,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,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,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,1,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,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,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,2,0,0,0,0,1,2,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,0,1,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,0,0,0,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 +0,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0 +0,0,1,0,0,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0 +0,1,1,0,0,0,0,1,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,2,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,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,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,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,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,3,3,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,2,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,1,0,3,0,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,0,0,0,0,1,1,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,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,2,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,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,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,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,2,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0 +0,0,0,0,0,0,2,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,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,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,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,3,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,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,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,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,0,0,0,0,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,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,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 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,2,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,2,0,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0 +0,1,1,0,0,0,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,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,1,0,0,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,0,0,0,0,0,0,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,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,1,0,0,0,2,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,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,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,1,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,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,1,0,0,1,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,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,0,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,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,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,2,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,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,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,0,0,0,0,0,0,0,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,3,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,3,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,2,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,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,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,1,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,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,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,1,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,1,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,2,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,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,1,0,0,0,0,0,0,0,0,0,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,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,2,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,1,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,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,1,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,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,1,0,0,0,0,0,0,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,1,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,1,1,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,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,1,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,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,2,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,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,0,0,0,0,0,0,1,0,0,0,0,1,0,1,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,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0 +0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,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,1,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,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,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,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,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,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,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,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,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,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,2,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,1,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,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,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,1,0,0,0,1,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,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,1,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,3,0,0,0,0,0,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,0,0,0,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,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,1,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,1,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,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,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,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,0,0,0,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,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0 +0,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,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,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,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,1,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,2,1,0,0,0,0,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,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,1,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,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,2,0,0,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,1,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,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,1,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,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,1,0,0,0,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,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,3,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,1,0,0,0,0,0,0,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,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,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,0,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,1,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,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,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,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,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,0,0,0 +0,1,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,0,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,0,0,0,0,1,0,0,0,0,0,1,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,0,0,0,0,0,0,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,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,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,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,1,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,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,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,3,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,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,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,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,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,0,0,0,0,1,0,0,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,1,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,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,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,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,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,0,0,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,1,0,0,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,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,2,0,0,0,0,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,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,1,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,1,1,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0 +0,1,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,1,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,1,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,2,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,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,0,0,0,0,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,0,0,0,1,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,0,0,0,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,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,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,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,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,1,0,0,0,0,0,0,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,1,0,0,1,0,0,0,0,0,0,1,0,0,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,2,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,1,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,2,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,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,2,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,0,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,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,1,0,1,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,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,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,1,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,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,1,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,1,0,0,0,0,0,0,0,3,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,1,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,3,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,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,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,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,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,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,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,1,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,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,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,2,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,1,0,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,1,0,0,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,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,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,1,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,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,2,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,3,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,1,0,0,0,0,0,0,1,0,0 +0,1,0,0,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,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,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,2,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,0,0,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,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,1,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,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,0,4,0,0,0,0,0,0,0,0,0,0,1,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,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 +0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,1,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,2,0,0,0,0,0,0,1,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,3,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,0,0,0,0,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,1,0,0,0,1,0,0,0,0,0,2,1,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,1,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,1,3,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,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,1,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,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,1,0,0,0,0,0,0,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,1,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,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,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,1,0,0,0,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,0,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,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,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,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,2,2,2,1,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,1,0,0,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 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0 +0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,2,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,3,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,0,0,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,0,0,0 +0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,1,2,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,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,3,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,1,1,0,0,1,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,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,1,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,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,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,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,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,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,1,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,1,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,5,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,0,1,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,0,0,0,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,0,0,0,0,0,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,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,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,0,0,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,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,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,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,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,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,1,0,0,0,0,0,0,2,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,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,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,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,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,1,0,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,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,1,0,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,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,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,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,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,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,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,1,0,0,0,0,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,0,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,0,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,1,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,2,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,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,4,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,1,0,0,0,0,0,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,0,0,0,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,0,0,0,0,1,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,2,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,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,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,2,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,0,0,0,0,0 +0,0,3,0,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,4,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,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,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,3,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,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,0 +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,3,0,1,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,1,0,0,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,1,4,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,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,2,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,3,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,3,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,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 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0 +0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,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,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,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,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,1,2,0,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,1,0,1,1,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,1,0,1,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,0,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,0,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,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,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,0,0,0,0,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,2,0,1,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,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0 +0,0,4,0,0,0,1,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,1,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,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,4,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,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,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,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,1,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,1,0,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,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,1,1,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,1,0,3,0,0,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,1,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,1,0,0,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,2,2,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,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,0,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,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,1,0,0,0,0,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,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,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,1,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,2,0,0,0,0,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,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,2,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,0,0,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,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,2,0,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,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4,0,1,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,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,4,0,0,0,1,1,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,3,0,0,0,1,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,1,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,1,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,1,0,0,0,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,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,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,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,2,1 +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,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,0,0,0,0,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,1,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,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,0,0,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,1 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1 +0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,1,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,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 +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,1,0,0,0,0,0,0,0,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,1,0,2,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,1,0,0,0,0,0,0,0,0,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 +0,2,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,1,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,1,0,2,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1 +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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1 +0,1,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,1,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,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,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,0,1,0,0,0,0,1,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,0,0,0,0,0,1,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,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +0,0,2,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,2,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,1,2,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,1,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,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,0,1,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,1,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,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,1,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,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,2,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,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,1,0,2,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,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,1,0,0,0,0,0,0,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,1 +0,0,2,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1 +0,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,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,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,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,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,0,0,0,0,1,1,1,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1 +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,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,2,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1 +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,1,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,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,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,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1 +0,0,1,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,1,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +0,0,3,0,0,0,1,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,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,0,0,0,0,3,0,1,0,1,0,0,0,0,2,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,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,2,0,0,0,0 +0,1,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,2,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,1 +0,2,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,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,1 +0,0,2,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,1,0,0,0,0,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,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,0,0,0,0,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,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,1 +0,2,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,1,0,0,0,0,0,0,0,0,0,1,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,0,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,1,0,0,0,0,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,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,0,1,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,2,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,1,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,1,1,0,0,1 +0,0,1,0,0,0,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,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,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,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,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,1 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,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,2,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,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,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,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,1,0,0,0,0,0,0,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,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,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,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,1,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,1 +0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +0,0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,1,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,1,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,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1 +0,1,1,0,0,0,1,1,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,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,0,0,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,2,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,1 +0,1,2,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1 +1,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,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,1,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,0,1,0,0,0,0,0,0,0,0,0,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,1 +0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,1,0,1,0,0,2,0,1,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,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,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,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,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,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,1 +0,4,1,0,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,1,0,0,0,0,0,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,1,0,1,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,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,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,1,0,0,1,0,0,0,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,0,0,0,0,0,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,2,0,0,0,1 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,2,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1 +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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,1 +0,0,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,1,0,0,0,0,0,1,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,2,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,4,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,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,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,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,1,0,0,0,0,0,0,0,1,0,2,0,0,0,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,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,1 +0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,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,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,1 +0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,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,1 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,0,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,1 +0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,1,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,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,0,0,0,0,0,0,5,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,1,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,1,0,0,0,1,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,0,0,0,0,1,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,1,0,0,0,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,0,0,0,1,0,0,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,1,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,3,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,0,0,1 +0,1,2,0,0,0,0,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,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,0,0,1,0,0,1,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,1,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,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,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +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,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,0,0,0,0,0,0,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,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,1 +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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,1,0,0,0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 +0,2,1,0,0,0,2,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,1,3,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,1,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,1 +0,0,2,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,1,2,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 +0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,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,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,1,0,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,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,4,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,1 +0,0,5,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,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,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,2,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1 +0,0,3,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1 +0,0,0,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,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,0,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,2,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1 +0,0,2,0,0,0,2,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,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,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,2,0,0,0,0,0,0,0,0,1 +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,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,1,0,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,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,0,0,0,1 +0,0,2,0,0,0,1,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,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,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,3,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,1,0,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,0,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +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,0,0,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,0,0,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,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 +0,1,2,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,2,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,1,0,0,0,0,1,0,1,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,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,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,3,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,1,3,0,0,0,1,0,0,0,0,0,0,0,0,1,0,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,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,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,1,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,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,1,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,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,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1 +0,0,1,0,0,0,1,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,1,1,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,1 +0,2,1,0,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,0,0,0,0,1,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,2,0,0,0,0,0,0,0,0,1 +0,0,3,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,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,1,0,1,0,2,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1 +0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,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,0,0,1,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,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,2,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,1 +0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,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,1,0,0,0,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,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,1,0,0,0,0,0,0,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,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,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1 +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1 +0,1,1,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1 +0,0,4,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,0,0,0,0,2,0,0,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,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,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,1,2,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,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,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,0,0,0,1 +0,0,4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,0,0,0,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,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,1,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1 +0,0,3,0,0,0,1,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,0,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,0,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,0,0,0,0,1,0,3,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,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,3,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,0,0,0,1 +0,1,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1 +0,1,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,1,1,0,0,0,0,2,0,0,0,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,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,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,1,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,2,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,1,0,0,0,0,0,0,0,0,1 +0,0,1,0,0,0,3,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,1,1 +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 +0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,1,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,1,1,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,2,0,0,1,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,2,1,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,0,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,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,1,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,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,2,1,0,0,1 +0,0,0,0,0,0,3,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,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,2,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,1,1,0,0,1,0,0,0,0,0,1,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,1,1,0,0,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,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,1 +0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,1,0,0,0,1,0,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,1,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,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,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,1 +0,0,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,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,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,2,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,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,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,1,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,2,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,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,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,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,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,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,1,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,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,1,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,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,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,0,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,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,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,3,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,1,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,1,0,0,0,0,0,0,0,0,0 +0,1,1,1,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,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,0,0,0,0,0,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,1,0,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,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,1,1,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,0,0,0,0 +0,3,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,1,1,0,0,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,0,0,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,1,0,0,0,2,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,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,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,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,0,0,0,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,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,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,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,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,2,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0 +0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,0,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,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,0,0,0,0,0,0,1,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,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,0 +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,1,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,2,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,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,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,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0 +0,1,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,3,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,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,0,0,0 +0,0,1,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,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,3,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,2,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,2,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,1,0,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,1,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,0,0,0,0,0,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,1,4,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,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,9,0,0,0,5,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,4,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 +0,0,2,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,1,0,0,0,0 +0,0,2,0,0,0,0,1,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,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,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,2,1,0,0,0 +0,0,1,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,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,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,0,0,0,0,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,2,1,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,1,0,0,0,0,0,0,0,0,0 +0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,2,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,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,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,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,1,0,2,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,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,1,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,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,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,0,1,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,1,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,1,0,0,0,0,0,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,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,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,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,3,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,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,2,0,1,0,0,0,0,0,2,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,2,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0 +0,1,0,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0 +0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,1,1,15,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,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,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,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,1,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,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,1,0,0,0,0,0,0,0,2,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,0,0,0,2,4,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,5,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0 +0,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,1,4,0,0,0,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,0,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,1,0,0,0,0,0,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,0,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,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,1,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,1,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,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,1,1,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,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,0,0,0,0,0,0 +0,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,1,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,1,0,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,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,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,0,0,1,3,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,2,0,0,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,0 +0,0,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 +1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,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,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,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,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,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,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,0,0,0,0,1,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,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,1,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,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,1,0,0,0,0,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,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,1,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,2,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,2,4,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,2,2,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,1,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,0,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0 +0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,3,0,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,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,1,0,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,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,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,1,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0 +0,0,5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,1,1,0,0,0,0,0,0,0 +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,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,0,0,0,0,1,3,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,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,1,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,4,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0 +0,0,1,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,1,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,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,0,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,1,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,1,2,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,2,0,0,0,0,1,0,0,0,0,1,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,0,0,0,0,0,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,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,0,0,0,1,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,1,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,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,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,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,1,1,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,1,0,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,1,0,0,0,0,0,0,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,1,0,0,0,0,0,0,0,0,0,0,1,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 +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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,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,1,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,1,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 +0,0,1,0,0,0,0,0,0,1,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,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,3,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,0,0,0,2,0,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,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,0,0,0,0,0,0,0,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,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,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,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,0,0,1,0,0,0,0,0,0,0,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,1,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,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,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,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,1,2,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,0,1,0,0,0,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,1,0,0,0,0,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,0,1,2,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,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,1,1,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,1,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,2,0,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,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,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,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,1,0,0,0,2,0,2,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,1,0,0,0,0,0,0,0,0,0 +0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,2,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,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,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,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,0,0,0,0,0,0,0,1,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,6,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,0,0,0 +0,2,0,0,0,0,1,0,0,0,0,0,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,1,3,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,2,0,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 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,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,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,0,0,0 +0,0,4,1,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,0,0,0,0,0,1,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,0,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,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,1,0,0,0 +0,0,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,3,0,0,0,0,0,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,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,1,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,0,0,1,0,0,1,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,1,0,0,0,1,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0 +0,1,1,2,0,0,1,0,0,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,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,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,1,0,0,0,0,0,1,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,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,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,1,0,1,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,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,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0 +0,0,3,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,1,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,0,0,0,0,0,0,0 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,1,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,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,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,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0 +0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,1,2,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,1,0,0,0,0,0,0,0,0,0 +0,3,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,0,0,0,0,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,1,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,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,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,0,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,0,0,0,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,2,0,0,0,0,3,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,1,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,4,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,3,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,1,0,0,0,0,0,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,1,0,0,0 +0,0,8,1,0,0,1,0,0,0,0,0,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,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,1,0,0,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,0,0,0,0,0,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,1,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,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,0,0,0,0,0,0 +0,0,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,2,1,1,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,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,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,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,2,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,2,3,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,1,0,0,1,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,1,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,3,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,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,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,1,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,1,3,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,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,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,2,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0 +0,0,3,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,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,1,1,0,0,0,0,0,0,0,0,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0 +0,1,0,1,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,1,0,0,0,0 +0,0,3,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,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,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,0,0,0,0,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,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,1,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,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,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,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,4,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,1,0,0,0,0,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,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0 +0,0,3,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,2,0,0,0,1,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,1,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,0,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,1,0,0,2,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,2,3,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,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,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,1,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,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,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,1,1,0,1,0,0,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,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,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,5,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,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,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,2,0,0,0,0,1,0,1,0,0,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,0,0,0,0,0 +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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,2,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,1,0,0,1,1,1,0,0 +0,2,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,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,0,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,0,1,0,3,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,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,1,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,0,0,2,2,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,1,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,1,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,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,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,1,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,0,0,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,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,0,0,0,0,0,0,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,1,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,1,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,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,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,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,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,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,1,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,0,0,0,0,0,0,0,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,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,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,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,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,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,1,3,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0 +0,1,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,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,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,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,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,3,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,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,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,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,2,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,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,0,0,0,0,1,0,0,0,0,0,0,1,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,2,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1,0,0,0,0 +0,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,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,1,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,1,0,0,0,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,0,0,0,0,0,0,0,0,0 +0,0,2,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,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,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,1,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,5,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,4,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,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,0,0,1,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,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,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,1,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,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,0,0,0,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,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,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,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,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,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,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,1,0,0,0,0 +0,0,3,0,1,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,1,0,0,0,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,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,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,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,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,1,0,0,0,0,0,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,1,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,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,1,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,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,1,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,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,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,1,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,0,0,0,1,0,0,0,1,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,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,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,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,0,1,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,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0 +0,1,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,2,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,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,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,0,0,0,0,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,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,1,0,0,0,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,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,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,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,0,0,0,0,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,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,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,3,0,0,0,1,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1,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,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,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,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,0,0,0,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,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,2,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,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,1,0,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,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,1,0,1,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,1,0,0 +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,1,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,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,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,1,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,0,2,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,3,2,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,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,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,3,0,0,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,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,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,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,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,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,3,0,0,0,2,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,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,1,0,0,0,0,0,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,2,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,1,0,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,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,1,5,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 +0,0,1,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,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,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,0,0,0 +0,0,2,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0 +1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,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,0,0,0,0,0,0,1,0,0,0,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,3,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,0,3,1,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,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,1,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1,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,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,1,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,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,2,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,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,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,1 +0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,1 +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,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,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,1,0,0,0,0,0,0,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,2,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,1,1,3,0,2,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,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,0,0,0,0,0,0,0,0,2,0,0,0,1 +0,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,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,2,0,0,0,0,0,0,0,0,1 +0,0,2,2,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,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,1,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,0,0,0,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,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,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,2,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,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,1,0,0,0,1 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,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,2,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,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,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,1,0,0,0,1 +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,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,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1 +0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1 +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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,0,0,0,0,0,1,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,1 +0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,1,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,3,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,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,1,0,0,0,0,0,0,0,0,1 +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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,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,0,0,0,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,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,0,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,1 +0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,1,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1 +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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,1,0,0,1,0,0,0,1,0,1 +0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,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,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,3,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,0,0,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,1 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1 +0,0,3,1,0,0,1,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,1,1,1,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,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,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,1,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,1 +0,0,2,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,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,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,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,2,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,1,0,0,0,1,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,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,2,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,1,0,1 +0,1,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,0,0,0,0,0,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0 +0,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,1,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,0,0,0,0,1,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,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,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,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,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,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,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,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,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,1,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,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,0,0,0,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,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,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,1,0,0,0,0,0,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,0,0,0,0,1,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,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,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,1 +0,1,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,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1 +0,0,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,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,3,2,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,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,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,1,4,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,0,0,0,0,0,0,0,0,0,0,0,0,1 +0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,2,1,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1 +0,0,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,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,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,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,2,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,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,1,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,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,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,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,0,0,0,0,0,0,1,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,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,0,0,0,1,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 +0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,1,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,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,1,0,0,0,0,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,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,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,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 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,2,0,0,0,1 +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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,1 +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,2,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,3,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,1,0,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,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,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1 +0,0,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,3,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,1,0,1,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,0,0,1,2,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,1,3,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1 +0,0,2,0,1,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,0,0,0,0,0,0,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,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,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,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,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,1,0,0,0,1 +0,0,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1 +0,2,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,1,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,2,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,1,0,0,0,0,0,0,0,0,0,1,0,0,1 +0,3,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,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,0,0,0,0,0,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,1,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,1,0,0,0,0,0,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,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,2,1,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1 +0,0,3,0,0,0,0,0,0,0,0,1,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,1,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,1,0,0,0,0,0,0,0,1 +0,0,2,0,0,0,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,2,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,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,0,0,0,0,0,0,0,0,2,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1 diff --git a/extra_data_sets/stancetest.csv b/extra_data_sets/stancetest.csv new file mode 100644 index 0000000..476e569 --- /dev/null +++ b/extra_data_sets/stancetest.csv @@ -0,0 +1,2060 @@ +"!","'",",","-",":",";","a","about","actually","after","again","against","all","almost","already","also","always","am","an","and","another","any","are","around","as","at","away","back","banks","be","because","become","been","before","being","believe","best","better","between","blog","both","brexit","britain","british","but","by","cameron","campaign","can","cannot","case","change","clear","come","common","corbyn","could","countries","country","course","d","day","deal","democracy","did","different","do","does","don","done","down","economic","economy","election","end","enough","eu","euro","europe","european","even","ever","every","expect","fact","far","few","find","first","for","from","further","future","germany","get","given","go","going","good","got","government","greece","greek","had","hard","has","have","he","help","her","here","him","his","how","however","i","idea","if","immigration","in","independence","into","is","issue","it","its","itself","just","know","labour","last","least","leave","left","less","let","life","like","likely","little","long","look","m","made","majority","make","many","may","me","means","member","membership","might","money","more","most","much","must","my","national","need","needs","never","new","next","no","not","now","of","off","on","one","only","open","opinion","or","other","our","out","over","own","parliament","part","parties","party","people","point","policy","political","politics","polls","power","probably","problem","public","put","quite","rather","re","read","really","referendum","right","rights","s","said","same","say","scotland","scottish","second","see","seem","seems","she","should","since","snp","so","social","some","something","states","still","such","support","sure","system","t","take","than","that","the","their","them","then","there","these","they","thing","things","think","this","those","though","thought","through","time","to","too","tories","tory","trade","two","uk","ukip","under","union","up","us","use","ve","very","vote","voters","voting","want","war","was","way","we","week","well","were","what","when","where","whether","which","while","who","why","will","win","wish","with","within","without","won","work","world","would","year","years","yes","yet","you","your","–","—","Category*" +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,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,1,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,0,0,1,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,1,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,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,0,0,0,1,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,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,0,0,0,0,0,0,0,1,0,0,0,0,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,0,0,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,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,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,1,3,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,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,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,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,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,2,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,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,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,1,1,0,1,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,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 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,1 +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,0,0,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,2,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,3,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,1,0,0,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,1 +0,0,0,0,0,0,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,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,0,0,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,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,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,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,2,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,1,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,1,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,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,1,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,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,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,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,1 +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,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,3,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,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,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,1 +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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1 +0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,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,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,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,1,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,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,3,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,1,0,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,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,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,2,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,1,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,1 +0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,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,1,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,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,1,0,3,0,0,0,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,3,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,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1 +0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,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,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,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,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,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,1 +0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,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,0,0,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,2,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,4,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,1 +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,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,1,2,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,2,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,1,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,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,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,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,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,1,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,0,0,0,0,0,0,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,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,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,1 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1 +0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,0,0,0,0,2,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,4,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,1 +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,0,0,0,0,0,0,0,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,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,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,2,0,0,0,0,0,0,0,1,1,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,1,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,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,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,1,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,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,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,0,0,0,1,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,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,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,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,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,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,3,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,0,0,0,0,0,1,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,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,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,1,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,1,0,0,0,0,2,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,2,0,1,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,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,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,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,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,1 +0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,0,0,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,2,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,1,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,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,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,1,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,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,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,0,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,1,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,1 +0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,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,0,0,0,0,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,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,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,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,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,1,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,1,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,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,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,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,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,1,3,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,1,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,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,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,1,0,0,0,0,0,0,1,0,0,1,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,2,3,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,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,1,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,1,0,1,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,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,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,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,0,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,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,1,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,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1 +0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,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,2,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,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,0,1,0,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,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,1,0,0,0,0,0,0,1,1,0,0,0,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,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,1 +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,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,2,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,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,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,1 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,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,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,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,2,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,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,1,0,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,4,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,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,1 +0,0,0,0,0,0,0,0,1,0,0,0,2,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,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,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 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,1,0,0,0,2,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0 +0,0,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,2,0,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,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0 +0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,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,1,0,0,0,0,1,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,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,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,1,2,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,1,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,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,1,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,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,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,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,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0 +0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,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,1,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,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,1,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,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,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,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,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,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,1,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,1,0,0,0,0,0,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,1,0,0,0,0,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,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,1,0,0,0,0,0,0,0,0,0,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,0,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,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,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,0,0,0,0,0 +0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,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,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,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,0,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,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,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,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,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,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,2,1,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,1,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,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,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,1,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,1,1,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,1,0,0,0,0,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,0,0,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,1,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,2,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,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,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,0,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,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,1,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,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,0,2,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,3,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,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,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,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,0,1,0,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,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,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,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,2,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,1,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,2,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,2,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,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,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,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,1,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,1,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,1,0,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,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,1,1,0,0,0,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,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,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,2,0,1,1,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,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,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,1,0,0,0,0,0,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,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,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,1,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,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,1,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,0,0,0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,2,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,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,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,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,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,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,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,0,0 +0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,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,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,2,0,0,1,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,0,0,0,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,1,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,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,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,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,1,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,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,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,0,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,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,0,0,0 +0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,3,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,1,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,2,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,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,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,0,0,0,0,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,1,0,0,0,0,0,0,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,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,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 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,4,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,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,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,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,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,1,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,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,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,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,1,0,0,1,0,1,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,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,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,0,0,0,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,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,0,2,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,4,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,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,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,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,1,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,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,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,0,0,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,2,0,0,0,0,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,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,1,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,0,0,0,0,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,2,0,0,0,0,0,0,1,0,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,2,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,1,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,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,1,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,1,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,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,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,0,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,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,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,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,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,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,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,0,0,0,0 +0,0,0,0,0,0,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,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,2,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,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,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,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,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,0,0,0,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,0 +0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,1,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,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,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,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,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,2,0,0,0,0,0,1,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 +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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,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,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,3,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,1,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,1,0,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,1,0,0,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,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,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,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,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,1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,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,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,1,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,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,1,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,1,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,1,4,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,0,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,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,1,1,1,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,1,0,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,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,1,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,1,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,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,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,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,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,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,1,0,0,0,0,2,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,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,1,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,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,3,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,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,1,0,0,0,0,1,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,1,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,1,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,0,0,0,0,0,0,0,0,5,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,1,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,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,2,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,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,3,1,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,4,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,1,1,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,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,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,1,0,0,0,0,0,0,1,0,0,0,0,0,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,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,1,0,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,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,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,1,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,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,1,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,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,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,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,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,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,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,1,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,3,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,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,2,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,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,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,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,2,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,1,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,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,0,0,0,0,0,0,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,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,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,1,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,5,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,2,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,1,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,0,0,0,0,0,0,0,0,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,3,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,1,0,0,0,1,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,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,0,0,0,0,0,0,0,0 +0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,5,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,0,0,0,0,0,0,0,0,0,1,0,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,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,2,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,0,0,0,0,0,0,0,0,0,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,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,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,1,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,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,3,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,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,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,0,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,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,1,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,1,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,1,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,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,1,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,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,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,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,1,3,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,2,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,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,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,1,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,1,1,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,0,0,0,0,0,0,0,0,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,1,0,2,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,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,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,1,0,0,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,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,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,1,1,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,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,1,0,0,0,0,0,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,0,0,0,0,0,1,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,4,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,1,0,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,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,3,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,4,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,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,2,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,1,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,2,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,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,1,0,0,0,3,3,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,2,0,0,0,0,0,0,0,0,2,1,1,0,0,0,0,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,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,2,0,0,1,0,1,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,0,0,0,0,0,0,0,0,0,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,0,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,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,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,1,0,0,0,0,0,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,0,1,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,2,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,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,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,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,1,0,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,1,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,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,0,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,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,1,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,2,0,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,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,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,0,0,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,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,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,1,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,2,0,0,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,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,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,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,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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 +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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,0,0,0,0,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,3,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,5,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,0,0,0,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,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,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,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,0,0,0,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,1,3,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,1,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,0,0,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,1,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,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,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,1,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,0,0,0,0,0,0,0,0,0,0,1,0,1,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,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,3,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,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,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,0,0,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,0,0,0,0,2,0,0,0,1,0,2,3,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,1,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,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,3,0,0,1,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,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,1,0,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,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,1,4,0,0,0,0,0,1,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,2,1,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,2,0,0,2,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,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,1,1,0,1,0,0,0,0,0,0,0,3,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,1,0,0,0,0,0,0,0,0,0,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,0,1,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,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,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,3,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,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,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,2,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,1,0,0,0,0,0,0,0,0,0 +0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0 +0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,1,1,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,1,1,0,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,0,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,4,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,1,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,3,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,0,0,0,0,0,1,2,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,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,0,0,1,4,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,1,0,0,1,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,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,2,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,2,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,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,1,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,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,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,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,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,1,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,1,1,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,1,0,1,0,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,1,0,0,0,0,0,0,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,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,2,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,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,1,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,0,1,0,1,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,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,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,1,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,2,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,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,0,0,0,0,1,0,0,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,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,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,0,0,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,2,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,0,0,0,0,0,0,0,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,1,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,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,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,0,0,0,0,0,0,0,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,3,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,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,1,0,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,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,1,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,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,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,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,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,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,1,0,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,1,3,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,2,1,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,0,1,0,0,0,0,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,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,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,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,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,5,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,1,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,1,0,0,0,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,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,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,0,0,0,0,0,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,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,0,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,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,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,1,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,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,1,1,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,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,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,2,0,0,0,0,0,0,0,0,1,0,0,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,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,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,1,1,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,1,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,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,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,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,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,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,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,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,1,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,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,3,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,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,1,0,0,0,0,0,0,0,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,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,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,2,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,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,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,2,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0 +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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0 +0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,2,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,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,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,1,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,2,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,0,0,0,0,0,0,0,0,0,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,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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 +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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,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,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,1,0,0,0,0,0,0,5,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,5,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,1,0,0,0,0,0,0,1,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,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,1,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,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,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,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,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,1,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,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,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,0,0,0,0,0 +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,2,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,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,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,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,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,2,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,1,0,0,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,1,0,0,0,0,0,0,1,0,0,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,1,0,0,0,0,0,0,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,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,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,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1,2,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,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,1,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,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,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,1,0,2,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,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,2,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,4,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,2,1,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,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 +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,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,3,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,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,1,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,2,0,0,1,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,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,1,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,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,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,1,1,0,0,0,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,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,0,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,1,0,2,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,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,4,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,0,0,0 +0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,2,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,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,0,0,0,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,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,0,0,1,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,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,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 +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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,2,2,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,2,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,0,0,0,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,1,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,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,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,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,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,2,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,0,0,0,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,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,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,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,0,0,0,0,1,1,3,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,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,1,0,0,0,0,1,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,3,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,1,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,1,0,0,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,0,0,0,0,0,0,0,0,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,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,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,1,0,0,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,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,1,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,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,0,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,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,0,0,0,0,0,0,0,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,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,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,0,0,1,0,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,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,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,0,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,2,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,1,2,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,2,4,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,1,0,0,0,0,0,0,0,0,0,1,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,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,2,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,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,0,0,0,0,0,0,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,3,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,1,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,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,2,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,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,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,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,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,1,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,2,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,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,1,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,2,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,2,0,0,1,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,2,0,2,0,0,0,1,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,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,0,0,0,0,0,0,0,0,0,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,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,0,0,1,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,1,1,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,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,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,1,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,1,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,2,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,1,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,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,0,0,0,0,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,2,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,1,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,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,1,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,1,0,0,0,1,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,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,2,0,0,0,0,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,0,0,1,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,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,0,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,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,1,0,1,0,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,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,1,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,1,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,2,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,4,0,1,0,0,0,3,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1,2,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,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,0,0,0,0,0,0,0,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,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,1,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,1,0,0,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,2,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,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,4,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,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,0,0,0,0,0,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,2,0,0,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,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,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,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,1,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,1,0,1,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,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,0,0,0,0,4,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,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0 +0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,1,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,1,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,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,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,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,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,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,1,0,0,0,0,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,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,0,1,0,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,1,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,1,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,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,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0 +0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,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,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,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,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,1,0,0,0,0,0,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,6,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,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,0,0,0,0,0,0,0,0,5,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,1,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,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,0,0,0,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,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,1,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,1,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,1,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,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,0,0,0,0,0,0,0,0,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,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,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,1,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,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,1,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,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,1,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,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,1,0,0,0,0,1,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,1,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,0,0,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,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,0,0,0,0,0,0,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,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,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,1,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,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,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,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,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,0,0,0,0,0,0,1,0,0,0,0,0,0,1,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,0,0,0,1,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,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,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,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,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,1,0,0,0,0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,1,4,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,4,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,2,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,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,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,0,0,0,2,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,1,0,0,0,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,0,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1,2,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,1,0,0,4,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,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,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,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,1,0,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,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,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,1,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,0,0,1,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,1,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,1,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,1,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,2,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,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,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,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,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,1,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,1,0,0,0,0 +0,0,0,0,0,0,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,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,2,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,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,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,2,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,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,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,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,1,0,0,0,0,0,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,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,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,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,2,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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 +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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,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,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,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,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,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,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,0,0,0,0,0,0,0,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,1,0,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,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,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,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,1,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,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,2,3,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,1,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,2,1,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,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,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,2,0,0,0,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,0,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,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,2,0,0,0,0,0,0,0,1,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,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,3,0,1,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,1,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,0,0,0,0,0,0,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,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,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,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 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,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,0,1,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,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,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,1,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,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,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,0,0,0,0,0,0,0,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,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,0,0,0,0,0,0,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,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,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,0,0,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,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,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,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,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,1,0,0,0,0,0,0 +0,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,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,2,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,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,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,2,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,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,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,1,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,4,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,0,0,0,0,0,0,0,0,2,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,1,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,1,0,0,0,0,0,1,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,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,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,0,0,0,0,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,0,0,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,1,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,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,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,1,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,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,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,2,1,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,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,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,1,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,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,3,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,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,1,0,0,0,0 +0,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,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,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,3,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0 +0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,0,0,0,0,0,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,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,1,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,1,0,1,1,1,0,0,0,0,2,0,0,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,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,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,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,0,0,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,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,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,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,3,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,1,0,0,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,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,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,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,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,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,1,0,0,0,0,0,0,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,0,0,1,0,0,0,0,1,0,0,0,0,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,3,0,0,0,0,0,4,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,1,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,1,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,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,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,2,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,0,0,0,0,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,0,0,0,0,0,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,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,1,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,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,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,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,3,0,0,0,0,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,1,0,0,0,0,0,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,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,2,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,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,1,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,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,1,0,0,0,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,2,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,0,0,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,1,0,0,0,0,0,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,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,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,3,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,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,2,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,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,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,1,0,0,0,0,0,0,0,0,1,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,3,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,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,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,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,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,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,1,0,0,0,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,1,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,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,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,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,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,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,0,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,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,0,0,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,1,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,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,1,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,0,0,0,0,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,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,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,1,0,0,0,0,0,0,2,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,1,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,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,4,0,0,0,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,1,1,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,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,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,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,1,0,0,0,0,0,0,0,0,0,0,1,3,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,1,0,0,0,0,0,0,1,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,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,1,0,1,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,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,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,2,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,1,0,0,0,0,0,0,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,2,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,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,0,0,0,0,0,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,1,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,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,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,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,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,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,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,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,3,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,1,0,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,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,0,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,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,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,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,0,0,0,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,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,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,0,0,0,0,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,1,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,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,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,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,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,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,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,0,0,0,0,0,0,0,0,0,0,0,1,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,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,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,2,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,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,1,1,1,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,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,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,3,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,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,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,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,1,3,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,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,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,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,1,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,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,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,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,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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,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,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,1,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,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,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,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,0,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,0,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,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,0,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,0,0,0,0,0,0,0,0,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,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,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,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,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,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,1,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,1,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,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,1,0,0,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,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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 +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,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,1,0,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/frontend/.babelrc b/frontend/.babelrc new file mode 100755 index 0000000..fda5885 --- /dev/null +++ b/frontend/.babelrc @@ -0,0 +1,36 @@ +{ + "presets": [ + [ + "vue" + ], + [ + "@babel/preset-env", + { + "modules": false, + "targets": { + "browsers": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] + } + } + ] + ], + "plugins": [ + "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-syntax-import-meta", + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-json-strings", + [ + "@babel/plugin-proposal-decorators", + { + "legacy": true + } + ], + "@babel/plugin-proposal-function-sent", + "@babel/plugin-proposal-export-namespace-from", + "@babel/plugin-proposal-numeric-separator", + "@babel/plugin-proposal-throw-expressions" + ] +} diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100755 index 0000000..9d08a1a --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/frontend/.eslintignore b/frontend/.eslintignore new file mode 100755 index 0000000..e1fcc9c --- /dev/null +++ b/frontend/.eslintignore @@ -0,0 +1,4 @@ +/build/ +/config/ +/dist/ +/*.js diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js new file mode 100755 index 0000000..22fdce8 --- /dev/null +++ b/frontend/.eslintrc.js @@ -0,0 +1,29 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint' + }, + env: { + browser: true, + }, + extends: [ + // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention + // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. + 'plugin:vue/essential', + // https://github.com/standard/standard/blob/master/docs/RULES-en.md + 'standard' + ], + // required to lint *.vue files + plugins: [ + 'vue' + ], + // add your custom rules here + rules: { + // allow async-await + 'generator-star-spacing': 'off', + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' + } +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100755 index 0000000..541a820 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,14 @@ +.DS_Store +node_modules/ +/dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/frontend/.postcssrc.js b/frontend/.postcssrc.js new file mode 100755 index 0000000..eee3e92 --- /dev/null +++ b/frontend/.postcssrc.js @@ -0,0 +1,10 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + "postcss-import": {}, + "postcss-url": {}, + // to edit target browsers: use "browserslist" field in package.json + "autoprefixer": {} + } +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100755 index 0000000..ec824cc --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,21 @@ +# istacking + +> ISOVIS Group + +## Build Setup + +``` bash +# install dependencies +npm install + +# serve with hot reload at localhost:8080 +npm run dev + +# build for production with minification +npm run build + +# build for production and view the bundle analyzer report +npm run build --report +``` + +For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). diff --git a/frontend/build/build.js b/frontend/build/build.js new file mode 100755 index 0000000..8f2ad8a --- /dev/null +++ b/frontend/build/build.js @@ -0,0 +1,41 @@ +'use strict' +require('./check-versions')() + +process.env.NODE_ENV = 'production' + +const ora = require('ora') +const rm = require('rimraf') +const path = require('path') +const chalk = require('chalk') +const webpack = require('webpack') +const config = require('../config') +const webpackConfig = require('./webpack.prod.conf') + +const spinner = ora('building for production...') +spinner.start() + +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { + if (err) throw err + webpack(webpackConfig, (err, stats) => { + spinner.stop() + if (err) throw err + process.stdout.write(stats.toString({ + colors: true, + modules: false, + children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. + chunks: false, + chunkModules: false + }) + '\n\n') + + if (stats.hasErrors()) { + console.log(chalk.red(' Build failed with errors.\n')) + process.exit(1) + } + + console.log(chalk.cyan(' Build complete.\n')) + console.log(chalk.yellow( + ' Tip: built files are meant to be served over an HTTP server.\n' + + ' Opening index.html over file:// won\'t work.\n' + )) + }) +}) diff --git a/frontend/build/check-versions.js b/frontend/build/check-versions.js new file mode 100755 index 0000000..3ef972a --- /dev/null +++ b/frontend/build/check-versions.js @@ -0,0 +1,54 @@ +'use strict' +const chalk = require('chalk') +const semver = require('semver') +const packageConfig = require('../package.json') +const shell = require('shelljs') + +function exec (cmd) { + return require('child_process').execSync(cmd).toString().trim() +} + +const versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + } +] + +if (shell.which('npm')) { + versionRequirements.push({ + name: 'npm', + currentVersion: exec('npm --version'), + versionRequirement: packageConfig.engines.npm + }) +} + +module.exports = function () { + const warnings = [] + + for (let i = 0; i < versionRequirements.length; i++) { + const mod = versionRequirements[i] + + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push(mod.name + ': ' + + chalk.red(mod.currentVersion) + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log(chalk.yellow('To use this template, you must update following to modules:')) + console.log() + + for (let i = 0; i < warnings.length; i++) { + const warning = warnings[i] + console.log(' ' + warning) + } + + console.log() + process.exit(1) + } +} diff --git a/frontend/build/logo.png b/frontend/build/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 zcmaKRcUV(fvo}bjDT-7nLI_nlK}sT_69H+`qzVWDA|yaU?}j417wLi^B1KB1SLsC& zL0ag7$U(XW5YR7p&Ux?sP$d4lvMt8C^+TcQu4F zQqv!UF!I+kw)c0jhd6+g6oCr9P?7)?!qX1ui*iL{p}sKCAGuJ{{W)0z1pLF|=>h}& zt(2Lr0Z`2ig8<5i%Zk}cO5Fm=LByqGWaS`oqChZdEFmc`0hSb#gg|Aap^{+WKOYcj zHjINK)KDG%&s?Mt4CL(T=?;~U@bU2x_mLKN!#GJuK_CzbNw5SMEJorG!}_5;?R>@1 zSl)jns3WlU7^J%=(hUtfmuUCU&C3%8B5C^f5>W2Cy8jW3#{Od{lF1}|?c61##3dzA zsPlFG;l_FzBK}8>|H_Ru_H#!_7$UH4UKo3lKOA}g1(R&|e@}GINYVzX?q=_WLZCgh z)L|eJMce`D0EIwgRaNETDsr+?vQknSGAi=7H00r`QnI%oQnFxm`G2umXso9l+8*&Q z7WqF|$p49js$mdzo^BXpH#gURy=UO;=IMrYc5?@+sR4y_?d*~0^YP7d+y0{}0)zBM zIKVM(DBvICK#~7N0a+PY6)7;u=dutmNqK3AlsrUU9U`d;msiucB_|8|2kY=(7XA;G zwDA8AR)VCA#JOkxm#6oHNS^YVuOU;8p$N)2{`;oF|rQ?B~K$%rHDxXs+_G zF5|-uqHZvSzq}L;5Kcy_P+x0${33}Ofb6+TX&=y;;PkEOpz%+_bCw_{<&~ zeLV|!bP%l1qxywfVr9Z9JI+++EO^x>ZuCK);=$VIG1`kxK8F2M8AdC$iOe3cj1fo(ce4l-9 z7*zKy3={MixvUk=enQE;ED~7tv%qh&3lR<0m??@w{ILF|e#QOyPkFYK!&Up7xWNtL zOW%1QMC<3o;G9_S1;NkPB6bqbCOjeztEc6TsBM<(q9((JKiH{01+Ud=uw9B@{;(JJ z-DxI2*{pMq`q1RQc;V8@gYAY44Z!%#W~M9pRxI(R?SJ7sy7em=Z5DbuDlr@*q|25V)($-f}9c#?D%dU^RS<(wz?{P zFFHtCab*!rl(~j@0(Nadvwg8q|4!}L^>d?0al6}Rrv9$0M#^&@zjbfJy_n!%mVHK4 z6pLRIQ^Uq~dnyy$`ay51Us6WaP%&O;@49m&{G3z7xV3dLtt1VTOMYl3UW~Rm{Eq4m zF?Zl_v;?7EFx1_+#WFUXxcK78IV)FO>42@cm@}2I%pVbZqQ}3;p;sDIm&knay03a^ zn$5}Q$G!@fTwD$e(x-~aWP0h+4NRz$KlnO_H2c< z(XX#lPuW_%H#Q+c&(nRyX1-IadKR-%$4FYC0fsCmL9ky3 zKpxyjd^JFR+vg2!=HWf}2Z?@Td`0EG`kU?{8zKrvtsm)|7>pPk9nu@2^z96aU2<#` z2QhvH5w&V;wER?mopu+nqu*n8p~(%QkwSs&*0eJwa zMXR05`OSFpfyRb!Y_+H@O%Y z0=K^y6B8Gcbl?SA)qMP3Z+=C(?8zL@=74R=EVnE?vY!1BQy2@q*RUgRx4yJ$k}MnL zs!?74QciNb-LcG*&o<9=DSL>1n}ZNd)w1z3-0Pd^4ED1{qd=9|!!N?xnXjM!EuylY z5=!H>&hSofh8V?Jofyd!h`xDI1fYAuV(sZwwN~{$a}MX^=+0TH*SFp$vyxmUv7C*W zv^3Gl0+eTFgBi3FVD;$nhcp)ka*4gSskYIqQ&+M}xP9yLAkWzBI^I%zR^l1e?bW_6 zIn{mo{dD=)9@V?s^fa55jh78rP*Ze<3`tRCN4*mpO$@7a^*2B*7N_|A(Ve2VB|)_o z$=#_=aBkhe(ifX}MLT()@5?OV+~7cXC3r!%{QJxriXo9I%*3q4KT4Xxzyd{ z9;_%=W%q!Vw$Z7F3lUnY+1HZ*lO;4;VR2+i4+D(m#01OYq|L_fbnT;KN<^dkkCwtd zF7n+O7KvAw8c`JUh6LmeIrk4`F3o|AagKSMK3))_5Cv~y2Bb2!Ibg9BO7Vkz?pAYX zoI=B}+$R22&IL`NCYUYjrdhwjnMx_v=-Qcx-jmtN>!Zqf|n1^SWrHy zK|MwJ?Z#^>)rfT5YSY{qjZ&`Fjd;^vv&gF-Yj6$9-Dy$<6zeP4s+78gS2|t%Z309b z0^fp~ue_}i`U9j!<|qF92_3oB09NqgAoehQ`)<)dSfKoJl_A6Ec#*Mx9Cpd-p#$Ez z={AM*r-bQs6*z$!*VA4|QE7bf@-4vb?Q+pPKLkY2{yKsw{&udv_2v8{Dbd zm~8VAv!G~s)`O3|Q6vFUV%8%+?ZSVUa(;fhPNg#vab@J*9XE4#D%)$UU-T5`fwjz! z6&gA^`OGu6aUk{l*h9eB?opVdrHK>Q@U>&JQ_2pR%}TyOXGq_6s56_`U(WoOaAb+K zXQr#6H}>a-GYs9^bGP2Y&hSP5gEtW+GVC4=wy0wQk=~%CSXj=GH6q z-T#s!BV`xZVxm{~jr_ezYRpqqIcXC=Oq`b{lu`Rt(IYr4B91hhVC?yg{ol4WUr3v9 zOAk2LG>CIECZ-WIs0$N}F#eoIUEtZudc7DPYIjzGqDLWk_A4#(LgacooD z2K4IWs@N`Bddm-{%oy}!k0^i6Yh)uJ1S*90>|bm3TOZxcV|ywHUb(+CeX-o1|LTZM zwU>dY3R&U)T(}5#Neh?-CWT~@{6Ke@sI)uSuzoah8COy)w)B)aslJmp`WUcjdia-0 zl2Y}&L~XfA`uYQboAJ1;J{XLhYjH){cObH3FDva+^8ioOQy%Z=xyjGLmWMrzfFoH; zEi3AG`_v+%)&lDJE;iJWJDI@-X9K5O)LD~j*PBe(wu+|%ar~C+LK1+-+lK=t# z+Xc+J7qp~5q=B~rD!x78)?1+KUIbYr^5rcl&tB-cTtj+e%{gpZZ4G~6r15+d|J(ky zjg@@UzMW0k9@S#W(1H{u;Nq(7llJbq;;4t$awM;l&(2s+$l!Ay9^Ge|34CVhr7|BG z?dAR83smef^frq9V(OH+a+ki#q&-7TkWfFM=5bsGbU(8mC;>QTCWL5ydz9s6k@?+V zcjiH`VI=59P-(-DWXZ~5DH>B^_H~;4$)KUhnmGo*G!Tq8^LjfUDO)lASN*=#AY_yS zqW9UX(VOCO&p@kHdUUgsBO0KhXxn1sprK5h8}+>IhX(nSXZKwlNsjk^M|RAaqmCZB zHBolOHYBas@&{PT=R+?d8pZu zUHfyucQ`(umXSW7o?HQ3H21M`ZJal+%*)SH1B1j6rxTlG3hx1IGJN^M7{$j(9V;MZ zRKybgVuxKo#XVM+?*yTy{W+XHaU5Jbt-UG33x{u(N-2wmw;zzPH&4DE103HV@ER86 z|FZEmQb|&1s5#`$4!Cm}&`^{(4V}OP$bk`}v6q6rm;P!H)W|2i^e{7lTk2W@jo_9q z*aw|U7#+g59Fv(5qI`#O-qPj#@_P>PC#I(GSp3DLv7x-dmYK=C7lPF8a)bxb=@)B1 zUZ`EqpXV2dR}B&r`uM}N(TS99ZT0UB%IN|0H%DcVO#T%L_chrgn#m6%x4KE*IMfjX zJ%4veCEqbXZ`H`F_+fELMC@wuy_ch%t*+Z+1I}wN#C+dRrf2X{1C8=yZ_%Pt6wL_~ zZ2NN-hXOT4P4n$QFO7yYHS-4wF1Xfr-meG9Pn;uK51?hfel`d38k{W)F*|gJLT2#T z<~>spMu4(mul-8Q3*pf=N4DcI)zzjqAgbE2eOT7~&f1W3VsdD44Ffe;3mJp-V@8UC z)|qnPc12o~$X-+U@L_lWqv-RtvB~%hLF($%Ew5w>^NR82qC_0FB z)=hP1-OEx?lLi#jnLzH}a;Nvr@JDO-zQWd}#k^an$Kwml;MrD&)sC5b`s0ZkVyPkb zt}-jOq^%_9>YZe7Y}PhW{a)c39G`kg(P4@kxjcYfgB4XOOcmezdUI7j-!gs7oAo2o zx(Ph{G+YZ`a%~kzK!HTAA5NXE-7vOFRr5oqY$rH>WI6SFvWmahFav!CfRMM3%8J&c z*p+%|-fNS_@QrFr(at!JY9jCg9F-%5{nb5Bo~z@Y9m&SHYV`49GAJjA5h~h4(G!Se zZmK{Bo7ivCfvl}@A-ptkFGcWXAzj3xfl{evi-OG(TaCn1FAHxRc{}B|x+Ua1D=I6M z!C^ZIvK6aS_c&(=OQDZfm>O`Nxsw{ta&yiYPA~@e#c%N>>#rq)k6Aru-qD4(D^v)y z*>Rs;YUbD1S8^D(ps6Jbj0K3wJw>L4m)0e(6Pee3Y?gy9i0^bZO?$*sv+xKV?WBlh zAp*;v6w!a8;A7sLB*g-^<$Z4L7|5jXxxP1}hQZ<55f9<^KJ>^mKlWSGaLcO0=$jem zWyZkRwe~u{{tU63DlCaS9$Y4CP4f?+wwa(&1ou)b>72ydrFvm`Rj-0`kBJgK@nd(*Eh!(NC{F-@=FnF&Y!q`7){YsLLHf0_B6aHc# z>WIuHTyJwIH{BJ4)2RtEauC7Yq7Cytc|S)4^*t8Va3HR zg=~sN^tp9re@w=GTx$;zOWMjcg-7X3Wk^N$n;&Kf1RgVG2}2L-(0o)54C509C&77i zrjSi{X*WV=%C17((N^6R4Ya*4#6s_L99RtQ>m(%#nQ#wrRC8Y%yxkH;d!MdY+Tw@r zjpSnK`;C-U{ATcgaxoEpP0Gf+tx);buOMlK=01D|J+ROu37qc*rD(w`#O=3*O*w9?biwNoq3WN1`&Wp8TvKj3C z3HR9ssH7a&Vr<6waJrU zdLg!ieYz%U^bmpn%;(V%%ugMk92&?_XX1K@mwnVSE6!&%P%Wdi7_h`CpScvspMx?N zQUR>oadnG17#hNc$pkTp+9lW+MBKHRZ~74XWUryd)4yd zj98$%XmIL4(9OnoeO5Fnyn&fpQ9b0h4e6EHHw*l68j;>(ya`g^S&y2{O8U>1*>4zR zq*WSI_2o$CHQ?x0!wl9bpx|Cm2+kFMR)oMud1%n2=qn5nE&t@Fgr#=Zv2?}wtEz^T z9rrj=?IH*qI5{G@Rn&}^Z{+TW}mQeb9=8b<_a`&Cm#n%n~ zU47MvCBsdXFB1+adOO)03+nczfWa#vwk#r{o{dF)QWya9v2nv43Zp3%Ps}($lA02*_g25t;|T{A5snSY?3A zrRQ~(Ygh_ebltHo1VCbJb*eOAr;4cnlXLvI>*$-#AVsGg6B1r7@;g^L zFlJ_th0vxO7;-opU@WAFe;<}?!2q?RBrFK5U{*ai@NLKZ^};Ul}beukveh?TQn;$%9=R+DX07m82gP$=}Uo_%&ngV`}Hyv8g{u z3SWzTGV|cwQuFIs7ZDOqO_fGf8Q`8MwL}eUp>q?4eqCmOTcwQuXtQckPy|4F1on8l zP*h>d+cH#XQf|+6c|S{7SF(Lg>bR~l(0uY?O{OEVlaxa5@e%T&xju=o1`=OD#qc16 zSvyH*my(dcp6~VqR;o(#@m44Lug@~_qw+HA=mS#Z^4reBy8iV?H~I;{LQWk3aKK8$bLRyt$g?- { + const notifier = require('node-notifier') + + return (severity, errors) => { + if (severity !== 'error') return + + const error = errors[0] + const filename = error.file && error.file.split('!').pop() + + notifier.notify({ + title: packageConfig.name, + message: severity + ': ' + error.name, + subtitle: filename || '', + icon: path.join(__dirname, 'logo.png') + }) + } +} diff --git a/frontend/build/vue-loader.conf.js b/frontend/build/vue-loader.conf.js new file mode 100755 index 0000000..33ed58b --- /dev/null +++ b/frontend/build/vue-loader.conf.js @@ -0,0 +1,22 @@ +'use strict' +const utils = require('./utils') +const config = require('../config') +const isProduction = process.env.NODE_ENV === 'production' +const sourceMapEnabled = isProduction + ? config.build.productionSourceMap + : config.dev.cssSourceMap + +module.exports = { + loaders: utils.cssLoaders({ + sourceMap: sourceMapEnabled, + extract: isProduction + }), + cssSourceMap: sourceMapEnabled, + cacheBusting: config.dev.cacheBusting, + transformToRequire: { + video: ['src', 'poster'], + source: 'src', + img: 'src', + image: 'xlink:href' + } +} diff --git a/frontend/build/webpack.base.conf.js b/frontend/build/webpack.base.conf.js new file mode 100755 index 0000000..e03c729 --- /dev/null +++ b/frontend/build/webpack.base.conf.js @@ -0,0 +1,95 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const config = require('../config') +const vueLoaderConfig = require('./vue-loader.conf') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +const createLintingRule = () => ({ + test: /\.(js|vue)$/, + loader: 'eslint-loader', + enforce: 'pre', + include: [resolve('src'), resolve('test')], + options: { + formatter: require('eslint-friendly-formatter'), + emitWarning: !config.dev.showEslintErrorsInOverlay + } +}) + +const { VueLoaderPlugin } = require("vue-loader"); + +module.exports = { + context: path.resolve(__dirname, '../'), + entry: { + app: './src/main.js' + }, + plugins: [new VueLoaderPlugin()], + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath, + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + 'vue$': 'vue/dist/vue.esm.js', + '@': resolve('src'), + } + }, + module: { + rules: [ + ...(config.dev.useEslint ? [createLintingRule()] : []), + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + { + test: /\.js$/, + loader: 'babel-loader', + include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('img/[name].[hash:7].[ext]') + } + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('media/[name].[hash:7].[ext]') + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + } + ] + }, + node: { + // prevent webpack from injecting useless setImmediate polyfill because Vue + // source contains it (although only uses it if it's native). + setImmediate: false, + // prevent webpack from injecting mocks to Node native modules + // that does not make sense for the client + dgram: 'empty', + fs: 'empty', + net: 'empty', + tls: 'empty', + child_process: 'empty' + } +} diff --git a/frontend/build/webpack.dev.conf.js b/frontend/build/webpack.dev.conf.js new file mode 100755 index 0000000..070ae22 --- /dev/null +++ b/frontend/build/webpack.dev.conf.js @@ -0,0 +1,95 @@ +'use strict' +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const path = require('path') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') +const portfinder = require('portfinder') + +const HOST = process.env.HOST +const PORT = process.env.PORT && Number(process.env.PORT) + +const devWebpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) + }, + // cheap-module-eval-source-map is faster for development + devtool: config.dev.devtool, + + // these devServer options should be customized in /config/index.js + devServer: { + clientLogLevel: 'warning', + historyApiFallback: { + rewrites: [ + { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, + ], + }, + hot: true, + contentBase: false, // since we use CopyWebpackPlugin. + compress: true, + host: HOST || config.dev.host, + port: PORT || config.dev.port, + open: config.dev.autoOpenBrowser, + overlay: config.dev.errorOverlay + ? { warnings: false, errors: true } + : false, + publicPath: config.dev.assetsPublicPath, + proxy: config.dev.proxyTable, + quiet: true, // necessary for FriendlyErrorsPlugin + watchOptions: { + poll: config.dev.poll, + } + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': require('../config/dev.env') + }), + new webpack.HotModuleReplacementPlugin(), + new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. + new webpack.NoEmitOnErrorsPlugin(), + // https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true + }), + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.dev.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +module.exports = new Promise((resolve, reject) => { + portfinder.basePort = process.env.PORT || config.dev.port + portfinder.getPort((err, port) => { + if (err) { + reject(err) + } else { + // publish the new Port, necessary for e2e tests + process.env.PORT = port + // add port to devServer config + devWebpackConfig.devServer.port = port + + // Add FriendlyErrorsPlugin + devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ + compilationSuccessInfo: { + messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], + }, + onErrors: config.dev.notifyOnErrors + ? utils.createNotifierCallback() + : undefined + })) + + resolve(devWebpackConfig) + } + }) +}) diff --git a/frontend/build/webpack.prod.conf.js b/frontend/build/webpack.prod.conf.js new file mode 100755 index 0000000..d9f99f6 --- /dev/null +++ b/frontend/build/webpack.prod.conf.js @@ -0,0 +1,145 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') +const UglifyJsPlugin = require('uglifyjs-webpack-plugin') + +const env = require('../config/prod.env') + +const webpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true, + usePostCSS: true + }) + }, + devtool: config.build.productionSourceMap ? config.build.devtool : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[chunkhash].js'), + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') + }, + plugins: [ + // http://vuejs.github.io/vue-loader/en/workflow/production.html + new webpack.DefinePlugin({ + 'process.env': env + }), + new UglifyJsPlugin({ + uglifyOptions: { + compress: { + warnings: false + } + }, + sourceMap: config.build.productionSourceMap, + parallel: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: utils.assetsPath('css/[name].[contenthash].css'), + // Setting the following option to `false` will not extract CSS from codesplit chunks. + // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. + // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, + // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 + allChunks: true, + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: config.build.productionSourceMap + ? { safe: true, map: { inline: false } } + : { safe: true } + }), + // generate dist index.html with correct asset hash for caching. + // you can customize output by editing /index.html + // see https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: config.build.index, + template: 'index.html', + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + // necessary to consistently work with multiple chunks via CommonsChunkPlugin + chunksSortMode: 'dependency' + }), + // keep module.id stable when vendor modules does not change + new webpack.HashedModuleIdsPlugin(), + // enable scope hoisting + new webpack.optimize.ModuleConcatenationPlugin(), + // split vendor js into its own file + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks (module) { + // any required modules inside node_modules are extracted to vendor + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, '../node_modules') + ) === 0 + ) + } + }), + // extract webpack runtime and module manifest to its own file in order to + // prevent vendor hash from being updated whenever app bundle is updated + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + minChunks: Infinity + }), + // This instance extracts shared chunks from code splitted chunks and bundles them + // in a separate chunk, similar to the vendor chunk + // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk + new webpack.optimize.CommonsChunkPlugin({ + name: 'app', + async: 'vendor-async', + children: true, + minChunks: 3 + }), + + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +if (config.build.productionGzip) { + const CompressionWebpackPlugin = require('compression-webpack-plugin') + + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: new RegExp( + '\\.(' + + config.build.productionGzipExtensions.join('|') + + ')$' + ), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) +} + +module.exports = webpackConfig diff --git a/frontend/config/dev.env.js b/frontend/config/dev.env.js new file mode 100755 index 0000000..1e22973 --- /dev/null +++ b/frontend/config/dev.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const prodEnv = require('./prod.env') + +module.exports = merge(prodEnv, { + NODE_ENV: '"development"' +}) diff --git a/frontend/config/index.js b/frontend/config/index.js new file mode 100755 index 0000000..92b6273 --- /dev/null +++ b/frontend/config/index.js @@ -0,0 +1,75 @@ +'use strict' +// Template version: 1.3.1 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + dev: { + + // Paths + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: {}, + + // Various Dev Server settings + host: 'localhost', // can be overwritten by process.env.HOST + port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined + autoOpenBrowser: false, + errorOverlay: true, + notifyOnErrors: true, + poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- + + // Use Eslint Loader? + // If true, your code will be linted during bundling and + // linting errors and warnings will be shown in the console. + useEslint: true, + // If true, eslint errors and warnings will also be shown in the error overlay + // in the browser. + showEslintErrorsInOverlay: false, + + /** + * Source Maps + */ + + // https://webpack.js.org/configuration/devtool/#development + devtool: 'cheap-module-eval-source-map', + + // If you have problems debugging vue-files in devtools, + // set this to false - it *may* help + // https://vue-loader.vuejs.org/en/options.html#cachebusting + cacheBusting: true, + + cssSourceMap: true + }, + + build: { + // Template for index.html + index: path.resolve(__dirname, '../../dist/index.html'), + + assetsRoot: path.resolve(__dirname, '../../dist'), + assetsSubDirectory: 'static', + assetsPublicPath: '/', + + /** + * Source Maps + */ + + productionSourceMap: true, + // https://webpack.js.org/configuration/devtool/#production + devtool: '#source-map', + + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report + } +} diff --git a/frontend/config/prod.env.js b/frontend/config/prod.env.js new file mode 100755 index 0000000..a6f9976 --- /dev/null +++ b/frontend/config/prod.env.js @@ -0,0 +1,4 @@ +'use strict' +module.exports = { + NODE_ENV: '"production"' +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100755 index 0000000..8c3401b --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + HyperSearVis + + +
    + + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..f031819 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,27807 @@ +{ + "name": "istacking", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "3d-view": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.0.tgz", + "integrity": "sha1-gxrpQtdQjFCAHj4G+v4ejFdOF74=", + "requires": { + "matrix-camera-controller": "^2.1.1", + "orbit-camera-controller": "^4.0.0", + "turntable-camera-controller": "^3.0.0" + } + }, + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/compat-data": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", + "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.8.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", + "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001027", + "electron-to-chromium": "^1.3.349", + "node-releases": "^1.1.49" + } + }, + "caniuse-lite": { + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", + "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.359", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.359.tgz", + "integrity": "sha512-ewZp4BQftbLclBwmFYoTrlyiLMXQTiYeqh1hn24sWao9bGhUHzQtpytymN8JsenWlQ9SbBWynTPvfghb0Ipn1Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/core": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", + "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.4", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-call-delegate": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", + "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", + "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "browserslist": "^4.8.5", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.8.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", + "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001027", + "electron-to-chromium": "^1.3.349", + "node-releases": "^1.1.49" + } + }, + "caniuse-lite": { + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", + "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.359", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.359.tgz", + "integrity": "sha512-ewZp4BQftbLclBwmFYoTrlyiLMXQTiYeqh1hn24sWao9bGhUHzQtpytymN8JsenWlQ9SbBWynTPvfghb0Ipn1Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", + "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", + "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", + "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", + "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", + "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", + "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helpers": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", + "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "requires": { + "@babel/types": "^7.8.3", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/traverse": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", + "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.4", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.4", + "@babel/types": "^7.8.3", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", + "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", + "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-decorators": "^7.8.3" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-WKK+9jz6TWUTX1uej9/EUVOmM1sK7aHv6bZyxbUV3NJjbiIZRqJITeXGMo7D631J72PEnIORh5VOlFCSlrLicg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-function-sent": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.8.3.tgz", + "integrity": "sha512-lu9wQjLnXd6Zy6eBKr0gE175xfD+da1rv2wOWEnZlD5KIxl894Tg34ppZ7ANR0jzQJMn+7pGuzSdy6JK4zGtKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/plugin-syntax-function-sent": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-throw-expressions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.8.3.tgz", + "integrity": "sha512-tH40s9JnoR+r45ZXKWW+PC5xzPQfVJix3pR1D8Ty5l9sn5NnrbZUzw8MtnNxu/Bz7p0imyeSYj9FQVccEymOEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-throw-expressions": "^7.8.3" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", + "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-function-sent": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.8.3.tgz", + "integrity": "sha512-NNEutF0x2PdWYij2bmf/i50dSq4SUdgFij4BZwj3I4qDZgql3dlFJRyvwGHAhwKYElUKHaP0wQ/yO1d/enpJaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.8.3.tgz", + "integrity": "sha512-vYiGd4wQ9gx0Lngb7+bPCwQXGK/PR6FeTIJ+TIOlq+OfOKG/kCAOO2+IBac3oMM9qV7/fU76hfcqxUaLKZf1hQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-throw-expressions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.8.3.tgz", + "integrity": "sha512-Mv3shY1i7ZssY4OY+eLZJAmNCwqTcpv2qOKO9x6irELSygfKWVSMXk0igJsA9UhU4hOdw0qMGkjj9TAk4MqzwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz", + "integrity": "sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/highlight": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", + "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "dev": true + }, + "@babel/template": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", + "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz", + "integrity": "sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", + "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.4.tgz", + "integrity": "sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.4", + "@babel/helper-compilation-targets": "^7.8.4", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.4", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.4", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "browserslist": { + "version": "4.8.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", + "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001027", + "electron-to-chromium": "^1.3.349", + "node-releases": "^1.1.49" + } + }, + "caniuse-lite": { + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", + "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.359", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.359.tgz", + "integrity": "sha512-ewZp4BQftbLclBwmFYoTrlyiLMXQTiYeqh1hn24sWao9bGhUHzQtpytymN8JsenWlQ9SbBWynTPvfghb0Ipn1Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", + "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + } + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + } + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.27.tgz", + "integrity": "sha512-97GaByGaXDGMkzcJX7VmR/jRJd8h1mfhtA7RsxDBN61GnWE/PPCZhOdwG/8OZYktiRUF0CvFOr+VgRkJrt6TWg==" + }, + "@fortawesome/fontawesome-free": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.12.1.tgz", + "integrity": "sha512-ZtjIIFplxncqxvogq148C3hBLQE+W3iJ8E4UvJ09zIJUgzwLcROsWwFDErVSXY2Plzao5J9KUYNHKHMEUYDMKw==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.27", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.27.tgz", + "integrity": "sha512-sOD3DKynocnHYpuw2sLPnTunDj7rLk91LYhi2axUYwuGe9cPCw7Bsu9EWtVdNJP+IYgTCZIbyARKXuy5K/nv+Q==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.27" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.12.1.tgz", + "integrity": "sha512-k3MwRFFUhyL4cuCJSaHDA0YNYMELDXX0h8JKtWYxO5XD3Dn+maXOMrVAAiNGooUyM2v/wz/TOaM0jxYVKeXX7g==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.27" + } + }, + "@fortawesome/vue-fontawesome": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-0.1.9.tgz", + "integrity": "sha512-h/emhmZz+DfB2zOGLWawNwXq82UYhn9waTfUjLLmeaIqtnIyNt6kYlpQT/vzJjLZRDRvY2IEJAh1di5qKpKVpA==" + }, + "@interactjs/actions": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/actions/-/actions-1.8.4.tgz", + "integrity": "sha512-G+9RRCqiYwGMc8mXcLBJbTevoRq36MpgiVCTQt/xMkMM5hGExFn976VU6frpFcal9U59QEB7TfO9O3LUGfmm9A==" + }, + "@interactjs/auto-scroll": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/auto-scroll/-/auto-scroll-1.8.4.tgz", + "integrity": "sha512-uluQy2ohr/CkmegNGWsztib0u1jVFqqSDQeC8rylI1nTKu1De5U5h8BGTTSRWad/TSlaW+GUaPgbjbhoiuEjew==" + }, + "@interactjs/auto-start": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/auto-start/-/auto-start-1.8.4.tgz", + "integrity": "sha512-Ln24+uiliaIb682dpzrfqKpti0xGCZXHeNFx+JvyquhZ3p3C2BmUd8jVA3wxZqce8YyK51nPc2VNdmc/Zf8aDg==" + }, + "@interactjs/core": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.8.4.tgz", + "integrity": "sha512-9/C7BYstNHMvGNIiY7laNBf2dBhlwWnOAYcbKiQBUlzncn61m4q9vq/jthCvd4WG2xEIxL8xoCYIEEdWq5JK2A==" + }, + "@interactjs/dev-tools": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/dev-tools/-/dev-tools-1.8.4.tgz", + "integrity": "sha512-s9rb6FGZKPwoVcRzCAh+UBxXMvnuxXMgAjrzCIjN5Qioi7uevcY92AHLyYFaTSi8XnxlknE9uggDetOF+JYtPw==", + "requires": { + "@interactjs/utils": "1.8.4" + } + }, + "@interactjs/inertia": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/inertia/-/inertia-1.8.4.tgz", + "integrity": "sha512-oF0Zl9i7DsffCowKh0pdmRCYfDc5gWiX2eVAcU20ys+0aRi1em45ReWnrvwrUwPAHoHL85wj5Z6I531h5UNm5w==" + }, + "@interactjs/interact": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/interact/-/interact-1.8.4.tgz", + "integrity": "sha512-6oEEi0B9PPl5YEfSFw3KWIYM1ih3uurJzRJfF0Quj49ja1hUhT8qf1ttJopM/RKrG/KQolmzCglbs2HVB3qZog==" + }, + "@interactjs/interactjs": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/interactjs/-/interactjs-1.8.4.tgz", + "integrity": "sha512-ZPRJ5vdBHTesLbmrkl1jAjvPlwA5uvcN4n1HnpGkMsXGAe8dzuUcLJfCmWz2dAS0bWWvpRsjQIS9xuPNIVdrXw==", + "requires": { + "@interactjs/types": "1.8.4" + } + }, + "@interactjs/modifiers": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/modifiers/-/modifiers-1.8.4.tgz", + "integrity": "sha512-YZP+McLdm16u6dPTD5Tu47AX2dn5z52Ac2oefTI572PP/GJwVxQyEDumV+HlnpbRY9LqS6IQHVZhvdZVhosZDg==" + }, + "@interactjs/pointer-events": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/pointer-events/-/pointer-events-1.8.4.tgz", + "integrity": "sha512-ZSprWv6GRfZqrN4I7Wbc65YxsggL/3ZY4yz2wnRq3BkFiXISI7XosI6CJKbOHel1HHodzK12y/1c/VBwa8XLNg==" + }, + "@interactjs/reflow": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/reflow/-/reflow-1.8.4.tgz", + "integrity": "sha512-x4Gdq3w4ITWATQa1fOeKIvBxIKpird+1+HKIYindoz+FFU5uSkd0QGMcGJtvs+pBrZqA2IG8KgGQ0oHBG9GJtg==" + }, + "@interactjs/types": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.8.4.tgz", + "integrity": "sha512-g9oQQ0DXOF4qiYNDR20TH5sxIJNxQh7T2E0++j5HDS6AzOA2zsMAhHog2cYv7jbDOyKvDryFke1B7hZgzZ555g==", + "requires": { + "@interactjs/actions": "1.8.4", + "@interactjs/auto-scroll": "1.8.4", + "@interactjs/auto-start": "1.8.4", + "@interactjs/core": "1.8.4", + "@interactjs/dev-tools": "1.8.4", + "@interactjs/inertia": "1.8.4", + "@interactjs/interact": "1.8.4", + "@interactjs/modifiers": "1.8.4", + "@interactjs/pointer-events": "1.8.4", + "@interactjs/reflow": "1.8.4", + "@interactjs/utils": "1.8.4" + } + }, + "@interactjs/utils": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@interactjs/utils/-/utils-1.8.4.tgz", + "integrity": "sha512-Kg/da0pQSIvEChGL96fYOSzguDc+2zbz061BWnnskq2viZvPnacFIDC2Z+dEZHH+DBMnnLAt2pqLEulxauSQhA==" + }, + "@mapbox/geojson-area": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz", + "integrity": "sha1-GNeBSqNr8j+7zDefjiaiKSfevxA=", + "requires": { + "wgs84": "0.0.0" + } + }, + "@mapbox/geojson-rewind": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.4.0.tgz", + "integrity": "sha512-b+1uPWBERW4Pet/969BNu61ZPDyH2ilIxBjJDFzxyS9TyszF9UrTQyYIl/G38clux3rtpAGGFSGTCSF/qR6UjA==", + "requires": { + "@mapbox/geojson-area": "0.2.2", + "concat-stream": "~1.6.0", + "minimist": "1.2.0", + "sharkdown": "^0.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "@mapbox/geojson-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", + "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" + }, + "@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=" + }, + "@mapbox/mapbox-gl-supported": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.4.1.tgz", + "integrity": "sha512-yyKza9S6z3ELKuf6w5n6VNUB0Osu6Z93RXPfMHLIlNWohu3KqxewLOq4lMXseYJ92GwkRAxd207Pr/Z98cwmvw==" + }, + "@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=" + }, + "@mapbox/tiny-sdf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.1.1.tgz", + "integrity": "sha512-Ihn1nZcGIswJ5XGbgFAvVumOgWpvIjBX9jiRlIl46uQG9vJOF51ViBYHF95rEZupuyQbEmhLaDPLQlU7fUTsBg==" + }, + "@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=" + }, + "@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "requires": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==" + }, + "@npmcli/ci-detect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.1.1.tgz", + "integrity": "sha512-h5eW3DljLypyhvfK94FkSSm4qtSUFddth/xW+7vnkVCEUJR38MYvctCSZkxqrzmXZSzpfImuAwwKvRqkEuDvCQ==" + }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@nuxt/opencollective": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.0.tgz", + "integrity": "sha512-Vf09BxCdj1iT2IRqVwX5snaY2WCTkvM0O4cWWSO1ThCFuc4if0Q/nNwAgCxRU0FeYHJ7DdyMUNSdswCLKlVqeg==", + "requires": { + "chalk": "^2.4.2", + "consola": "^2.10.1", + "node-fetch": "^2.6.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@plotly/d3-sankey": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", + "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-shape": "^1.2.0" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "@plotly/d3-sankey-circular": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", + "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", + "requires": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@statnett/vue-plotly": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@statnett/vue-plotly/-/vue-plotly-0.3.2.tgz", + "integrity": "sha512-3FnuVmdDUiujl9UnKE7Y/jnQPkDVK7WJ0gcBEPtfcIqruvaRcguRuw+G4B7GV8BpSS3wYh4/Q8qKHcJvany6iQ==", + "requires": { + "lodash": "^4.17.5", + "plotly.js": "^1.35.0" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@turf/area": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.0.1.tgz", + "integrity": "sha512-Zv+3N1ep9P5JvR0YOYagLANyapGWQBh8atdeR3bKpWcigVXFsEKNUw03U/5xnh+cKzm7yozHD6MFJkqQv55y0g==", + "requires": { + "@turf/helpers": "6.x", + "@turf/meta": "6.x" + } + }, + "@turf/bbox": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.0.1.tgz", + "integrity": "sha512-EGgaRLettBG25Iyx7VyUINsPpVj1x3nFQFiGS3ER8KCI1MximzNLsam3eXRabqQDjyAKyAE1bJ4EZEpGvspQxw==", + "requires": { + "@turf/helpers": "6.x", + "@turf/meta": "6.x" + } + }, + "@turf/centroid": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.0.2.tgz", + "integrity": "sha512-auyDauOtC4eddH7GC3CHFTDu2PKhpSeKCRhwhHhXtJqn2dWCJQNIoCeJRmfXRIbzCWhWvgvQafvvhq8HNvmvWw==", + "requires": { + "@turf/helpers": "6.x", + "@turf/meta": "6.x" + } + }, + "@turf/helpers": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.1.4.tgz", + "integrity": "sha512-vJvrdOZy1ngC7r3MDA7zIGSoIgyrkWcGnNIEaqn/APmw+bVLF2gAW7HIsdTxd12s5wQMqEpqIQrmrbRRZ0xC7g==" + }, + "@turf/meta": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.0.2.tgz", + "integrity": "sha512-VA7HJkx7qF1l3+GNGkDVn2oXy4+QoLP6LktXAaZKjuT1JI0YESat7quUkbCMy4zP9lAUuvS4YMslLyTtr919FA==", + "requires": { + "@turf/helpers": "6.x" + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==" + }, + "@types/d3-drag": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.3.tgz", + "integrity": "sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "13.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz", + "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@types/tapable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==" + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/webpack": { + "version": "4.4.34", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.34.tgz", + "integrity": "sha512-GnEBgjHsfO1M7DIQ0dAupSofcmDItE3Zsu3reK8SQpl/6N0rtUQxUmQzVFAS5ou/FGjsYKjXAWfItLZ0kNFTfQ==", + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "source-map": "^0.6.0" + } + }, + "@vue/component-compiler-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz", + "integrity": "sha512-+lN3nsfJJDGMNz7fCpcoYIORrXo0K3OTsdr8jCM7FuqdI4+70TY6gxY6viJ2Xi1clqyPg7LpeOWwjF31vSMmUw==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "a-big-triangle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/a-big-triangle/-/a-big-triangle-1.0.3.tgz", + "integrity": "sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q=", + "requires": { + "gl-buffer": "^2.1.1", + "gl-vao": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "abs-svg-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", + "integrity": "sha1-32Acjo0roQ1KdtYl4japo5wnI78=" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "accessor-fn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.2.2.tgz", + "integrity": "sha1-3VLCcUZTiLKXZKt58iIt7dEeSbI=" + }, + "accounting-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/accounting-js/-/accounting-js-1.1.1.tgz", + "integrity": "sha1-f+Sz9wwB6+C4XALF8QfxOTuIDJ4=", + "requires": { + "is-string": "^1.0.4", + "object-assign": "^4.0.1" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "add-line-numbers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/add-line-numbers/-/add-line-numbers-1.0.1.tgz", + "integrity": "sha1-SNu96kfb0jTer+rGyTzqb3C0t+M=", + "requires": { + "pad-left": "^1.0.2" + } + }, + "affine-hull": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz", + "integrity": "sha1-dj/x040GPOt+Jy8X7k17vK+QXF0=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + }, + "agentkeepalive": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.0.tgz", + "integrity": "sha512-CW/n1wxF8RpEuuiq6Vbn9S8m0VSYDMnZESqaJ6F2cWN9fY8rei2qaxweIaRgq+ek8TqfoFIsUjaGNKGGEHElSg==", + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "allofw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/allofw/-/allofw-0.1.0.tgz", + "integrity": "sha1-AmxSVpoJaAeGrxOwva3uYRLXfPY=", + "requires": { + "tar": "^4.1.1" + } + }, + "almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" + }, + "alpha-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/alpha-complex/-/alpha-complex-1.0.0.tgz", + "integrity": "sha1-kIZYcNawVCrnPAwTHU75iWabctI=", + "requires": { + "circumradius": "^1.0.0", + "delaunay-triangulate": "^1.1.6" + } + }, + "alpha-shape": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/alpha-shape/-/alpha-shape-1.0.0.tgz", + "integrity": "sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk=", + "requires": { + "alpha-complex": "^1.0.0", + "simplicial-complex-boundary": "^1.0.0" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "ansi-bgblack": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz", + "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgblue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz", + "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgcyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz", + "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bggreen": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz", + "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgmagenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz", + "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgred": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz", + "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgwhite": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz", + "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bgyellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz", + "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-black": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz", + "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-blue": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz", + "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-bold": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz", + "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-dim": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz", + "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-escapes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", + "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-green": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz", + "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-grey": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz", + "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-hidden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz", + "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-inverse": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz", + "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-italic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz", + "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-magenta": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz", + "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-reset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz", + "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-strikethrough": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz", + "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-underline": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz", + "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-white": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz", + "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "ansi-yellow": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz", + "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-pluck": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/arr-pluck/-/arr-pluck-0.1.0.tgz", + "integrity": "sha1-+K1tcI+HkAiB4jr9gw1SKQp2Z3U=", + "requires": { + "arr-map": "^2.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", + "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "array-normalize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", + "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", + "requires": { + "array-bounds": "^1.0.0" + } + }, + "array-range": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", + "integrity": "sha1-9W5GWRhDYRxqVvd+8C7afFAIm/w=" + }, + "array-rearrange": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", + "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" + }, + "array-sort": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz", + "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "arrayify-compact": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/arrayify-compact/-/arrayify-compact-0.2.0.tgz", + "integrity": "sha1-RZFw4VXKErtRRISDnJ1xUHyA7E0=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assemble-core": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/assemble-core/-/assemble-core-0.25.0.tgz", + "integrity": "sha1-ZZF7/K+c1rFNm5HQMaDdmar0OWQ=", + "requires": { + "assemble-fs": "^0.6.0", + "assemble-render-file": "^0.7.1", + "assemble-streams": "^0.6.0", + "base-task": "^0.6.1", + "define-property": "^0.2.5", + "lazy-cache": "^2.0.1", + "templates": "^0.24.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "assemble-fs": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/assemble-fs/-/assemble-fs-0.6.0.tgz", + "integrity": "sha1-uky+t0tdG97m1SipZa07fZbe8Og=", + "requires": { + "assemble-handle": "^0.1.2", + "extend-shallow": "^2.0.1", + "is-valid-app": "^0.2.0", + "lazy-cache": "^2.0.1", + "stream-combiner": "^0.2.2", + "through2": "^2.0.1", + "vinyl-fs": "^2.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "assemble-handle": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/assemble-handle/-/assemble-handle-0.1.4.tgz", + "integrity": "sha1-6De1uyPnXJsFJX2AfhYvaSzOIW4=", + "requires": { + "through2": "^2.0.3" + } + }, + "assemble-loader": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/assemble-loader/-/assemble-loader-0.6.1.tgz", + "integrity": "sha1-0GmqZBhOFzKEP+HsGAghI1dpVdg=", + "requires": { + "extend-shallow": "^2.0.1", + "file-contents": "^0.2.4", + "fs-exists-sync": "^0.1.0", + "has-glob": "^0.1.1", + "is-registered": "^0.1.5", + "is-valid-glob": "^0.3.0", + "is-valid-instance": "^0.1.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "load-templates": "^0.11.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "assemble-render-file": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/assemble-render-file/-/assemble-render-file-0.7.2.tgz", + "integrity": "sha1-g6qV9e131ctK6oq8dPIkoVRVccY=", + "requires": { + "debug": "^2.2.0", + "is-valid-app": "^0.1.2", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3", + "through2": "^2.0.1" + }, + "dependencies": { + "is-valid-app": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", + "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", + "requires": { + "debug": "^2.2.0", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "assemble-streams": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/assemble-streams/-/assemble-streams-0.6.0.tgz", + "integrity": "sha1-kOkhaoNpltJoNwvtrHG7MdjJq18=", + "requires": { + "assemble-handle": "^0.1.2", + "is-registered": "^0.1.4", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1", + "match-file": "^0.2.0", + "src-stream": "^0.1.1", + "through2": "^2.0.1" + }, + "dependencies": { + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-deep": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/assign-deep/-/assign-deep-0.4.8.tgz", + "integrity": "sha512-uxqXJCnNZDEjPnsaLKVzmh/ST5+Pqoz0wi06HDfHKx1ASNpSbbvz2qW2Gl8ZyHwr5jnm11X2S5eMQaP1lMZmCg==", + "requires": { + "assign-symbols": "^0.1.1", + "is-primitive": "^2.0.0", + "kind-of": "^5.0.2" + }, + "dependencies": { + "assign-symbols": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-0.1.1.tgz", + "integrity": "sha1-ywJZRO9OyKNpPwhunhEsdOOg/tk=" + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "async-array-reduce": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz", + "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=" + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-each-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", + "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=" + }, + "async-helpers": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/async-helpers/-/async-helpers-0.3.17.tgz", + "integrity": "sha512-LfgCyvmK6ZiC7pyqOgli2zfkWL4HYbEb+HXvGgdmqVBgsOOtQz5rSF8Ii/H/1cNNtrfj1KsdZE/lUMeIY3Qcwg==", + "requires": { + "co": "^4.6.0", + "kind-of": "^6.0.0" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "async-settle": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-0.2.1.tgz", + "integrity": "sha1-dnRi1XOACNx16sQkYiNSjyE3E5Y=", + "requires": { + "async-done": "^0.4.0" + }, + "dependencies": { + "async-done": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-0.4.0.tgz", + "integrity": "sha1-q4BT9fYikPi/xY83zZtzBwszB7k=", + "requires": { + "end-of-stream": "^0.1.4", + "next-tick": "^0.2.2", + "once": "^1.3.0", + "stream-exhaust": "^1.0.0" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + } + } + } + }, + "next-tick": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", + "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=" + } + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "atob-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-1.0.0.tgz", + "integrity": "sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs=" + }, + "audit": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/audit/-/audit-0.0.6.tgz", + "integrity": "sha1-/vF92Erx3NKlYz/UbTsa3LCEvzs=" + }, + "autoprefixer": { + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.26", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "browserslist": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", + "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001017", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.44" + } + }, + "caniuse-lite": { + "version": "1.0.30001021", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001021.tgz", + "integrity": "sha512-wuMhT7/hwkgd8gldgp2jcrUjOU9RXJ4XxGumQeOsUr91l3WwmM68Cpa/ymCnWEDqakwFXhuDQbaKNHXBPgeE9g==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "electron-to-chromium": { + "version": "1.3.338", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.338.tgz", + "integrity": "sha512-wlmfixuHEc9CkfOKgcqdtzBmRW4NStM9ptl5oPILY2UDyHuSXb3Yit+yLVyLObTgGuMMU36hhnfs2GDJId7ctA==", + "dev": true + }, + "node-releases": { + "version": "1.1.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.46.tgz", + "integrity": "sha512-YOjdx+Uoh9FbRO7yVYbnbt1puRWPQMemR3SutLeyv2XfxKs1ihpe0OLAUwBPEP2ImNH/PZC7SEiC6j32dwRZ7g==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "postcss": { + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", + "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + } + } + }, + "axios-progress-bar": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/axios-progress-bar/-/axios-progress-bar-1.2.0.tgz", + "integrity": "sha512-PEgWb/b2SMyHnKJ/cxA46OdCuNeVlo8eqL0HxXPtz+6G/Jtpyo49icPbW+jpO1wUeDEjbqpseMoCyWxESxf5pA==" + }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "babel-helper-vue-jsx-merge-props": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", + "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-jsx-event-modifiers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-event-modifiers/-/babel-plugin-jsx-event-modifiers-2.0.5.tgz", + "integrity": "sha512-tWGnCk0whZ+nZcj9tYLw4+y08tPJXqaEjIxRJZS6DkUUae72Kz4BsoGpxt/Kow7mmgQJpvFCw8IPLSNh5rkZCg==" + }, + "babel-plugin-jsx-v-model": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-v-model/-/babel-plugin-jsx-v-model-2.0.3.tgz", + "integrity": "sha512-SIx3Y3XxwGEz56Q1atwr5GaZsxJ2IRYmn5dl38LFkaTAvjnbNQxsZHO+ylJPsd+Hmv+ixJBYYFEekPBTHwiGfQ==", + "requires": { + "babel-plugin-syntax-jsx": "^6.18.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-transform-vue-jsx": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.7.0.tgz", + "integrity": "sha512-W39X07/n3oJMQd8tALBO+440NraGSF//Lo1ydd/9Nme3+QiRGFBb1Q39T9iixh0jZPPbfv3so18tNoIgLatymw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "babel-preset-vue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/babel-preset-vue/-/babel-preset-vue-2.0.2.tgz", + "integrity": "sha1-z63xvXNhJTl0gbX4UlztAEmgxx8=", + "requires": { + "babel-helper-vue-jsx-merge-props": "^2.0.2", + "babel-plugin-jsx-event-modifiers": "^2.0.2", + "babel-plugin-jsx-v-model": "^2.0.1", + "babel-plugin-syntax-jsx": "^6.18.0", + "babel-plugin-transform-vue-jsx": "^3.5.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "bach": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-0.5.0.tgz", + "integrity": "sha1-P/pqN0F3PrwNJL5f2kvF6FtbHaE=", + "requires": { + "async-done": "^1.1.1", + "async-settle": "^0.2.1", + "lodash.filter": "^4.1.0", + "lodash.flatten": "^4.0.0", + "lodash.foreach": "^4.0.0", + "lodash.initial": "^4.0.1", + "lodash.last": "^3.0.0", + "lodash.map": "^4.1.0", + "now-and-later": "0.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "barycentric": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/barycentric/-/barycentric-1.0.1.tgz", + "integrity": "sha1-8VYruJGyb0/sRjqC7to2V4AOxog=", + "requires": { + "robust-linear-solve": "^1.0.0" + } + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base-argv": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/base-argv/-/base-argv-0.4.5.tgz", + "integrity": "sha1-BalXHNwnaUDeGW/8h07uuJnLED0=", + "requires": { + "arr-diff": "^2.0.0", + "arr-union": "^3.1.0", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "expand-args": "^0.4.1", + "extend-shallow": "^2.0.1", + "lazy-cache": "^1.0.3" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "base-cli": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/base-cli/-/base-cli-0.5.0.tgz", + "integrity": "sha1-U+Zdjg9bKKoRBo/sjdTpXXLvPOg=", + "requires": { + "base-argv": "^0.4.2", + "base-config": "^0.5.2" + } + }, + "base-cli-process": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/base-cli-process/-/base-cli-process-0.1.19.tgz", + "integrity": "sha1-Mg08gVTfcQltSBgY52/m1+R5NjY=", + "requires": { + "arr-union": "^3.1.0", + "arrayify-compact": "^0.2.0", + "base-cli": "^0.5.0", + "base-cli-schema": "^0.1.19", + "base-config-process": "^0.1.9", + "base-cwd": "^0.3.4", + "base-option": "^0.8.4", + "base-pkg": "^0.2.4", + "debug": "^2.6.2", + "export-files": "^2.1.1", + "fs-exists-sync": "^0.1.0", + "is-valid-app": "^0.2.1", + "kind-of": "^3.1.0", + "lazy-cache": "^2.0.2", + "log-utils": "^0.2.1", + "merge-deep": "^3.0.0", + "mixin-deep": "^1.2.0", + "object.pick": "^1.2.0", + "pad-right": "^0.2.2", + "union-value": "^1.0.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-cli-schema": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/base-cli-schema/-/base-cli-schema-0.1.19.tgz", + "integrity": "sha1-gfQYL0zwu4NnHxF2PknLBbkugkE=", + "requires": { + "arr-flatten": "^1.0.1", + "array-unique": "^0.2.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "export-files": "^2.1.1", + "extend-shallow": "^2.0.1", + "falsey": "^0.3.0", + "fs-exists-sync": "^0.1.0", + "has-glob": "^0.1.1", + "has-value": "^0.3.1", + "kind-of": "^3.0.3", + "lazy-cache": "^2.0.1", + "map-schema": "^0.2.3", + "merge-deep": "^3.0.0", + "mixin-deep": "^1.1.3", + "resolve": "^1.1.7", + "tableize-object": "^0.1.0" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-compose": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/base-compose/-/base-compose-0.2.1.tgz", + "integrity": "sha1-reSal/WiRIvVa8s0C090aMb74tc=", + "requires": { + "copy-task": "^0.1.0", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-config": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/base-config/-/base-config-0.5.2.tgz", + "integrity": "sha1-q2A8AdExWL4uYux3/7Ix4o9Ijh8=", + "requires": { + "isobject": "^2.0.0", + "lazy-cache": "^1.0.3", + "map-config": "^0.5.0", + "resolve-dir": "^0.1.0" + }, + "dependencies": { + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "^1.0.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + } + } + }, + "base-config-process": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/base-config-process/-/base-config-process-0.1.9.tgz", + "integrity": "sha1-imOmGYnuY1UMyM/cP2wCdf2gtG4=", + "requires": { + "base-config": "^0.5.2", + "base-config-schema": "^0.1.18", + "base-cwd": "^0.3.4", + "base-option": "^0.8.4", + "debug": "^2.2.0", + "export-files": "^2.1.1", + "is-valid-app": "^0.2.0", + "lazy-cache": "^2.0.1", + "micromatch": "^2.3.10", + "mixin-deep": "^1.1.3" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "base-config-schema": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/base-config-schema/-/base-config-schema-0.1.24.tgz", + "integrity": "sha1-T74UvsVtwa7ef+3QaSjpGfhyH6k=", + "requires": { + "arr-flatten": "^1.0.3", + "array-unique": "^0.3.2", + "base-pkg": "^0.2.4", + "camel-case": "^3.0.0", + "debug": "^2.6.6", + "define-property": "^1.0.0", + "export-files": "^2.1.1", + "extend-shallow": "^2.0.1", + "has-glob": "^1.0.0", + "has-value": "^0.3.1", + "inflection": "^1.12.0", + "kind-of": "^3.2.0", + "lazy-cache": "^2.0.2", + "load-templates": "^1.0.2", + "map-schema": "^0.2.4", + "matched": "^0.4.4", + "mixin-deep": "^1.2.0", + "resolve": "^1.3.3" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "^1.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "file-contents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-1.0.1.tgz", + "integrity": "sha1-ryW7/T00RjhPrYBmSdiAi8/uHsg=", + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "is-buffer": "^1.1.4", + "kind-of": "^3.1.0", + "lazy-cache": "^2.0.2", + "strip-bom-buffer": "^0.1.1", + "strip-bom-string": "^0.1.2", + "through2": "^2.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + } + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", + "requires": { + "is-glob": "^3.0.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "load-templates": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/load-templates/-/load-templates-1.0.2.tgz", + "integrity": "sha1-CfOOlcjvS/t4W9f8qOv9MrIwvIc=", + "requires": { + "extend-shallow": "^2.0.1", + "file-contents": "^1.0.0", + "glob-parent": "^3.1.0", + "is-glob": "^3.1.0", + "kind-of": "^3.1.0", + "lazy-cache": "^2.0.2", + "matched": "^0.4.4", + "vinyl": "^2.0.1" + } + }, + "matched": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", + "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "glob": "^7.0.5", + "has-glob": "^0.1.1", + "is-valid-glob": "^0.3.0", + "lazy-cache": "^2.0.1", + "resolve-dir": "^0.1.0" + }, + "dependencies": { + "has-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz", + "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=", + "requires": { + "is-glob": "^2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "base-cwd": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/base-cwd/-/base-cwd-0.3.4.tgz", + "integrity": "sha1-TQCrY1CgRuGtSrnCMm2heUs+TwE=", + "requires": { + "empty-dir": "^0.2.0", + "find-pkg": "^0.1.2", + "is-valid-app": "^0.2.0" + } + }, + "base-data": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/base-data/-/base-data-0.6.2.tgz", + "integrity": "sha512-wH2ViG6CUO2AaeHSEt6fJTyQAk5gl0oY456DoSC5h8mnHrWUbvdctMCuF53CXgBmi0oalZQppKNH0iamG5+uqw==", + "requires": { + "arr-flatten": "^1.1.0", + "cache-base": "^1.0.0", + "extend-shallow": "^2.0.1", + "get-value": "^2.0.6", + "has-glob": "^1.0.0", + "has-value": "^1.0.0", + "is-registered": "^0.1.5", + "is-valid-app": "^0.3.0", + "kind-of": "^5.0.0", + "lazy-cache": "^2.0.2", + "merge-value": "^1.0.0", + "mixin-deep": "^1.2.0", + "read-file": "^0.2.0", + "resolve-glob": "^1.0.0", + "set-value": "^2.0.0", + "union-value": "^1.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", + "requires": { + "is-glob": "^3.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-valid-app": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.3.0.tgz", + "integrity": "sha1-eBBrdR88oyOF+0VJK/KUF7WZPIA=", + "requires": { + "debug": "^2.6.3", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.3.0", + "lazy-cache": "^2.0.2" + } + }, + "is-valid-instance": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.3.0.tgz", + "integrity": "sha1-9KxzAjxNTYubw7PsPmZjBRbijp4=", + "requires": { + "isobject": "^3.0.0", + "pascalcase": "^0.1.1" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-engines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/base-engines/-/base-engines-0.2.1.tgz", + "integrity": "sha1-aXgAyoq4iKM3iXONv6zLgYoqWns=", + "requires": { + "debug": "^2.2.0", + "define-property": "^0.2.5", + "engine-cache": "^0.19.0", + "is-valid-app": "^0.1.2", + "lazy-cache": "^2.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-valid-app": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", + "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", + "requires": { + "debug": "^2.2.0", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-env": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/base-env/-/base-env-0.3.1.tgz", + "integrity": "sha512-/HxC8QV1m/bWqvjcu4WZl4Um1HRpTAjuY31uiFUEukXsXge4WIvNvGKG/gCs2PrpBFPCybowA406V/ivdPknpQ==", + "requires": { + "base-namespace": "^0.2.0", + "contains-path": "^0.1.0", + "debug": "^2.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "global-modules": "^0.2.2", + "is-absolute": "^0.2.5", + "is-valid-app": "^0.1.0", + "is-valid-instance": "^0.1.0", + "kind-of": "^3.0.3", + "os-homedir": "^1.0.1", + "resolve-file": "^0.3.0" + }, + "dependencies": { + "cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", + "requires": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-valid-app": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", + "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", + "requires": { + "debug": "^2.2.0", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "resolve-file": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/resolve-file/-/resolve-file-0.3.0.tgz", + "integrity": "sha1-EeH7RkVm06fFAMt+lIHo8LAKFO8=", + "requires": { + "cwd": "^0.10.0", + "expand-tilde": "^2.0.2", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.1", + "lazy-cache": "^2.0.2", + "resolve": "^1.2.0" + } + } + } + }, + "base-generators": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/base-generators/-/base-generators-0.4.6.tgz", + "integrity": "sha1-4amTYh5bRCr44MgRMVoyb5h8nqY=", + "requires": { + "async-each-series": "^1.1.0", + "base-compose": "^0.2.1", + "base-cwd": "^0.3.1", + "base-data": "^0.6.0", + "base-env": "^0.3.0", + "base-option": "^0.8.4", + "base-pkg": "^0.2.4", + "base-plugins": "^0.4.13", + "base-task": "^0.6.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "global-modules": "^0.2.2", + "is-valid-app": "^0.2.0", + "is-valid-instance": "^0.2.0", + "kind-of": "^3.0.3", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-helpers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/base-helpers/-/base-helpers-0.1.1.tgz", + "integrity": "sha1-2k4eKy+ACOzc6T8R79223gYzP7M=", + "requires": { + "debug": "^2.2.0", + "define-property": "^0.2.5", + "is-valid-app": "^0.1.0", + "lazy-cache": "^2.0.1", + "load-helpers": "^0.2.11" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-valid-app": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", + "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", + "requires": { + "debug": "^2.2.0", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-namespace": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base-namespace/-/base-namespace-0.2.0.tgz", + "integrity": "sha1-RLLLumZ1Y8xE5trrTv5AO7CrPaA=", + "requires": { + "is-valid-app": "^0.1.0" + }, + "dependencies": { + "is-valid-app": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", + "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", + "requires": { + "debug": "^2.2.0", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-option": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/base-option/-/base-option-0.8.4.tgz", + "integrity": "sha1-EUF/qSRPInpNU3tNKRcjRieH1cc=", + "requires": { + "define-property": "^0.2.5", + "get-value": "^2.0.6", + "is-valid-app": "^0.2.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3", + "option-cache": "^3.4.0", + "set-value": "^0.3.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "set-value": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", + "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", + "requires": { + "extend-shallow": "^2.0.1", + "isobject": "^2.0.0", + "to-object-path": "^0.2.0" + } + }, + "to-object-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", + "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", + "requires": { + "arr-flatten": "^1.0.1", + "is-arguments": "^1.0.2" + } + } + } + }, + "base-pkg": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/base-pkg/-/base-pkg-0.2.5.tgz", + "integrity": "sha512-/POxajlgBhVsknwLXnqnbp//bAMh7SkDgHF+z/uoYnFqk46e05c3MxSEmn5vFCB8g4rHHKxAPLKrU/4Yb3vUdA==", + "requires": { + "cache-base": "^1.0.0", + "debug": "^2.6.8", + "define-property": "^1.0.0", + "expand-pkg": "^0.1.8", + "extend-shallow": "^2.0.1", + "is-valid-app": "^0.3.0", + "log-utils": "^0.2.1", + "pkg-store": "^0.2.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-valid-app": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.3.0.tgz", + "integrity": "sha1-eBBrdR88oyOF+0VJK/KUF7WZPIA=", + "requires": { + "debug": "^2.6.3", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.3.0", + "lazy-cache": "^2.0.2" + } + }, + "is-valid-instance": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.3.0.tgz", + "integrity": "sha1-9KxzAjxNTYubw7PsPmZjBRbijp4=", + "requires": { + "isobject": "^3.0.0", + "pascalcase": "^0.1.1" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-plugins": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/base-plugins/-/base-plugins-0.4.13.tgz", + "integrity": "sha1-kd8XjcN/hoQt6ihteeSPuGtarD0=", + "requires": { + "define-property": "^0.2.5", + "is-registered": "^0.1.5", + "isobject": "^2.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "base-questions": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/base-questions/-/base-questions-0.7.4.tgz", + "integrity": "sha1-9k+EgmHtbIKPSYPXgS9A0wN4IUY=", + "requires": { + "base-store": "^0.4.4", + "clone-deep": "^0.2.4", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "is-valid-app": "^0.2.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3", + "question-store": "^0.11.0" + }, + "dependencies": { + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + } + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + } + } + }, + "base-routes": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/base-routes/-/base-routes-0.2.2.tgz", + "integrity": "sha1-CmFNFy1JBF2Mk4dxP4YN88QFNB4=", + "requires": { + "debug": "^2.2.0", + "en-route": "^0.7.5", + "is-valid-app": "^0.2.0", + "lazy-cache": "^2.0.1", + "template-error": "^0.1.2" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-runtimes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base-runtimes/-/base-runtimes-0.2.0.tgz", + "integrity": "sha1-GI4+ZoJMyxWYsyh7TqW5NaG4UEU=", + "requires": { + "extend-shallow": "^2.0.1", + "is-valid-app": "^0.2.0", + "lazy-cache": "^2.0.1", + "log-utils": "^0.1.4", + "micromatch": "^2.3.10", + "time-diff": "^0.3.1" + }, + "dependencies": { + "ansi-colors": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.1.0.tgz", + "integrity": "sha1-M0rDbNPq1wjeXGnhmpjRhkImtD8=", + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^0.2.4" + }, + "dependencies": { + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "log-utils": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.1.5.tgz", + "integrity": "sha1-3g84+Vf0zW69Xctoddijua4HT3c=", + "requires": { + "ansi-colors": "^0.1.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "base-store": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/base-store/-/base-store-0.4.4.tgz", + "integrity": "sha1-JY32uKYu4G/xUADJSdD9fCi68mY=", + "requires": { + "data-store": "^0.16.0", + "debug": "^2.2.0", + "extend-shallow": "^2.0.1", + "is-registered": "^0.1.4", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1", + "project-name": "^0.2.5" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base-task": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/base-task/-/base-task-0.6.2.tgz", + "integrity": "sha1-Rn1guuBzezuJab/1f6RElJiZgcA=", + "requires": { + "composer": "^0.13.0", + "is-valid-app": "^0.1.0" + }, + "dependencies": { + "is-valid-app": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.1.2.tgz", + "integrity": "sha1-L2fLs7r2TWWccNBD/JETm1qLlZA=", + "requires": { + "debug": "^2.2.0", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.1.0", + "lazy-cache": "^2.0.1" + } + }, + "is-valid-instance": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.1.0.tgz", + "integrity": "sha1-etXGo4ht/ffZzHgEnO/yFxqZB7M=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big-rat": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.4.tgz", + "integrity": "sha1-do0JO7V5MN0Y7Vdcf8on3FORreo=", + "requires": { + "bit-twiddle": "^1.0.2", + "bn.js": "^4.11.6", + "double-bits": "^1.1.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, + "bitmap-sdf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz", + "integrity": "sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg==", + "requires": { + "clamp": "^1.0.1" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "blob": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.1.0.tgz", + "integrity": "sha512-k+GwK+4Rj+MPNT4qu+y6+kHp+mPmmNd+28zdrIo69QM9UvypK5Vhcw7jnRiY4KaOMAiOdn0NtPQGTb+Ox1Dtng==", + "requires": { + "esm": "^3.2.25" + } + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "bootstrap": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" + }, + "bootstrap-css-only": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/bootstrap-css-only/-/bootstrap-css-only-4.4.1.tgz", + "integrity": "sha512-iBgNli7RnedBFwn6sMTQoAZ8WgIwmX4kF1rckfj+pgro5q/Q0DbLtcpfH60XoFnCXzbEJU/khC/B2EQap89mCg==" + }, + "bootstrap-slider": { + "version": "10.6.2", + "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-10.6.2.tgz", + "integrity": "sha512-8JTPZB9QVOdrGzYF3YgC3YW6ssfPeBvBwZnXffiZ7YH/zz1D0EKlZvmQsm/w3N0XjVNYQEoQ0ax+jHrErV4K1Q==" + }, + "bootstrap-toggle": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bootstrap-toggle/-/bootstrap-toggle-2.2.2.tgz", + "integrity": "sha1-K4hTT8G5mGdPh3+Yug2LW3Q+lv4=" + }, + "bootstrap-vue": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.5.0.tgz", + "integrity": "sha512-LixZePxJqIkwsha2WAjAu7ZDH+oJ+JLxPGsl1SIbWebcEYZ+QtGx4JM2nR287t/0uWYGO+/oJ0KlaSO662VtLA==", + "requires": { + "@nuxt/opencollective": "^0.3.0", + "bootstrap": ">=4.4.1 <5.0.0", + "popper.js": "^1.16.1", + "portal-vue": "^2.1.7", + "vue-functional-data-merge": "^3.1.0" + } + }, + "boundary-cells": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/boundary-cells/-/boundary-cells-2.0.1.tgz", + "integrity": "sha1-6QWo0UGc9Hyza+Pb9SXbXiTeAEI=", + "requires": { + "tape": "^4.0.0" + } + }, + "box-intersect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/box-intersect/-/box-intersect-1.0.2.tgz", + "integrity": "sha512-yJeMwlmFPG1gIa7Rs/cGXeI6iOj6Qz5MG5PE61xLKpElUGzmJ4abm+qsLpzxKJFpsSDq742BQEocr8dI2t8Nxw==", + "requires": { + "bit-twiddle": "^1.0.2", + "typedarray-pool": "^1.1.0" + } + }, + "boxen": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz", + "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^2.4.2", + "cli-boxes": "^2.2.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "type-fest": "^0.3.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "buble": { + "version": "0.19.8", + "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.8.tgz", + "integrity": "sha512-IoGZzrUTY5fKXVkgGHw3QeXFMUNBFv+9l8a4QJKG1JhG3nCMHTdEX1DCOg8568E2Q9qvAQIiSokv6Jsgx8p2cA==", + "requires": { + "acorn": "^6.1.1", + "acorn-dynamic-import": "^4.0.0", + "acorn-jsx": "^5.0.1", + "chalk": "^2.4.2", + "magic-string": "^0.25.3", + "minimist": "^1.2.0", + "os-homedir": "^2.0.0", + "regexpu-core": "^4.5.4" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "os-homedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-2.0.0.tgz", + "integrity": "sha512-saRNz0DSC5C/I++gFIaJTXoFJMRwiP5zHar5vV3xQ2TkgEw6hDCcU5F272JjUylpiVgBrZNQHnfjkLabTfb92Q==" + } + } + }, + "bubleify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bubleify/-/bubleify-1.2.1.tgz", + "integrity": "sha512-vp3NHmaQVoKaKWvi15FTMinPNjfp+47+/kFJ9ifezdMF/CBLArCxDVUh+FQE3qRxCRj1qyjJqilTBHHqlM8MaQ==", + "requires": { + "buble": "^0.19.3" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30000979", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000979.tgz", + "integrity": "sha512-gcu45yfq3B7Y+WB05fOMfr0EiSlq+1u+m6rPHyJli/Wy3PVQNGaU7VA4bZE5qw+AU2UVOBR/N5g1bzADUqdvFw==" + }, + "canvas-fit": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", + "integrity": "sha1-rhO+Zq3kL1vg5IfjRfzjCl5bXl8=", + "requires": { + "element-size": "^1.1.1" + } + }, + "cardinal": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", + "integrity": "sha1-ylu2iltRG5D+k7ms6km97lwyv+I=", + "requires": { + "ansicolors": "~0.2.1", + "redeyed": "~0.4.0" + } + }, + "cdt2d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cdt2d/-/cdt2d-1.0.0.tgz", + "integrity": "sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE=", + "requires": { + "binary-search-bounds": "^2.0.3", + "robust-in-sphere": "^1.1.3", + "robust-orientation": "^1.1.3" + } + }, + "cell-orientation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cell-orientation/-/cell-orientation-1.0.1.tgz", + "integrity": "sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.1.0.tgz", + "integrity": "sha512-Qts4KCLKG+waHc9C4m07weIY8qyeixoS0h6RnbsNVD6Fw+pEZGW3vTyObL3WXpE09Mq4Oi7/lBEyLmOiLtlYWQ==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chart.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + }, + "dependencies": { + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", + "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circlepack-chart": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/circlepack-chart/-/circlepack-chart-1.3.0.tgz", + "integrity": "sha512-FQBRRw672SeeUO6ZIO/AC6RLG4YWsnsrB14ez+6g1iwAINZLLaoKn8CuH6oiBS+8u9zDG4wnRpRF7FRa9fr4RA==", + "requires": { + "accessor-fn": "^1.2.2", + "d3-hierarchy": "^1.1.8", + "d3-interpolate": "^1.3.2", + "d3-scale": "^3.1.0", + "d3-selection": "^1.4.0", + "d3-transition": "^1.2.0", + "d3-zoomable": "^1.1.1", + "kapsule": "^1.10.1", + "tinycolor2": "^1.4.1" + }, + "dependencies": { + "d3-scale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.1.0.tgz", + "integrity": "sha512-3edyEBwbwQG400VbgaepQC9ZYFX3h92flLHIUa1+nvZp/mqCYdxNM9zGTjKtPcSAuBCyPePdMQOapsD0qNALrg==", + "requires": { + "d3-array": "1.2.0 - 2", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + } + } + }, + "circumcenter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/circumcenter/-/circumcenter-1.0.0.tgz", + "integrity": "sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk=", + "requires": { + "dup": "^1.0.0", + "robust-linear-solve": "^1.0.0" + } + }, + "circumradius": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/circumradius/-/circumradius-1.0.0.tgz", + "integrity": "sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU=", + "requires": { + "circumcenter": "^1.0.0" + } + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-pslg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.2.tgz", + "integrity": "sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE=", + "requires": { + "big-rat": "^1.0.3", + "box-intersect": "^1.0.1", + "nextafter": "^1.0.0", + "rat-vec": "^1.1.1", + "robust-segment-intersect": "^1.0.1", + "union-find": "^1.0.2", + "uniq": "^1.0.1" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "requires": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + } + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "dev": true + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "requires": { + "colors": "1.0.3" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-alpha": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", + "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", + "requires": { + "color-parse": "^1.3.8" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", + "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", + "requires": { + "clamp": "^1.0.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-normalize": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", + "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", + "requires": { + "clamp": "^1.0.1", + "color-rgba": "^2.1.1", + "dtype": "^2.0.0" + } + }, + "color-parse": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", + "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", + "requires": { + "color-name": "^1.0.0", + "defined": "^1.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "color-rgba": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", + "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", + "requires": { + "clamp": "^1.0.1", + "color-parse": "^1.3.8", + "color-space": "^1.14.6" + } + }, + "color-space": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", + "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", + "requires": { + "hsluv": "^0.0.3", + "mumath": "^3.3.4" + } + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorbrewer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.3.0.tgz", + "integrity": "sha512-AzVPpWa+fuO/qY8LxPQjej6F49Lb2Cl+7U9YhPn6y4/SOY6u/EZiXUc7qHzRb6i6fWPStCUdEaU2731QyQKWjg==" + }, + "colormap": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/colormap/-/colormap-2.3.1.tgz", + "integrity": "sha512-TEzNlo/qYp6pBoR2SK9JiV+DG1cmUcVO/+DEJqVPSHIKNlWh5L5L4FYog7b/h0bAnhKhpOAvx/c1dFp2QE9sFw==", + "requires": { + "lerp": "^1.0.3" + } + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "common-config": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/common-config/-/common-config-0.1.0.tgz", + "integrity": "sha1-0fGnQa+gy/al7wl1K9/C5nfYtO8=", + "requires": { + "composer": "^0.13.0", + "data-store": "^0.16.1", + "get-value": "^2.0.6", + "lazy-cache": "^2.0.1", + "log-utils": "^0.2.0", + "object.pick": "^1.1.2", + "omit-empty": "^0.4.1", + "question-cache": "^0.4.0", + "set-value": "^0.3.3", + "strip-color": "^0.1.0", + "tableize-object": "^0.1.0", + "text-table": "^0.2.0", + "yargs-parser": "^2.4.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "question-cache": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/question-cache/-/question-cache-0.4.0.tgz", + "integrity": "sha1-4rmTf8X7fcYPu58QXx+iVLM96n0=", + "requires": { + "arr-flatten": "^1.0.1", + "arr-union": "^3.1.0", + "async": "1.5.2", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "get-value": "^2.0.5", + "has-value": "^0.3.1", + "inquirer2": "^0.1.1", + "is-answer": "^0.1.0", + "isobject": "^2.0.0", + "lazy-cache": "^1.0.3", + "mixin-deep": "^1.1.3", + "omit-empty": "^0.3.6", + "option-cache": "^3.3.5", + "os-homedir": "^1.0.1", + "project-name": "^0.2.4", + "set-value": "^0.3.3", + "to-choices": "^0.2.0", + "use": "^1.1.2" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "omit-empty": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/omit-empty/-/omit-empty-0.3.6.tgz", + "integrity": "sha1-bThAXyqmHJEetQT+aIBcVm2FwxY=", + "requires": { + "has-values": "^0.1.4", + "is-date-object": "^1.0.1", + "isobject": "^2.0.0", + "reduce-object": "^0.1.3" + } + } + } + }, + "set-value": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", + "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", + "requires": { + "extend-shallow": "^2.0.1", + "isobject": "^2.0.0", + "to-object-path": "^0.2.0" + } + }, + "to-object-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", + "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", + "requires": { + "arr-flatten": "^1.0.1", + "is-arguments": "^1.0.2" + } + }, + "use": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use/-/use-1.1.2.tgz", + "integrity": "sha1-bjgy/rholXNJSsanrLX++zd7LNE=", + "requires": { + "define-property": "^0.2.5", + "isobject": "^2.0.0" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-angle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compare-angle/-/compare-angle-1.0.1.tgz", + "integrity": "sha1-pOtjQW6jx0f8a9bItjZotN5PoSk=", + "requires": { + "robust-orientation": "^1.0.2", + "robust-product": "^1.0.0", + "robust-sum": "^1.0.0", + "signum": "^0.0.0", + "two-sum": "^1.0.0" + } + }, + "compare-cell": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/compare-cell/-/compare-cell-1.0.0.tgz", + "integrity": "sha1-qetwj24OQa73qlZrEw8ZaNyeGqo=" + }, + "compare-oriented-cell": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz", + "integrity": "sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54=", + "requires": { + "cell-orientation": "^1.0.1", + "compare-cell": "^1.0.0" + } + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "composer": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/composer/-/composer-0.13.0.tgz", + "integrity": "sha1-HbyxXxmpBt7uSanD0TfmVLvG0OI=", + "requires": { + "array-unique": "^0.2.1", + "bach": "^0.5.0", + "co": "^4.6.0", + "component-emitter": "^1.2.1", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "is-generator": "^1.0.3", + "is-glob": "^2.0.1", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "micromatch": "^2.3.8", + "nanoseconds": "^0.1.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + } + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + } + } + }, + "compute-dims": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/compute-dims/-/compute-dims-1.1.0.tgz", + "integrity": "sha512-YHMiIKjH/8Eom8zATk3g8/lH3HxGCZcVQyEfEoVrfWI7od/WRpTgRGShnei3jArYSx77mQqPxZNokjGHCdLfxg==", + "requires": { + "utils-copy": "^1.0.0", + "validate.io-array": "^1.0.6", + "validate.io-matrix-like": "^1.0.2", + "validate.io-ndarray-like": "^1.0.0", + "validate.io-positive-integer": "^1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", + "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.11.3.tgz", + "integrity": "sha512-aoW0YIIAmeftGR8GSpw6CGQluNdkWMWh3yEFjH/hmynTYnMtibXszii3lxCXmk8YxJtI3FAK5aTiquA5VH68Gw==" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "const-max-uint32": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/const-max-uint32/-/const-max-uint32-1.0.2.tgz", + "integrity": "sha1-8Am7YjDmeO2HTdLWqc2ePL+rtnY=" + }, + "const-pinf-float64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz", + "integrity": "sha1-9u+w15+cCYbT558pI6v5twtj1yY=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "convex-hull": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz", + "integrity": "sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8=", + "requires": { + "affine-hull": "^1.0.0", + "incremental-convex-hull": "^1.0.1", + "monotone-convex-hull-2d": "^1.0.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-task": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/copy-task/-/copy-task-0.1.0.tgz", + "integrity": "sha1-TDT+muVPKq9gntMvhbj3l6H0arY=" + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + } + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.8.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.7.tgz", + "integrity": "sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001027", + "electron-to-chromium": "^1.3.349", + "node-releases": "^1.1.49" + } + }, + "caniuse-lite": { + "version": "1.0.30001028", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001028.tgz", + "integrity": "sha512-Vnrq+XMSHpT7E+LWoIYhs3Sne8h9lx9YJV3acH3THNCwU/9zV93/ta4xVfzTtnqd3rvnuVpVjE3DFqf56tr3aQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.359", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.359.tgz", + "integrity": "sha512-ewZp4BQftbLclBwmFYoTrlyiLMXQTiYeqh1hn24sWao9bGhUHzQtpytymN8JsenWlQ9SbBWynTPvfghb0Ipn1Q==", + "dev": true + }, + "node-releases": { + "version": "1.1.50", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", + "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "cryo": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/cryo/-/cryo-0.0.6.tgz", + "integrity": "sha1-FoMyldLuFv85cR24QGF7euSvC6Q=" + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-element-queries": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/css-element-queries/-/css-element-queries-1.2.3.tgz", + "integrity": "sha512-QK9uovYmKTsV2GXWQiMOByVNrLn2qz6m3P7vWpOR4IdD6I3iXoDw5qtgJEN3Xq7gIbdHVKvzHjdAtcl+4Arc4Q==" + }, + "css-font": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", + "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", + "requires": { + "css-font-size-keywords": "^1.0.0", + "css-font-stretch-keywords": "^1.0.1", + "css-font-style-keywords": "^1.0.1", + "css-font-weight-keywords": "^1.0.0", + "css-global-keywords": "^1.0.1", + "css-system-font-keywords": "^1.0.0", + "pick-by-alias": "^1.2.0", + "string-split-by": "^1.0.0", + "unquote": "^1.1.0" + } + }, + "css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha1-hUh1rOmspqjS7g00WkSq6btttss=" + }, + "css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA=" + }, + "css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ=" + }, + "css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=" + }, + "css-global-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", + "integrity": "sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk=" + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", + "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-system-font-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", + "integrity": "sha1-hcbwhquk6zLFcaMIav/ENLhII+0=" + }, + "css-tree": { + "version": "1.0.0-alpha.28", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", + "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=" + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "cubic-hermite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", + "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "cwd": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.9.1.tgz", + "integrity": "sha1-QeEKfhq4M9xZwuyoOBTH3ne1pP0=", + "requires": { + "find-pkg": "^0.1.0" + } + }, + "cwise": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.10.tgz", + "integrity": "sha1-JO7mBy69/WuMb12tsXCQtkmxK+8=", + "requires": { + "cwise-compiler": "^1.1.1", + "cwise-parser": "^1.0.0", + "static-module": "^1.0.0", + "uglify-js": "^2.6.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "cwise-compiler": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", + "integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=", + "requires": { + "uniq": "^1.0.0" + } + }, + "cwise-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", + "integrity": "sha1-jkk8F9VPl8sDCp6YVLyGyd+zVP4=", + "requires": { + "esprima": "^1.0.3", + "uniq": "^1.0.0" + }, + "dependencies": { + "esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=" + } + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "d3": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.0.tgz", + "integrity": "sha512-C+E80SL2nLLtmykZ6klwYj5rPqB5nlfN5LdWEAVdWPppqTD8taoJi2PxLZjPeYT8FFRR2yucXq+kBlOnnvZeLg==", + "requires": { + "d3-array": "1", + "d3-axis": "1", + "d3-brush": "1", + "d3-chord": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-contour": "1", + "d3-dispatch": "1", + "d3-drag": "1", + "d3-dsv": "1", + "d3-ease": "1", + "d3-fetch": "1", + "d3-force": "1", + "d3-format": "1", + "d3-geo": "1", + "d3-hierarchy": "1", + "d3-interpolate": "1", + "d3-path": "1", + "d3-polygon": "1", + "d3-quadtree": "1", + "d3-random": "1", + "d3-scale": "2", + "d3-scale-chromatic": "1", + "d3-selection": "1", + "d3-shape": "1", + "d3-time": "1", + "d3-time-format": "2", + "d3-timer": "1", + "d3-transition": "1", + "d3-voronoi": "1", + "d3-zoom": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-axis": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz", + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + }, + "d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-chord": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", + "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "requires": { + "d3-array": "1", + "d3-path": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.8.tgz", + "integrity": "sha512-yeANXzP37PHk0DbSTMNPhnJD+Nn4G//O5E825bR6fAfHH43hobSBpgB9G9oWVl9+XgUaQ4yCnsX1H+l8DoaL9A==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "^1.1.1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-delaunay": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.2.0.tgz", + "integrity": "sha512-G3gu/LcNQSX1FMZoL9H19O89bUYsQR+TVIdNlz8vzr/ASHV36xfK7eljsuLRP6PsqxrjbiWG6B3/zMUCYJnuUw==", + "requires": { + "delaunator": "4" + } + }, + "d3-dispatch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + }, + "d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "requires": { + "d3-dispatch": "1", + "d3-selection": "1" + } + }, + "d3-dsv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", + "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.5.tgz", + "integrity": "sha512-Ct1O//ly5y5lFM9YTdu+ygq7LleSgSE4oj7vUt9tPLHUi8VCV7QoizGpdWRWAwCO9LdYzIrQDg97+hGVdsSGPQ==" + }, + "d3-fetch": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz", + "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==", + "requires": { + "d3-dsv": "1" + } + }, + "d3-force": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "requires": { + "d3-collection": "1", + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + }, + "d3-format": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.2.tgz", + "integrity": "sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==" + }, + "d3-geo": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz", + "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==", + "requires": { + "d3-array": "1" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-geo-projection": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.8.1.tgz", + "integrity": "sha512-VObmT3vQQgU7IxkDwyIuOrWK4AS2OHyvucp1vHo98WE7DvAN+VcS3Pf/oKenszPfbMtHusOfQNBLEMyGHguvTg==", + "requires": { + "commander": "2", + "d3-array": "1", + "d3-geo": "^1.10.0", + "resolve": "^1.1.10" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-heatmap": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-heatmap/-/d3-heatmap-1.2.1.tgz", + "integrity": "sha1-ukicekNWKtfcyUGvoursqVESz6Q=", + "requires": { + "d3": "^3.5.16" + }, + "dependencies": { + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + } + } + }, + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==" + }, + "d3-interpolate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", + "integrity": "sha512-NlNKGopqaz9qM1PXh9gBF1KSCVh+jSFErrSlD/4hybwoNX/gt1d8CDbDW+3i+5UOHhjC6s6nMvRxcuoMVNgL2w==", + "requires": { + "d3-color": "1" + } + }, + "d3-lasso": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/d3-lasso/-/d3-lasso-0.0.5.tgz", + "integrity": "sha1-unc2Stxsb4m2BufZjapXDjzQOBY=", + "requires": { + "d3-dispatch": "^1.0.1", + "d3-drag": "^1.0.1", + "d3-selection": "^1.0.2", + "robust-point-in-polygon": "^1.0.3" + } + }, + "d3-loom": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-loom/-/d3-loom-1.0.2.tgz", + "integrity": "sha1-w2nyJSBSVoe1FwOVkX9u3t1ohks=", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "^1.0.4", + "d3-interpolate": "^1.1.5", + "d3-path": "^1.0.5" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==" + }, + "d3-polygon": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz", + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + }, + "d3-quadtree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + }, + "d3-random": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz", + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + }, + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1", + "d3-interpolate": "1" + } + }, + "d3-selection": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz", + "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA==" + }, + "d3-selection-multi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-selection-multi/-/d3-selection-multi-1.0.1.tgz", + "integrity": "sha1-zWwlQT0EosuXRw54byzYd/PjT1g=", + "requires": { + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-shape": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", + "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", + "requires": { + "d3-path": "1" + } + }, + "d3-svg-legend": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/d3-svg-legend/-/d3-svg-legend-1.13.0.tgz", + "integrity": "sha1-YhdHjJrdnWLLMzYX4ZYTEaQaTbM=" + }, + "d3-time": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.11.tgz", + "integrity": "sha512-Z3wpvhPLW4vEScGeIMUckDW7+3hWKOQfAWg/U7PlWBnQmeKQ00gCUsTtWSYulrKNA7ta8hJ+xXc6MHrMuITwEw==" + }, + "d3-time-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.3.tgz", + "integrity": "sha512-6k0a2rZryzGm5Ihx+aFMuO1GgelgIz+7HhB4PH4OEndD5q2zGn1mDfRdNrulspOfR6JXkb2sThhDK41CSK85QA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" + }, + "d3-tip": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/d3-tip/-/d3-tip-0.6.8.tgz", + "integrity": "sha1-5bRJGuiYP95kbqSQCP9UKgM8Ciw=", + "requires": { + "d3": "^3.5.5" + }, + "dependencies": { + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + } + } + }, + "d3-transition": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.2.0.tgz", + "integrity": "sha512-VJ7cmX/FPIPJYuaL2r1o1EMHLttvoIuZhhuAlRoOxDzogV8iQS6jYulDm3xEU3TqL80IZIhI551/ebmCMrkvhw==", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "^1.1.0", + "d3-timer": "1" + } + }, + "d3-voronoi": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + }, + "d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "requires": { + "d3-dispatch": "1", + "d3-drag": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-transition": "1" + } + }, + "d3-zoomable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/d3-zoomable/-/d3-zoomable-1.1.1.tgz", + "integrity": "sha512-wF0YkDhdRNcJSC6f3u+uNmGG5TfKqIq9SMqrOtEJ2EuzrMJD9f/kW06L8cuRpFSL1ynlj/EClcDdyaJqAbTAVg==", + "requires": { + "d3-interpolate": "^1.3.2", + "d3-selection": "^1.4.0", + "d3-transition": "^1.2.0", + "d3-zoom": "^1.7.3", + "kapsule": "^1.10.1" + } + }, + "d3_exploding_boxplot": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/d3_exploding_boxplot/-/d3_exploding_boxplot-0.2.1.tgz", + "integrity": "sha1-9uJT0Sx8C7wU6akRLYk+PiTSc3I=", + "requires": { + "d3": "~3.5.6", + "d3-tip": "~0.6.7" + }, + "dependencies": { + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + } + } + }, + "data-store": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/data-store/-/data-store-0.16.1.tgz", + "integrity": "sha1-5pwDpcrBXR/zPwJUyWeDZT5ogwQ=", + "requires": { + "cache-base": "^0.8.4", + "clone-deep": "^0.2.4", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "graceful-fs": "^4.1.4", + "has-own-deep": "^0.1.4", + "lazy-cache": "^2.0.1", + "mkdirp": "^0.5.1", + "project-name": "^0.2.5", + "resolve-dir": "^0.1.0", + "rimraf": "^2.5.3", + "union-value": "^0.2.3" + }, + "dependencies": { + "cache-base": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", + "integrity": "sha1-YM6zUEAh7O7HAR/TOEt/TpVym/o=", + "requires": { + "collection-visit": "^0.2.1", + "component-emitter": "^1.2.1", + "get-value": "^2.0.5", + "has-value": "^0.3.1", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.1", + "set-value": "^0.4.2", + "to-object-path": "^0.3.0", + "union-value": "^0.2.3", + "unset-value": "^0.1.1" + } + }, + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + } + } + }, + "collection-visit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", + "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", + "requires": { + "lazy-cache": "^2.0.1", + "map-visit": "^0.1.5", + "object-visit": "^0.3.4" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "^1.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "map-visit": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", + "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", + "requires": { + "lazy-cache": "^2.0.1", + "object-visit": "^0.3.4" + } + }, + "object-visit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", + "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "union-value": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", + "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + } + }, + "unset-value": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", + "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + } + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-bind": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/deep-bind/-/deep-bind-0.3.0.tgz", + "integrity": "sha1-lcMd2Eoc0bOBEZosQu25DbSFvDM=", + "requires": { + "mixin-deep": "^1.1.3" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defaults-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/defaults-deep/-/defaults-deep-0.2.4.tgz", + "integrity": "sha512-V6BtqzcMvn0EPOy7f+SfMhfmTawq+7UQdt9yZH0EBK89+IHo5f+Hse/qzTorAXOBrQpxpwb6cB/8OgtaMrT+Fg==", + "requires": { + "for-own": "^0.1.3", + "is-extendable": "^0.1.1", + "lazy-cache": "^0.2.3" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "defer-to-connect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz", + "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, + "delaunay-triangulate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz", + "integrity": "sha1-W7yiGweBmNS8PHV5ajXLuYwllUw=", + "requires": { + "incremental-convex-hull": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "delimiter-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/delimiter-regex/-/delimiter-regex-2.0.0.tgz", + "integrity": "sha1-DQ9vYdmRVZH9Qwh6jpWF0+IRWnU=", + "requires": { + "extend-shallow": "^1.1.2", + "isobject": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-kerning": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", + "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "double-bits": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/double-bits/-/double-bits-1.1.1.tgz", + "integrity": "sha1-WKu6RUlNpND6Nrc60RoobJGEscY=" + }, + "draw-svg-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", + "integrity": "sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k=", + "requires": { + "abs-svg-path": "~0.1.1", + "normalize-svg-path": "~0.1.0" + } + }, + "dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=" + }, + "dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "earcut": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz", + "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==" + }, + "edges-to-adjacency-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz", + "integrity": "sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E=", + "requires": { + "uniq": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz", + "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.180", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.180.tgz", + "integrity": "sha512-jwI82/63GeH7f08IR+4v/tbGM4DMAApMZO0SXLcC0np4lcqWjQBl0MIHkfXEqesLc55+NhVVX8g7eFlamEWoNQ==" + }, + "element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=" + }, + "elementary-circuits-directed-graph": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.2.0.tgz", + "integrity": "sha512-eOQofnrNqebPtC29PvyNMGUBdMrIw5i8nOoC/2VOlSF84tf5+ZXnRkIk7TgdT22jFXK68CC7aA881KRmNYf/Pg==", + "requires": { + "strongly-connected-components": "^1.0.1" + } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "empty-dir": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/empty-dir/-/empty-dir-0.2.1.tgz", + "integrity": "sha1-gJ7kih60rRy1EMJXLWb9DthNAas=", + "requires": { + "fs-exists-sync": "^0.1.0" + } + }, + "en-route": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/en-route/-/en-route-0.7.5.tgz", + "integrity": "sha1-6CMOc4NsXpXGdX4EQtPBExJL3Zg=", + "requires": { + "arr-flatten": "^1.0.1", + "debug": "^2.2.0", + "extend-shallow": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "path-to-regexp": "^1.2.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "optional": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "engine": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/engine/-/engine-0.1.12.tgz", + "integrity": "sha1-+H6MkLuAzT9YWXrFaVk+5G2idC0=", + "requires": { + "assign-deep": "^0.4.3", + "collection-visit": "^0.2.0", + "get-value": "^1.2.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "object.omit": "^2.0.0", + "set-value": "^0.2.0" + }, + "dependencies": { + "collection-visit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", + "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", + "requires": { + "lazy-cache": "^2.0.1", + "map-visit": "^0.1.5", + "object-visit": "^0.3.4" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "get-value": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-1.3.1.tgz", + "integrity": "sha1-isfvTyA4I5KyZGVI+bmtLcbIlkI=", + "requires": { + "arr-flatten": "^1.0.1", + "is-extendable": "^0.1.1", + "lazy-cache": "^0.2.4", + "noncharacters": "^1.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + }, + "map-visit": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", + "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", + "requires": { + "lazy-cache": "^2.0.1", + "object-visit": "^0.3.4" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", + "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", + "requires": { + "isobject": "^2.0.0" + } + }, + "set-value": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.2.0.tgz", + "integrity": "sha1-c7CmglwVjGoWqCu9yVd1vyqCX6s=", + "requires": { + "isobject": "^1.0.0", + "noncharacters": "^1.1.0" + }, + "dependencies": { + "isobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-1.0.2.tgz", + "integrity": "sha1-8Pm4zpLdVA+gdAiC44NaLgIux4o=" + } + } + } + } + }, + "engine-base": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/engine-base/-/engine-base-0.1.3.tgz", + "integrity": "sha1-1ZycxS591t0rSa579ftEmU9wFqU=", + "requires": { + "component-emitter": "^1.2.1", + "delimiter-regex": "^2.0.0", + "engine": "^0.1.12", + "engine-utils": "^0.1.1", + "lazy-cache": "^2.0.2", + "mixin-deep": "^1.1.3", + "object.omit": "^2.0.1", + "object.pick": "^1.2.0" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "engine-cache": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/engine-cache/-/engine-cache-0.19.4.tgz", + "integrity": "sha1-giSWb732pl54Dsed+HtrLLgjlbI=", + "requires": { + "async-helpers": "^0.3.9", + "extend-shallow": "^2.0.1", + "helper-cache": "^0.7.2", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2", + "mixin-deep": "^1.1.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "engine-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/engine-utils/-/engine-utils-0.1.1.tgz", + "integrity": "sha1-rd9HCN2FoFoyF6l3l+q4oBPE+A4=" + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", + "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "dev": true, + "requires": { + "stackframe": "^1.0.4" + } + }, + "error-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz", + "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=" + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", + "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", + "dev": true + }, + "eslint-friendly-formatter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", + "integrity": "sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo=", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "coalescy": "1.0.0", + "extend": "^3.0.0", + "minimist": "^1.2.0", + "strip-ansi": "^4.0.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.3.tgz", + "integrity": "sha512-+YRqB95PnNvxNp1HEjQmvf9KNvCin5HXYYseOXVC2U0KEcw4IkQ2IQEBG46j7+gW39bMzeu0GsUhVbBY3Votpw==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "loader-fs-cache": "^1.0.2", + "loader-utils": "^1.2.3", + "object-hash": "^2.0.1", + "schema-utils": "^2.6.1" + }, + "dependencies": { + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", + "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "eslint-plugin-node": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.0.0.tgz", + "integrity": "sha512-chUs/NVID+sknFiJzxoN9lM7uKSOEta8GC8365hw1nDfwIPIjjpRSwwPvQanWv8dt/pDe9EV4anmVSwdiSndNg==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", + "dev": true + }, + "eslint-plugin-vue": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.1.tgz", + "integrity": "sha512-MiIDOotoWseIfLIfGeDzF6sDvHkVvGd2JgkvjyHtN3q4RoxdAXrAMuI3SXTOKatljgacKwpNAYShmcKZa4yZzw==", + "dev": true, + "requires": { + "natural-compare": "^1.4.0", + "semver": "^5.6.0", + "vue-eslint-parser": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "dev": true, + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + } + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" + }, + "expand-args": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/expand-args/-/expand-args-0.4.3.tgz", + "integrity": "sha1-OoZiJBxYF1fIzTf7d2d6xgL/nZg=", + "requires": { + "expand-object": "^0.4.2", + "kind-of": "^3.0.3", + "lazy-cache": "^2.0.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "omit-empty": "^0.4.1", + "set-value": "^0.3.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "set-value": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", + "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", + "requires": { + "extend-shallow": "^2.0.1", + "isobject": "^2.0.0", + "to-object-path": "^0.2.0" + } + }, + "to-object-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", + "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", + "requires": { + "arr-flatten": "^1.0.1", + "is-arguments": "^1.0.2" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-object": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/expand-object/-/expand-object-0.4.2.tgz", + "integrity": "sha1-t/J+9pwv3MYrD5OQwMtHvAa7Buo=", + "requires": { + "get-stdin": "^5.0.1", + "is-number": "^2.1.0", + "minimist": "^1.2.0", + "set-value": "^0.3.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=" + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "set-value": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", + "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", + "requires": { + "extend-shallow": "^2.0.1", + "isobject": "^2.0.0", + "to-object-path": "^0.2.0" + } + }, + "to-object-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", + "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", + "requires": { + "arr-flatten": "^1.0.1", + "is-arguments": "^1.0.2" + } + } + } + }, + "expand-pkg": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/expand-pkg/-/expand-pkg-0.1.9.tgz", + "integrity": "sha512-Qqtqzx/e8tODrDr0H8HtO7+nftN0wH9bsk3948KpKBZLrc86Cm3/8mRKJmDfNSDWWcuKsilMmFlKPhYx5gHYuA==", + "requires": { + "component-emitter": "^1.2.1", + "debug": "^2.4.1", + "defaults-deep": "^0.2.4", + "export-files": "^2.1.1", + "get-value": "^2.0.6", + "kind-of": "^3.1.0", + "lazy-cache": "^2.0.2", + "load-pkg": "^3.0.1", + "mixin-deep": "^1.1.3", + "normalize-pkg": "^0.3.20", + "omit-empty": "^0.4.1", + "parse-author": "^1.0.0", + "parse-git-config": "^1.1.1", + "repo-utils": "^0.3.7" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "export-files": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/export-files/-/export-files-2.1.1.tgz", + "integrity": "sha1-u/ZFdAU6CeTrmOX0NQHVcrLDzn8=", + "requires": { + "lazy-cache": "^1.0.3" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-frustum-planes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz", + "integrity": "sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU=" + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + } + }, + "falafel": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", + "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "requires": { + "acorn": "^5.0.0", + "foreach": "^2.0.5", + "isarray": "0.0.1", + "object-keys": "^1.0.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "falsey": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz", + "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "fast-isnumeric": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.3.tgz", + "integrity": "sha512-MdojHkfLx8pjRNZyGjOhX4HxNPaf0l5R/v5rGZ1bGXCnRPyQIUAe4I1H7QtrlUwuuiDHKdpQTjT3lmueVH2otw==", + "requires": { + "is-string-blank": "^1.0.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-contents": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/file-contents/-/file-contents-0.2.4.tgz", + "integrity": "sha1-BQb3uO/2KvpFrkXaTfnp1H30U8s=", + "requires": { + "extend-shallow": "^2.0.0", + "file-stat": "^0.1.0", + "graceful-fs": "^4.1.2", + "is-buffer": "^1.1.0", + "is-utf8": "^0.2.0", + "lazy-cache": "^0.2.3", + "through2": "^2.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-is-binary": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-is-binary/-/file-is-binary-1.0.0.tgz", + "integrity": "sha1-XkGAbRvK5FjI/sMv484SLbu8Q1Y=", + "requires": { + "is-binary-buffer": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "file-loader": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.1.0.tgz", + "integrity": "sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==", + "dev": true, + "requires": { + "loader-utils": "^1.4.0", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "file-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz", + "integrity": "sha1-ycrSZdLIrfOoFHWw30dYWQafrvc=", + "requires": { + "utils-extend": "^1.0.6" + } + }, + "file-name": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/file-name/-/file-name-0.1.0.tgz", + "integrity": "sha1-ErEi8SD5w028F2wauBpUis7W3vc=" + }, + "file-saver": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", + "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw==" + }, + "file-stat": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/file-stat/-/file-stat-0.1.3.tgz", + "integrity": "sha1-0PGWHX0QcykoEgpuaVVHHCpbVBE=", + "requires": { + "graceful-fs": "^4.1.2", + "lazy-cache": "^0.2.3", + "through2": "^2.0.0" + }, + "dependencies": { + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "file-system": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/file-system/-/file-system-2.2.2.tgz", + "integrity": "sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc=", + "requires": { + "file-match": "^1.0.1", + "utils-extend": "^1.0.4" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "filtered-vector": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.4.tgz", + "integrity": "sha1-VkU8A030MC0pPKjs3qw/kKvGeNM=", + "requires": { + "binary-search-bounds": "^1.0.0", + "cubic-hermite": "^1.0.0" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } + } + }, + "find-file-up": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", + "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=", + "requires": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + }, + "dependencies": { + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "^1.0.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + } + } + }, + "find-pkg": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", + "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=", + "requires": { + "find-file-up": "^0.1.2" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + }, + "fix": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/fix/-/fix-0.0.6.tgz", + "integrity": "sha1-B+WTonQU3cSG7lLVD5yOCYhaAwU=", + "requires": { + "pipe": "0.0.2", + "underscore": "1.1.6", + "underscore.string": "1.1.4" + }, + "dependencies": { + "underscore": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.6.tgz", + "integrity": "sha1-aGjaG91y11KFvgtOUPIo5w0AGiw=" + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flatten-vertex-data": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", + "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", + "requires": { + "dtype": "^2.0.0" + } + }, + "flip-pixels": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flip-pixels/-/flip-pixels-1.0.2.tgz", + "integrity": "sha512-oXbJGbjDnfJRWPC7Va38EFhd+A8JWE5/hCiKcK8qjCdbLj9DTpsq6MEudwpRTH+V4qq+Jw7d3pUgQdSr3x3mTA==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", + "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "font-atlas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", + "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", + "requires": { + "css-font": "^1.0.0" + } + }, + "font-measure": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", + "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "requires": { + "css-font": "^1.2.0" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "friendly-errors-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "from2-array": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/from2-array/-/from2-array-0.0.4.tgz", + "integrity": "sha1-6vwWtl9uJxm81X/cGGkAWsEzLNY=", + "requires": { + "from2": "^2.0.3" + } + }, + "fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=" + }, + "fs-es6": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs-es6/-/fs-es6-0.0.2.tgz", + "integrity": "sha1-fAc7deX+ypt/eGBAPboXcthwYDk=", + "requires": { + "babel-polyfill": "^6.23.0" + } + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "optional": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "optional": true + }, + "needle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "optional": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "optional": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "optional": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "optional": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gamma": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gamma/-/gamma-0.1.0.tgz", + "integrity": "sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA=" + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, + "geojson-vt": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", + "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-canvas-context": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", + "integrity": "sha1-1ue1C8TkyGNXzTnyJkeoS3NgHpM=" + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "get-view": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/get-view/-/get-view-0.1.3.tgz", + "integrity": "sha1-NmCsBYuhPfl0nKvKpry5bUGqDqA=", + "requires": { + "isobject": "^3.0.0", + "match-file": "^0.2.1" + } + }, + "git-config-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz", + "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=", + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "homedir-polyfill": "^1.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "git-repo-name": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/git-repo-name/-/git-repo-name-0.6.0.tgz", + "integrity": "sha1-rwmIRlaqU37GJccIcAgXXNYSKP8=", + "requires": { + "cwd": "^0.9.1", + "file-name": "^0.1.0", + "lazy-cache": "^1.0.4", + "remote-origin-url": "^0.5.1" + } + }, + "gitbook-plugin-github": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gitbook-plugin-github/-/gitbook-plugin-github-2.0.0.tgz", + "integrity": "sha1-UWbnY8/MQC1DKIC3pshcHFS1ao0=", + "dev": true + }, + "gl-axes3d": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.5.2.tgz", + "integrity": "sha512-47Cfh5KhUVRFtYXgufR4lGY5cyXH7SPgAlS1FlvTGK84spIYFCBMlOGUN3AdavGLGUOcXS4ml+tMM61cY6M3gg==", + "requires": { + "bit-twiddle": "^1.0.2", + "dup": "^1.0.0", + "extract-frustum-planes": "^1.0.0", + "gl-buffer": "^2.1.2", + "gl-mat4": "^1.2.0", + "gl-shader": "^4.2.1", + "gl-state": "^1.0.0", + "gl-vao": "^1.3.0", + "gl-vec4": "^1.0.1", + "glslify": "^7.0.0", + "robust-orientation": "^1.1.3", + "split-polygon": "^1.0.0", + "vectorize-text": "^3.2.1" + } + }, + "gl-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gl-buffer/-/gl-buffer-2.1.2.tgz", + "integrity": "sha1-LbjZwaVSf7oM25EonCBuiCuInNs=", + "requires": { + "ndarray": "^1.0.15", + "ndarray-ops": "^1.1.0", + "typedarray-pool": "^1.0.0" + } + }, + "gl-cone3d": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.5.1.tgz", + "integrity": "sha512-R8m2lPfVN5ip/IPzykvMNgUUGWTkp9rMuCrVknKIkhjH+gaQeGfwF3+WrB0kwq3FRWvlYWcfdvabv37sZ2rKYA==", + "requires": { + "colormap": "^2.3.1", + "gl-buffer": "^2.1.2", + "gl-mat4": "^1.2.0", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.1.0", + "gl-vao": "^1.3.0", + "gl-vec3": "^1.1.3", + "glsl-inverse": "^1.0.0", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-cook-torrance": "^2.0.1", + "glslify": "^7.0.0", + "ndarray": "^1.0.18" + } + }, + "gl-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-constants/-/gl-constants-1.0.0.tgz", + "integrity": "sha1-WXpQTjZHUP9QJTqjX43qevSl0jM=" + }, + "gl-contour2d": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/gl-contour2d/-/gl-contour2d-1.1.6.tgz", + "integrity": "sha512-n8nEFb4VRYooBo3+hbAgiXGELVn7PtYyVbj/hWmTNtrkxFK39Yr8LUczcT2uOOyzqq7sO3FH8+J8PSMFh+z+5A==", + "requires": { + "binary-search-bounds": "^2.0.4", + "cdt2d": "^1.0.0", + "clean-pslg": "^1.1.2", + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "glslify": "^7.0.0", + "iota-array": "^1.0.0", + "ndarray": "^1.0.18", + "surface-nets": "^1.0.2" + } + }, + "gl-error3d": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.15.tgz", + "integrity": "sha512-7mB1zU22Vzdvq0KzzYRzE0xvCRF9nHd1+9ElUqkvt0GMH0gVIpxKk+m3hNPM/iQHmNupcXaE1cBcOQE2agN3uA==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "gl-vao": "^1.3.0", + "glsl-out-of-range": "^1.0.4", + "glslify": "^7.0.0" + } + }, + "gl-fbo": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/gl-fbo/-/gl-fbo-2.0.5.tgz", + "integrity": "sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI=", + "requires": { + "gl-texture2d": "^2.0.0" + } + }, + "gl-format-compiler-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz", + "integrity": "sha1-DHmxdRiZzpcy6GJA8JCqQemEcag=", + "requires": { + "add-line-numbers": "^1.0.1", + "gl-constants": "^1.0.0", + "glsl-shader-name": "^1.0.0", + "sprintf-js": "^1.0.3" + } + }, + "gl-heatmap2d": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/gl-heatmap2d/-/gl-heatmap2d-1.0.5.tgz", + "integrity": "sha512-nki9GIh0g4OXKNIrlnAT/gy/uXxkwrFKgI+XwRcUO6nLBM1WbI2hl8EPykNFXCqsyd08HJQbXKiqaHPW7cNpJg==", + "requires": { + "binary-search-bounds": "^2.0.3", + "gl-buffer": "^2.1.2", + "gl-shader": "^4.0.5", + "glslify": "^7.0.0", + "iota-array": "^1.0.0", + "typedarray-pool": "^1.1.0" + } + }, + "gl-line3d": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.1.11.tgz", + "integrity": "sha512-EitFKPEEYdn/ivFOxJ8khSi0BzNum4sXZFLq6SQq21MX5YPCYb0o+XzjpWNuU32BoXORBC78B1JTiQqnTaWhWQ==", + "requires": { + "binary-search-bounds": "^2.0.4", + "gl-buffer": "^2.0.8", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.0.2", + "gl-vao": "^1.1.3", + "glsl-out-of-range": "^1.0.4", + "glsl-read-float": "^1.0.0", + "glslify": "^7.0.0", + "ndarray": "^1.0.16" + } + }, + "gl-mat2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-mat2/-/gl-mat2-1.0.1.tgz", + "integrity": "sha1-FCUFcwpcL+Hp8l2ezj0NbMJxCjA=" + }, + "gl-mat3": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", + "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" + }, + "gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "gl-matrix": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.2.1.tgz", + "integrity": "sha512-YYVO8jUSf6+SakL4AJmx9Jc7zAZhkJQ+WhdtX3VQe5PJdCOX6/ybY4x1vk+h94ePnjRn6uml68+QxTAJneUpvA==" + }, + "gl-matrix-invert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-matrix-invert/-/gl-matrix-invert-1.0.0.tgz", + "integrity": "sha1-o2173jZUxFkKEn7nxo9uE/6oxj0=", + "requires": { + "gl-mat2": "^1.0.0", + "gl-mat3": "^1.0.0", + "gl-mat4": "^1.0.0" + } + }, + "gl-mesh3d": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.3.0.tgz", + "integrity": "sha512-iKx3v0xB/6Kej+GpMHhxzW6ziqiIjp6WOyAbuXvBRN9P5iIgzifgBYnDd1mYmCLWGmf85MCki/FvD223BOYFxg==", + "requires": { + "barycentric": "^1.0.1", + "colormap": "^2.3.1", + "gl-buffer": "^2.0.8", + "gl-mat4": "^1.0.0", + "gl-shader": "^4.2.1", + "gl-texture2d": "^2.0.8", + "gl-vao": "^1.1.3", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-cook-torrance": "^2.0.1", + "glslify": "^7.0.0", + "ndarray": "^1.0.15", + "normals": "^1.0.1", + "polytope-closest-point": "^1.0.0", + "simplicial-complex-contour": "^1.0.0", + "typedarray-pool": "^1.1.0" + } + }, + "gl-plot2d": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/gl-plot2d/-/gl-plot2d-1.4.3.tgz", + "integrity": "sha512-Ei6WC/SzQ7/qld8MMv7sWrFSdkq8/n7Xmdvj7sbwUkgsJirfknKfeq4DCwaMn9vD2rHOLmdT0NMW+HPrLKSeWQ==", + "requires": { + "binary-search-bounds": "^2.0.4", + "gl-buffer": "^2.1.2", + "gl-select-static": "^2.0.5", + "gl-shader": "^4.2.1", + "glsl-inverse": "^1.0.0", + "glslify": "^7.0.0", + "text-cache": "^4.2.1" + } + }, + "gl-plot3d": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-2.4.4.tgz", + "integrity": "sha512-R/V4hSrE2sFD+Xls7D6qCOlWCRmqtUff0sKbeFJdI91HfFzPJPiy9Pqa/Jh2UsvdmwkkSQPNDcBvLd6TvhRC/g==", + "requires": { + "3d-view": "^2.0.0", + "a-big-triangle": "^1.0.3", + "gl-axes3d": "^1.5.2", + "gl-fbo": "^2.0.5", + "gl-mat4": "^1.2.0", + "gl-select-static": "^2.0.4", + "gl-shader": "^4.2.1", + "gl-spikes3d": "^1.0.9", + "glslify": "^7.0.0", + "has-passive-events": "^1.0.0", + "is-mobile": "^2.2.0", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "ndarray": "^1.0.18", + "right-now": "^1.0.0" + } + }, + "gl-pointcloud2d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gl-pointcloud2d/-/gl-pointcloud2d-1.0.2.tgz", + "integrity": "sha512-KDfuJLg1dFWNPo6eJYgwUpNdVcIdK5y29ZiYpzzP0qh3eg0bSLMq8ZkaqvPmSJsFksUryT73IRunsuxJtTJkvA==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "glslify": "^7.0.0", + "typedarray-pool": "^1.1.0" + } + }, + "gl-quat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", + "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", + "requires": { + "gl-mat3": "^1.0.0", + "gl-vec3": "^1.0.3", + "gl-vec4": "^1.0.0" + } + }, + "gl-scatter3d": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.2.2.tgz", + "integrity": "sha512-oZh3WQ0bVXnpASpZmYmiEp7eUiD0oU6J4G5C9KUOhUo5d2gucvZEILAtfWmzCT3zsOltoROn4jGuuP2tlLN88Q==", + "requires": { + "gl-buffer": "^2.0.6", + "gl-mat4": "^1.0.0", + "gl-shader": "^4.2.0", + "gl-vao": "^1.1.2", + "glsl-out-of-range": "^1.0.4", + "glslify": "^7.0.0", + "is-string-blank": "^1.0.1", + "typedarray-pool": "^1.0.2", + "vectorize-text": "^3.2.1" + } + }, + "gl-select-box": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gl-select-box/-/gl-select-box-1.0.3.tgz", + "integrity": "sha512-sQb18g1aZ6PJAsvsC8nNYhuhc2TYXNbzVbI0bP9AH9770NjrDnd7TC8HHcfu8nJXGPG69HjqR6EzS+QSqiXPSA==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.0.5", + "glslify": "^7.0.0" + } + }, + "gl-select-static": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/gl-select-static/-/gl-select-static-2.0.5.tgz", + "integrity": "sha512-8H1M9ipHNsrVh8UjUmTv1xhhYjYzMnawAnw3n715Dh4DDoW32F3oBi80ev5qbJtQlvHrNkhHKuoMCJKBjfIt4g==", + "requires": { + "bit-twiddle": "^1.0.2", + "cwise": "^1.0.3", + "gl-fbo": "^2.0.3", + "ndarray": "^1.0.15", + "typedarray-pool": "^1.1.0" + } + }, + "gl-shader": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gl-shader/-/gl-shader-4.2.1.tgz", + "integrity": "sha1-vJuAjpKTxRtmjojeYVsMETcI3C8=", + "requires": { + "gl-format-compiler-error": "^1.0.2", + "weakmap-shim": "^1.1.0" + } + }, + "gl-spikes2d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz", + "integrity": "sha512-QVeOZsi9nQuJJl7NB3132CCv5KA10BWxAY2QgJNsKqbLsG53B/TrGJpjIAohnJftdZ4fT6b3ZojWgeaXk8bOOA==" + }, + "gl-spikes3d": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/gl-spikes3d/-/gl-spikes3d-1.0.9.tgz", + "integrity": "sha512-laMxydgGdnE8kvd1YD9cNWrx0uSmrPj1Oi02cHhnxWIklut97w3F7mZKnmLMEyUkxpRLkEeQ7YkYy7Y+aUEblw==", + "requires": { + "gl-buffer": "^2.1.2", + "gl-shader": "^4.2.1", + "gl-vao": "^1.3.0", + "glslify": "^7.0.0" + } + }, + "gl-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-state/-/gl-state-1.0.0.tgz", + "integrity": "sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc=", + "requires": { + "uniq": "^1.0.0" + } + }, + "gl-streamtube3d": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.4.0.tgz", + "integrity": "sha512-WgRtdB77uFCN1lBZ6ogz7VTK4J8WwW5DGHvyB3LaBSZF3t5lf/KWeXPgm+xnNINlOy4JqJIgny+CtzwTHAk3Ew==", + "requires": { + "gl-cone3d": "^1.5.0", + "gl-vec3": "^1.1.3", + "gl-vec4": "^1.0.1", + "glsl-inverse": "^1.0.0", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-cook-torrance": "^2.0.1", + "glslify": "^7.0.0" + } + }, + "gl-surface3d": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.4.6.tgz", + "integrity": "sha512-aItWQTNUX3JJc6i2FbXX82ljPZgDV3kXzkzANcBGoAnKwRpJw12WcMKKTL4sOCs9BW+3sx6BhR0P5+2zh5Scfw==", + "requires": { + "binary-search-bounds": "^2.0.4", + "bit-twiddle": "^1.0.2", + "colormap": "^2.3.1", + "dup": "^1.0.0", + "gl-buffer": "^2.0.3", + "gl-mat4": "^1.0.0", + "gl-shader": "^4.2.0", + "gl-texture2d": "^2.0.0", + "gl-vao": "^1.1.1", + "glsl-out-of-range": "^1.0.4", + "glsl-specular-beckmann": "^1.1.2", + "glslify": "^7.0.0", + "ndarray": "^1.0.16", + "ndarray-gradient": "^1.0.0", + "ndarray-ops": "^1.2.1", + "ndarray-pack": "^1.0.1", + "ndarray-scratch": "^1.1.1", + "surface-nets": "^1.0.2", + "typedarray-pool": "^1.0.0" + } + }, + "gl-text": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.1.8.tgz", + "integrity": "sha512-whnq9DEFYbW92C4ONwk2eT0YkzmVPHoADnEtuzMOmit87XhgAhBrNs3lK9EgGjU/MoWYvlF6RkI8Kl7Yuo1hUw==", + "requires": { + "bit-twiddle": "^1.0.2", + "color-normalize": "^1.5.0", + "css-font": "^1.2.0", + "detect-kerning": "^2.1.2", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "font-atlas": "^2.1.0", + "font-measure": "^1.2.2", + "gl-util": "^3.1.2", + "is-plain-obj": "^1.1.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "parse-unit": "^1.0.1", + "pick-by-alias": "^1.2.0", + "regl": "^1.3.11", + "to-px": "^1.0.1", + "typedarray-pool": "^1.1.0" + } + }, + "gl-texture2d": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gl-texture2d/-/gl-texture2d-2.1.0.tgz", + "integrity": "sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c=", + "requires": { + "ndarray": "^1.0.15", + "ndarray-ops": "^1.2.2", + "typedarray-pool": "^1.1.0" + } + }, + "gl-util": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.2.tgz", + "integrity": "sha512-8czWhGTGp/H4S35X1UxGbFlJ1hjtTFhm2mc85GcymEi1CDf633WJgtkCddEiSjIa4BnNxBrqOIhj6jlF6naPqw==", + "requires": { + "is-browser": "^2.0.1", + "is-firefox": "^1.0.3", + "is-plain-obj": "^1.1.0", + "number-is-integer": "^1.0.1", + "object-assign": "^4.1.0", + "pick-by-alias": "^1.2.0", + "weak-map": "^1.0.5" + } + }, + "gl-vao": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-vao/-/gl-vao-1.3.0.tgz", + "integrity": "sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM=" + }, + "gl-vec3": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", + "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" + }, + "gl-vec4": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", + "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q=", + "requires": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-inverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-inverse/-/glsl-inverse-1.0.0.tgz", + "integrity": "sha1-EsCx0GX1WERNHm/q95td34qRiuY=" + }, + "glsl-out-of-range": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz", + "integrity": "sha512-fCcDu2LCQ39VBvfe1FbhuazXEf0CqMZI9OYXrYlL6uUARG48CTAbL04+tZBtVM0zo1Ljx4OLu2AxNquq++lxWQ==" + }, + "glsl-read-float": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-read-float/-/glsl-read-float-1.1.0.tgz", + "integrity": "sha1-37CIsBYtz8xW/E7d0vhuGMrDLyY=" + }, + "glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", + "requires": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=" + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=" + } + } + }, + "glsl-shader-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz", + "integrity": "sha1-osMLO6c0mb77DMcYTXx3M91LSH0=", + "requires": { + "atob-lite": "^1.0.0", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-specular-beckmann": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz", + "integrity": "sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE=" + }, + "glsl-specular-cook-torrance": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz", + "integrity": "sha1-qJHMBsjHtPRyhwK0gk/ay7ln148=", + "requires": { + "glsl-specular-beckmann": "^1.1.1" + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=" + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", + "requires": { + "glsl-tokenizer": "^2.0.0" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=" + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", + "requires": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha1-4QFfWYDBCRgkraomJfHf3ovQADQ=" + }, + "glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=" + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E=" + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha1-WUQdL4V958NEnJRWZgIezjWOSOw=" + }, + "glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA=" + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "requires": { + "through2": "^0.6.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glslify": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.0.0.tgz", + "integrity": "sha512-yw8jDQIe9FlSH5NiZEqSAsCPj9HI7nhXgXLAgSv2Nm9eBPsFJmyN9+rNwbiozJapcj9xtc/71rMYlN9cxp1B8Q==", + "requires": { + "bl": "^1.0.0", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.0", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.0", + "through2": "^2.0.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "requires": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.1.tgz", + "integrity": "sha512-Ogm179MCazwIRyEqs3g3EOY4Y3XIAa0yl8J5RE9rJC6QH1w8weVOp2RZu0mvnYy/2xIas1w166YR2eZdDkWQxg==", + "requires": { + "@choojs/findup": "^0.2.0", + "events": "^1.0.2", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + }, + "gray-matter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-3.1.1.tgz", + "integrity": "sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA==", + "requires": { + "extend-shallow": "^2.0.1", + "js-yaml": "^3.10.0", + "kind-of": "^5.0.2", + "strip-bom-string": "^1.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + } + } + }, + "grid-index": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", + "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" + }, + "group-array": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/group-array/-/group-array-0.3.4.tgz", + "integrity": "sha512-YAmNsgsi1uQ7Ai3T4FFkMoskqbLEUPRajAmrn8FclwZQQnV98NLrNWjQ3n2+i1pANxdO3n6wsNEkKq5XrYy0Ow==", + "requires": { + "arr-flatten": "^1.0.1", + "for-own": "^0.1.4", + "get-value": "^2.0.6", + "kind-of": "^3.1.0", + "split-string": "^1.0.1", + "union-value": "^1.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "split-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-1.0.1.tgz", + "integrity": "sha1-vLqz9BUqzuOg1qskecDSh5w9s84=", + "requires": { + "extend-shallow": "^2.0.1" + } + } + } + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp-choose-files": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/gulp-choose-files/-/gulp-choose-files-0.1.3.tgz", + "integrity": "sha1-hrFfBjAHOrZz1XJb7sY+qhSFUPk=", + "requires": { + "extend-shallow": "^2.0.1", + "question-cache": "^0.5.1", + "through2": "^2.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "requires": { + "convert-source-map": "^1.1.1", + "graceful-fs": "^4.1.2", + "strip-bom": "^2.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz", + "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=", + "requires": { + "is-glob": "^2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "has-hover": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", + "integrity": "sha1-PZdDeusZnGK4rAisvcU9O8UsF/c=", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-own-deep": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-own-deep/-/has-own-deep-0.1.4.tgz", + "integrity": "sha1-kesM2ieAgxWPgEKigxZDTpr+eHY=" + }, + "has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "helper-cache": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/helper-cache/-/helper-cache-0.7.2.tgz", + "integrity": "sha1-AkVixLS4sqsqtTHQC+FuxJZRi5A=", + "requires": { + "extend-shallow": "^2.0.1", + "lazy-cache": "^0.2.3", + "lodash.bind": "^3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-cache-semantics": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", + "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-3.0.0.tgz", + "integrity": "sha512-uGuJaBWQWDQCJI5ip0d/VTYZW0nRrlLWXA4A7P1jrsa+f77rW2yXz315oBt6zGCF6l8C2tlMxY7ffULCj+5FhA==", + "requires": { + "agent-base": "5", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "requires": { + "agent-base": "5", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ify-loader": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ify-loader/-/ify-loader-1.1.0.tgz", + "integrity": "sha512-EiyC45FRIs+z4g98+jBzuYCfoM6TKG9p7Ek5YZUeM7rucNucaMZIseRj/5Q3I4ypkZXyC2wnU1RcYrVmshe2xw==", + "requires": { + "bl": "^1.0.0", + "findup": "^0.1.5", + "from2-array": "0.0.4", + "map-limit": "0.0.1", + "multipipe": "^0.3.0", + "read-package-json": "^2.0.2", + "resolve": "^1.1.6" + }, + "dependencies": { + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" + }, + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=" + }, + "findup": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + } + } + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-palette": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/image-palette/-/image-palette-2.1.0.tgz", + "integrity": "sha512-3ImSEWD26+xuQFdP0RWR4WSXadZwvgrFhjGNpMEapTG1tf2XrBFS2dlKK5hNgH4UIaSQlSUFRn1NeA+zULIWbQ==", + "requires": { + "color-id": "^1.1.0", + "pxls": "^2.0.0", + "quantize": "^1.0.2" + } + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "incremental-convex-hull": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz", + "integrity": "sha1-UUKMFMudmmFEv+abKFH7N3M0vh4=", + "requires": { + "robust-orientation": "^1.1.2", + "simplicial-complex": "^1.0.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "info-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz", + "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang=" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", + "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + } + } + }, + "inquirer2": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inquirer2/-/inquirer2-0.1.1.tgz", + "integrity": "sha1-vFQkqBQ1fEHmXi6Vf+U2ruqb8fY=", + "requires": { + "ansi-escapes": "^1.1.1", + "ansi-regex": "^2.0.0", + "arr-flatten": "^1.0.1", + "arr-pluck": "^0.1.0", + "array-unique": "^0.2.1", + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-width": "^1.1.0", + "extend-shallow": "^2.0.1", + "figures": "^1.4.0", + "is-number": "^2.1.0", + "is-plain-object": "^2.0.1", + "lazy-cache": "^1.0.3", + "lodash.where": "^3.1.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^4.0.7", + "strip-color": "^0.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-width": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", + "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "requires": { + "once": "^1.3.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "interactjs": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.8.4.tgz", + "integrity": "sha512-otuS3ujYXBEhwRPamNgky/j8FE8CkHQZ9m6/yETIxZKRHcOtlEeCA/tq5AH5ibB3lRLszFOMzQ9ieoA6PBMORA==", + "requires": { + "@interactjs/interactjs": "1.8.4", + "@interactjs/types": "1.8.4" + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "intersection-observer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.5.1.tgz", + "integrity": "sha512-Zd7Plneq82kiXFixs7bX62YnuZ0BMRci9br7io88LwDyF3V43cQMI+G5IiTlTNTt+LsDUppl19J/M2Fp9UkH6g==" + }, + "interval-tree-1d": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.3.tgz", + "integrity": "sha1-j9veArayx9verWNry+2OCHENhcE=", + "requires": { + "binary-search-bounds": "^1.0.0" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "invert-permutation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-permutation/-/invert-permutation-1.0.0.tgz", + "integrity": "sha1-oKeAQurbNrwXVR54fv0UOa3VSTM=" + }, + "iota-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", + "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "requires": { + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" + }, + "dependencies": { + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + } + } + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-answer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-answer/-/is-answer-0.1.1.tgz", + "integrity": "sha1-zBwvGG+FzyZQIgveNZ2GIYfUnLY=", + "requires": { + "has-values": "^0.1.4", + "is-primitive": "^2.0.0", + "omit-empty": "^0.4.1" + }, + "dependencies": { + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-base64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-base64/-/is-base64-0.1.0.tgz", + "integrity": "sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==" + }, + "is-binary-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-binary-buffer/-/is-binary-buffer-1.0.0.tgz", + "integrity": "sha1-vGAxKQtly/eZudlQK1D9U3VSQAc=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==" + }, + "is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI=" + }, + "is-float-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-float-array/-/is-float-array-1.0.0.tgz", + "integrity": "sha512-4ew1Sx6B6kEAl3T3NOM0yB94J3NZnBdNt4paw0e8nY73yHHTeTEhyQ3Lj7EQEnv5LD+GxNTaT4L46jcKjjpLiQ==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", + "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=" + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, + "is-mobile": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.1.tgz", + "integrity": "sha512-6zELsfVFr326eq2CI53yvqq6YBanOxKBybwDT+MbMS2laBnK6Ez8m5XHSuTQQbnKRfpDzCod1CMWW5q3wZYMvA==" + }, + "is-npm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz", + "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA==" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-registered": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/is-registered/-/is-registered-0.1.5.tgz", + "integrity": "sha1-HTRpd0GdZl4qxshAE1NWheb3b38=", + "requires": { + "define-property": "^0.2.5", + "isobject": "^2.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "requires": { + "is-unc-path": "^0.1.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-string-blank": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-svg-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", + "integrity": "sha1-d6tZDBKz0gNI5cehPQBAyHeE3aA=" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "requires": { + "unc-path-regex": "^0.1.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-valid-app": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-valid-app/-/is-valid-app-0.2.1.tgz", + "integrity": "sha1-Zc8ZW71xvXdssWGZHGhCSNZd/4k=", + "requires": { + "debug": "^2.2.0", + "is-registered": "^0.1.5", + "is-valid-instance": "^0.2.0", + "lazy-cache": "^2.0.1" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" + }, + "is-valid-instance": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-valid-instance/-/is-valid-instance-0.2.0.tgz", + "integrity": "sha1-4an/EQa4y64AB+pqIPidVGoqWg8=", + "requires": { + "isobject": "^2.1.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=" + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-parse-even-better-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.0.1.tgz", + "integrity": "sha512-XFY2Mbnmg+8r7MRsxfArVkZcfjxGlF/NjM3LsPXVeCX/GBF/1FTCv+idHBYC4qLPtK7q8HC8bapLoWqnhP/bXw==" + }, + "json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "requires": { + "jju": "^1.1.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "kapsule": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.12.1.tgz", + "integrity": "sha512-vFbJfsDOU0I96UsRIMUHzI5CbHoy+X8ddzY19Llv7qI+eHX0AAqZVk/WfS6xqwcR4X/glnqLY9zjqAiz+C3vhw==", + "requires": { + "debounce": "^1.2.0" + } + }, + "kdbush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", + "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "layouts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/layouts/-/layouts-0.11.0.tgz", + "integrity": "sha1-xiDos8uI/IxJLbRTin3VQKTffyI=", + "requires": { + "delimiter-regex": "^1.3.1", + "falsey": "^0.3.0", + "get-view": "^0.1.1", + "lazy-cache": "^1.0.3" + }, + "dependencies": { + "delimiter-regex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/delimiter-regex/-/delimiter-regex-1.3.1.tgz", + "integrity": "sha1-Y4XK4UAE28DBzY3//+uGPVGZnv8=", + "requires": { + "extend-shallow": "^1.1.2" + } + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + } + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "lerp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lerp/-/lerp-1.0.3.tgz", + "integrity": "sha1-oYyJaPkXiW3hXM/MKNVaa3Med24=" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "libnpmconfig": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", + "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + } + } + }, + "load-helpers": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/load-helpers/-/load-helpers-0.2.11.tgz", + "integrity": "sha1-9L2LIYQ1wFLl4536dxMinVcepCM=", + "requires": { + "extend-shallow": "^2.0.1", + "is-valid-glob": "^0.3.0", + "lazy-cache": "^2.0.1", + "matched": "^0.4.1", + "resolve-dir": "^0.1.0" + }, + "dependencies": { + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "^1.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "matched": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", + "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "glob": "^7.0.5", + "has-glob": "^0.1.1", + "is-valid-glob": "^0.3.0", + "lazy-cache": "^2.0.1", + "resolve-dir": "^0.1.0" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "load-pkg": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/load-pkg/-/load-pkg-3.0.1.tgz", + "integrity": "sha1-kjCzfsBOVpADBgvFiVHj7VCNWU8=", + "requires": { + "find-pkg": "^0.1.0" + } + }, + "load-templates": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/load-templates/-/load-templates-0.11.4.tgz", + "integrity": "sha1-zyk977a1hg/1uMRJ2qHAx7tyjek=", + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "glob-parent": "^2.0.0", + "has-glob": "^0.1.1", + "is-valid-glob": "^0.3.0", + "lazy-cache": "^2.0.1", + "matched": "^0.4.1", + "to-file": "^0.2.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "^1.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "matched": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz", + "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=", + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.0", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "glob": "^7.0.5", + "has-glob": "^0.1.1", + "is-valid-glob": "^0.3.0", + "lazy-cache": "^2.0.1", + "resolve-dir": "^0.1.0" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + } + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", + "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz", + "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw==" + }, + "lodash._arrayfilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayfilter/-/lodash._arrayfilter-3.0.0.tgz", + "integrity": "sha1-LevhHuxp5dzG9LhhNxKKSPFSQjc=" + }, + "lodash._basecallback": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", + "integrity": "sha1-t7K7Q9whYEJKIczybFfkQ3cqjic=", + "requires": { + "lodash._baseisequal": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.pairs": "^3.0.0" + } + }, + "lodash._baseeach": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", + "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash._basefilter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basefilter/-/lodash._basefilter-3.0.0.tgz", + "integrity": "sha1-S3ZAPfDihtA9Xg9yle00QeEB0SE=", + "requires": { + "lodash._baseeach": "^3.0.0" + } + }, + "lodash._baseisequal": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", + "integrity": "sha1-2AJfdjOdKTQnZ9zIh85cuVpbUfE=", + "requires": { + "lodash.isarray": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._baseismatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lodash._baseismatch/-/lodash._baseismatch-3.1.3.tgz", + "integrity": "sha1-Byj8SO+hFpnT1fLXMEnyqxPED9U=", + "requires": { + "lodash._baseisequal": "^3.0.0" + } + }, + "lodash._basematches": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._basematches/-/lodash._basematches-3.2.0.tgz", + "integrity": "sha1-9H4D8H7CB4SrCWjQy2y1l+IQEVg=", + "requires": { + "lodash._baseismatch": "^3.0.0", + "lodash.pairs": "^3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._createwrapper": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-3.2.0.tgz", + "integrity": "sha1-30U+ZkFjIXuJWkVAZa8cR6DqPE0=", + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._replaceholders": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._replaceholders/-/lodash._replaceholders-3.0.0.tgz", + "integrity": "sha1-iru3EmxDH37XRPe6rznwi8m9nVg=" + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, + "lodash.bind": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-3.1.0.tgz", + "integrity": "sha1-+V9IY419i7tYVPkIJmUnmZ+/pLs=", + "requires": { + "lodash._createwrapper": "^3.0.0", + "lodash._replaceholders": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.initial": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.initial/-/lodash.initial-4.1.1.tgz", + "integrity": "sha1-5T9kiRJl3cQE6YbSwo93vtlDWRo=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.last": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash.last/-/lodash.last-3.0.0.tgz", + "integrity": "sha1-JC9mMRLdTG5jcoxgo8kJ0b2tvUw=" + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.pairs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", + "integrity": "sha1-u+CNV4bu6qCaFckevw3LfSvjJqk=", + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "lodash.where": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.where/-/lodash.where-3.1.0.tgz", + "integrity": "sha1-LnhLnJM2jV11qu4zLOF2Ai8rlVM=", + "requires": { + "lodash._arrayfilter": "^3.0.0", + "lodash._basecallback": "^3.0.0", + "lodash._basefilter": "^3.0.0", + "lodash._basematches": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "log-ok": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", + "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=", + "requires": { + "ansi-green": "^0.1.1", + "success-symbol": "^0.1.0" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "log-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz", + "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=", + "requires": { + "ansi-colors": "^0.2.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + }, + "dependencies": { + "ansi-colors": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz", + "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=", + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^2.0.1" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "magic-string": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.6.tgz", + "integrity": "sha512-3a5LOMSGoCTH5rbqobC2HuDNRtE2glHZ8J7pK+QZYppyWA36yuNpsX994rIY2nCuyP7CZYy7lQq/X2jygiZ89g==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-7.1.0.tgz", + "integrity": "sha512-/5ICTcpd4ApIRn76pxcl4aQhrWxdDCnRDy3y+Tu7DbRsfqde6q8OYXUm7bYhH5dSey590AMT0RH9LDFq7v5KRA==", + "requires": { + "agentkeepalive": "^4.1.0", + "cacache": "^13.0.1", + "http-cache-semantics": "^4.0.3", + "http-proxy-agent": "^3.0.0", + "https-proxy-agent": "^4.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.1.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^7.0.1" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "fs-minipass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", + "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + } + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-config": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/map-config/-/map-config-0.5.0.tgz", + "integrity": "sha1-FwJgfiZ696NwyKnQxiumUk/rb+U=", + "requires": { + "array-unique": "^0.2.1", + "async": "^1.5.2" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + } + } + } + }, + "map-schema": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/map-schema/-/map-schema-0.2.4.tgz", + "integrity": "sha1-wZVRg0/DwHoEWXt6WvtEpHWvlbQ=", + "requires": { + "arr-union": "^3.1.0", + "collection-visit": "^0.2.3", + "component-emitter": "^1.2.1", + "debug": "^2.6.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "get-value": "^2.0.6", + "is-primitive": "^2.0.0", + "kind-of": "^3.1.0", + "lazy-cache": "^2.0.2", + "log-utils": "^0.2.1", + "longest": "^1.0.1", + "mixin-deep": "^1.1.3", + "object.omit": "^2.0.1", + "object.pick": "^1.2.0", + "omit-empty": "^0.4.1", + "pad-right": "^0.2.2", + "set-value": "^0.4.0", + "sort-object-arrays": "^0.1.1", + "union-value": "^0.2.3" + }, + "dependencies": { + "collection-visit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", + "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", + "requires": { + "lazy-cache": "^2.0.1", + "map-visit": "^0.1.5", + "object-visit": "^0.3.4" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "map-visit": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", + "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", + "requires": { + "lazy-cache": "^2.0.1", + "object-visit": "^0.3.4" + } + }, + "object-visit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", + "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", + "requires": { + "isobject": "^2.0.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + }, + "union-value": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", + "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + } + } + } + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "mapbox-gl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.3.2.tgz", + "integrity": "sha512-6Ro7GbTMWxcbc836m6rbBNkesgTncbE1yXWeuHlr89esSqaItKr0+ntOu8rZie3fv+GtitkbODysXzIGCA7G+w==", + "requires": { + "@mapbox/geojson-rewind": "^0.4.0", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^1.4.0", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^1.1.0", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "csscolorparser": "~1.0.2", + "earcut": "^2.1.5", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.0.0", + "grid-index": "^1.1.0", + "minimist": "0.0.8", + "murmurhash-js": "^1.0.0", + "pbf": "^3.0.5", + "potpack": "^1.0.1", + "quickselect": "^2.0.0", + "rw": "^1.3.3", + "supercluster": "^6.0.1", + "tinyqueue": "^2.0.0", + "vt-pbf": "^3.1.1" + } + }, + "marching-simplex-table": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz", + "integrity": "sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo=", + "requires": { + "convex-hull": "^1.0.3" + } + }, + "mat4-decompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", + "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2" + } + }, + "mat4-interpolate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", + "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2", + "mat4-decompose": "^1.0.3", + "mat4-recompose": "^1.0.3", + "quat-slerp": "^1.0.0" + } + }, + "mat4-recompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", + "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", + "requires": { + "gl-mat4": "^1.0.1" + } + }, + "match-file": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/match-file/-/match-file-0.2.2.tgz", + "integrity": "sha1-Jua88bOQpmH2Em+visUB4z7M+uk=", + "requires": { + "is-glob": "^3.1.0", + "isobject": "^3.0.0", + "micromatch": "^2.3.11" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + } + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "matched": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/matched/-/matched-1.0.2.tgz", + "integrity": "sha512-7ivM1jFZVTOOS77QsR+TtYHH0ecdLclMkqbf5qiJdX2RorqfhsL65QHySPZgDE0ZjHoh+mQUNHTanNXIlzXd0Q==", + "requires": { + "arr-union": "^3.1.0", + "async-array-reduce": "^0.2.1", + "glob": "^7.1.2", + "has-glob": "^1.0.0", + "is-valid-glob": "^1.0.0", + "resolve-dir": "^1.0.0" + }, + "dependencies": { + "has-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz", + "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=", + "requires": { + "is-glob": "^3.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" + } + } + }, + "math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=" + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "matrix-camera-controller": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.3.tgz", + "integrity": "sha1-NeUmDMHNVQliunmfLY1OlLGjk3A=", + "requires": { + "binary-search-bounds": "^1.0.0", + "gl-mat4": "^1.1.2", + "gl-vec3": "^1.0.3", + "mat4-interpolate": "^1.0.3" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdbvue": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/mdbvue/-/mdbvue-6.5.0.tgz", + "integrity": "sha512-OfQhhDasYqFIFDBmU64oT8xmEp3Ng1q8YYGHccgPMXxtPmnTdi23m2+uZnVLO5rkFmv0RA7XQX679ggHmY+JjQ==", + "requires": { + "@fortawesome/fontawesome-free": "^5.11.2", + "axios": "^0.19.0", + "bootstrap-css-only": "^4.3.1", + "chart.js": "^2.8.0", + "core-js": "^3.1.2", + "moment": "^2.24.0", + "popper.js": "^1.16.0", + "vue": "^2.6.11", + "vue-chartjs": "^3.4.2", + "vue-clickaway": "^2.2.2", + "vue-numeric": "^2.3.0", + "vue-plugin-load-script": "^1.2.0", + "vue-router": "^3.1.3", + "vue2-perfect-scrollbar": "^1.2.1", + "vuex": "^3.1.2" + }, + "dependencies": { + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + } + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" + }, + "merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "dependencies": { + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + } + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "merge-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/merge-value/-/merge-value-1.0.0.tgz", + "integrity": "sha512-fJMmvat4NeKz63Uv9iHWcPDjCWcCkoiRoajRTEO8hlhUC6rwaHg0QCF9hBOTjZmm4JuglPckPSTtcuJL5kp0TQ==", + "requires": { + "get-value": "^2.0.6", + "is-extendable": "^1.0.0", + "mixin-deep": "^1.2.0", + "set-value": "^2.0.0" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-fetch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", + "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-pipeline": "^1.2.2", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "monotone-convex-hull-2d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", + "integrity": "sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, + "mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "requires": { + "mouse-event": "^1.0.0" + } + }, + "mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" + }, + "mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" + }, + "mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", + "requires": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + }, + "dependencies": { + "signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "multipipe": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.3.1.tgz", + "integrity": "sha1-kmJVJXYboE/qoJYFtjgrziyR8R8=", + "requires": { + "duplexer2": "^0.1.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + } + } + }, + "mumath": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", + "integrity": "sha1-SNSg8P2MrU57Mglu6JsWGmPTC78=", + "requires": { + "almost-equal": "^1.1.0" + } + }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "nanoseconds": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/nanoseconds/-/nanoseconds-0.1.0.tgz", + "integrity": "sha1-aew5/NAOd6s6ct4KQzQoJM15Izo=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ndarray": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", + "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", + "requires": { + "iota-array": "^1.0.0", + "is-buffer": "^1.0.2" + } + }, + "ndarray-extract-contour": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz", + "integrity": "sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ=", + "requires": { + "typedarray-pool": "^1.0.0" + } + }, + "ndarray-fill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ndarray-fill/-/ndarray-fill-1.0.2.tgz", + "integrity": "sha1-owpg9xiODJWC/N1YiWrNy1IqHtY=", + "requires": { + "cwise": "^1.0.10" + } + }, + "ndarray-gradient": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-gradient/-/ndarray-gradient-1.0.0.tgz", + "integrity": "sha1-t0kaUVxqZJ8ZpiMk//byf8jCU5M=", + "requires": { + "cwise-compiler": "^1.0.0", + "dup": "^1.0.0" + } + }, + "ndarray-homography": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-homography/-/ndarray-homography-1.0.0.tgz", + "integrity": "sha1-w1UW6oa8KGK06ASiNqJwcwn+KWs=", + "requires": { + "gl-matrix-invert": "^1.0.0", + "ndarray-warp": "^1.0.0" + } + }, + "ndarray-linear-interpolate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz", + "integrity": "sha1-eLySuFuavBW25n7mWCj54hN65ys=" + }, + "ndarray-ops": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz", + "integrity": "sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4=", + "requires": { + "cwise-compiler": "^1.0.0" + } + }, + "ndarray-pack": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", + "integrity": "sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo=", + "requires": { + "cwise-compiler": "^1.1.2", + "ndarray": "^1.0.13" + } + }, + "ndarray-scratch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz", + "integrity": "sha1-YwRjbWLrqT20cnrBPGkzQdulDgE=", + "requires": { + "ndarray": "^1.0.14", + "ndarray-ops": "^1.2.1", + "typedarray-pool": "^1.0.2" + } + }, + "ndarray-sort": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-sort/-/ndarray-sort-1.0.1.tgz", + "integrity": "sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo=", + "requires": { + "typedarray-pool": "^1.0.0" + } + }, + "ndarray-warp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-warp/-/ndarray-warp-1.0.1.tgz", + "integrity": "sha1-qKElqqu6C+v5O9bKg+ar1oIqNOA=", + "requires": { + "cwise": "^1.0.4", + "ndarray-linear-interpolate": "^1.0.0" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nextafter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nextafter/-/nextafter-1.0.0.tgz", + "integrity": "sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo=", + "requires": { + "double-bits": "^1.1.0" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-alias": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-alias/-/node-alias-1.0.4.tgz", + "integrity": "sha1-HxuRa1a56iQcATX5fO1pQPVW8pI=", + "requires": { + "chalk": "^1.1.1", + "lodash": "^4.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.24.tgz", + "integrity": "sha512-wym2jptfuKowMmkZsfCSTsn8qAVo8zm+UiQA6l5dNqUcpfChZSnS/vbbpOeXczf+VdPhutxh+99lWHhdd6xKzg==", + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "noncharacters": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/noncharacters/-/noncharacters-1.1.0.tgz", + "integrity": "sha1-rzPfMP1Q7TxTzSAiWPJa2pC1QNI=" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-pkg": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/normalize-pkg/-/normalize-pkg-0.3.20.tgz", + "integrity": "sha1-Luc3FJUXhQ2c7/WmI0r174nFFag=", + "requires": { + "arr-union": "^3.1.0", + "array-unique": "^0.3.2", + "component-emitter": "^1.2.1", + "export-files": "^2.1.1", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "get-value": "^2.0.6", + "kind-of": "^3.0.4", + "lazy-cache": "^2.0.1", + "map-schema": "^0.2.3", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "omit-empty": "^0.4.1", + "parse-git-config": "^1.0.2", + "repo-utils": "^0.3.6", + "semver": "^5.3.0", + "stringify-author": "^0.1.3", + "write-json": "^0.2.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-svg-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", + "integrity": "sha1-RWNg5g7Odfvve11+FgSA5//Rb+U=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "normals": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normals/-/normals-1.1.0.tgz", + "integrity": "sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA=" + }, + "now-and-later": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-0.0.6.tgz", + "integrity": "sha1-GKFNw/xJXcBs++Ao8AvhbdrE+uo=", + "requires": { + "once": "^1.3.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-check-updates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-4.0.1.tgz", + "integrity": "sha512-rDrKAqhQuTYq2EkndroPMZGA9N6tpTotOVOIJoxRa3ZKnb/mOcq2TZv4A4LLSM8+9kZlP+sBwE+XAGh8wWZw/w==", + "requires": { + "chalk": "^3.0.0", + "cint": "^8.2.1", + "cli-table": "^0.3.1", + "commander": "^4.0.1", + "fast-diff": "^1.2.0", + "find-up": "4.1.0", + "get-stdin": "^7.0.0", + "json-parse-helpfulerror": "^1.0.3", + "libnpmconfig": "^1.2.1", + "lodash": "^4.17.15", + "node-alias": "^1.0.4", + "pacote": "^10.2.0", + "progress": "^2.0.3", + "prompts": "^2.3.0", + "rc-config-loader": "^3.0.0", + "requireg": "^0.2.2", + "semver": "^6.3.0", + "semver-utils": "^1.1.4", + "spawn-please": "^0.3.0", + "update-notifier": "^3.0.1" + }, + "dependencies": { + "commander": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", + "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-package-arg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.0.tgz", + "integrity": "sha512-JgqZHCEUKvhX7EehLNdySiuB227a0QYra9wpZOkW+jvwsRYKkce7y5Rv2axkxScJU1EP+L32jT2PLhQz7IWHlw==", + "requires": { + "hosted-git-info": "^3.0.2", + "osenv": "^0.1.5", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.2.tgz", + "integrity": "sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw==", + "requires": { + "lru-cache": "^5.1.1" + } + }, + "semver": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", + "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" + } + } + }, + "npm-packlist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.0.3.tgz", + "integrity": "sha512-geT5P1y+58INE/jlxBHNsucRX7jpZAgW+XkxAe1NWN7N9SNwpueWTUPRoVdJH+hFpqcdAChRUE/HWsXQI+8JaQ==", + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "npm-pick-manifest": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-5.0.0.tgz", + "integrity": "sha512-YUW9xObM7Y1OkQ/gSmU5VQyI3vCkG5lwOrdycw0dpj9/3dE8h9CKY8tVyHTIp50+mV8jOAGH4m4Lts7zz2rN4Q==", + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", + "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" + } + } + }, + "npm-registry-fetch": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-6.0.0.tgz", + "integrity": "sha512-TSzEzudrky0ArPskchM/7F5SrawBY5acMNtRqFuacEI2lCKEyfBjaENuuIU5Uq2CyHfJ+gWp5QlCprolKa5wKg==", + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^7.1.0", + "minipass": "^3.0.0", + "minipass-fetch": "^1.1.2", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0", + "safe-buffer": "^5.2.0", + "semver": "^7.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "semver": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", + "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-integer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", + "integrity": "sha1-5ZvKFy/+0nMY55x862y3LAlbIVI=", + "requires": { + "is-finite": "^1.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "numeric": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/numeric/-/numeric-1.2.6.tgz", + "integrity": "sha1-dlsCvvl5iPz4gNTrPza4D6MTNao=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.1.tgz", + "integrity": "sha512-HgcGMooY4JC2PBt9sdUdJ6PMzpin+YtY3r/7wg0uTifP+HJWW8rammseSEHuyt0UeShI183UGssCJqm1bJR7QA==", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "omit-empty": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/omit-empty/-/omit-empty-0.4.1.tgz", + "integrity": "sha1-KUo3gvLLIMdJfEEitiN8ncwMY6s=", + "requires": { + "has-values": "^0.1.4", + "kind-of": "^3.0.3", + "reduce-object": "^0.1.3" + }, + "dependencies": { + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "option-cache": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/option-cache/-/option-cache-3.5.0.tgz", + "integrity": "sha1-y3ZRVboqhhwRCf8m4qIOqgZhKys=", + "requires": { + "arr-flatten": "^1.0.3", + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^0.3.1", + "kind-of": "^3.2.2", + "lazy-cache": "^2.0.2", + "set-value": "^0.4.3", + "to-object-path": "^0.3.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", + "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "orbit-camera-controller": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", + "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.3" + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "pacote": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-10.3.0.tgz", + "integrity": "sha512-Qq4nZkTyjKvNWj0TKfV29Q9416RQ9hALPjU5ej6ckavV1WLcurc0aZqJBKcAf2OHX6RuE1fi0N+TBCP9EyM1+Q==", + "requires": { + "@npmcli/installed-package-contents": "^1.0.5", + "cacache": "^13.0.1", + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.1", + "minipass-fetch": "^1.2.1", + "npm-package-arg": "^8.0.0", + "npm-packlist": "^2.0.3", + "npm-pick-manifest": "^5.0.0", + "npm-registry-fetch": "^6.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.1", + "semver": "^7.1.1", + "ssri": "^7.1.0", + "tar": "^5.0.5", + "which": "^2.0.2" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "fs-minipass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", + "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.1.tgz", + "integrity": "sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A==" + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", + "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^0.5.0", + "yallist": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "pad-left": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-1.0.2.tgz", + "integrity": "sha1-GeVzXqmDlaJs7carkm6tEPMQDUw=", + "requires": { + "repeat-string": "^1.3.0" + } + }, + "pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", + "requires": { + "repeat-string": "^1.5.2" + } + }, + "paginationator": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/paginationator/-/paginationator-0.1.4.tgz", + "integrity": "sha1-hHht04UKrh8Ru7kRsMHghRtTgQY=" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "papaparse": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.1.1.tgz", + "integrity": "sha512-KPkW4GNQxunmYTeJIjHFrvilcNuHBWrfgbyvmagEmfGOA4hnP1WIkPbv4yABhj1Nam3as4w+7MBiI27BntwqVg==" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parcoord-es": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/parcoord-es/-/parcoord-es-2.2.10.tgz", + "integrity": "sha512-chFF/1Q0XuKO6PVGoOwHkXOykMn2bcTKKChFgPZZLBe3gY/bWaJNAp4tzqbCOUEhmQCRB6WsITbE4Jstbc/Yfg==", + "requires": { + "d3-array": "^1.2.1", + "d3-axis": "^1.0.8", + "d3-brush": "^1.0.4", + "d3-collection": "^1.0.4", + "d3-dispatch": "^1.0.3", + "d3-drag": "^1.2.1", + "d3-interpolate": "^1.2.0", + "d3-scale": "^2.1.0", + "d3-selection": "^1.3.0", + "d3-shape": "^1.2.0", + "d3-transition": "^1.1.1", + "requestanimationframe": "0.0.23", + "sylvester-es6": "0.0.2" + }, + "dependencies": { + "d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parenthesis": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.7.tgz", + "integrity": "sha512-iMtu+HCbLXVrpf6Ys/4YKhcFxbux3xK4ZVB9r+a2kMSqeeQWQoDNYlXIsOjwlT2ldYXZ3k5PVeBnYn7fbAo/Bg==" + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-author": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-1.0.0.tgz", + "integrity": "sha1-XsFZAGKXe9nLOWLpFzuHWGQ39d8=" + }, + "parse-git-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-1.1.1.tgz", + "integrity": "sha1-06mYQxcTL1c5hxK7pDjhKVkN34w=", + "requires": { + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "git-config-path": "^1.0.1", + "ini": "^1.3.4" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "parse-github-url": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-0.3.2.tgz", + "integrity": "sha1-du8B6/4LHpwPSTZylSzGpM2csmA=" + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parse-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", + "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", + "requires": { + "pick-by-alias": "^1.2.0" + } + }, + "parse-svg-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", + "integrity": "sha1-en7A0esG+lMlx9PgCbhZoJtdSes=" + }, + "parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" + }, + "parser-front-matter": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/parser-front-matter/-/parser-front-matter-1.6.4.tgz", + "integrity": "sha512-eqtUnI5+COkf1CQOYo8FmykN5Zs+5Yr60f/7GcPgQDZEEjdE/VZ4WMaMo9g37foof8h64t/TH2Uvk2Sq0fDy/g==", + "requires": { + "extend-shallow": "^2.0.1", + "file-is-binary": "^1.0.0", + "gray-matter": "^3.0.2", + "isobject": "^3.0.1", + "lazy-cache": "^2.0.2", + "mixin-deep": "^1.2.0", + "trim-leading-lines": "^0.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "requires": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pbkdf2-compat": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", + "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=" + }, + "perfect-scrollbar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz", + "integrity": "sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "permutation-parity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/permutation-parity/-/permutation-parity-1.0.0.tgz", + "integrity": "sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ=", + "requires": { + "typedarray-pool": "^1.0.0" + } + }, + "permutation-rank": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/permutation-rank/-/permutation-rank-1.0.0.tgz", + "integrity": "sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U=", + "requires": { + "invert-permutation": "^1.0.0", + "typedarray-pool": "^1.0.0" + } + }, + "pick-by-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", + "integrity": "sha1-X3yysfIabh6ISgyHhVqko3NhEHs=" + }, + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pipe": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/pipe/-/pipe-0.0.2.tgz", + "integrity": "sha1-oW/m/AGddb2YfEkopn4eUOT1tE8=" + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + }, + "pkg-store": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pkg-store/-/pkg-store-0.2.2.tgz", + "integrity": "sha1-sfXA+GIKWf1mWGrMXiVvTCw3oNg=", + "requires": { + "cache-base": "^0.8.2", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "union-value": "^0.2.3", + "write-json": "^0.2.2" + }, + "dependencies": { + "cache-base": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", + "integrity": "sha1-YM6zUEAh7O7HAR/TOEt/TpVym/o=", + "requires": { + "collection-visit": "^0.2.1", + "component-emitter": "^1.2.1", + "get-value": "^2.0.5", + "has-value": "^0.3.1", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.1", + "set-value": "^0.4.2", + "to-object-path": "^0.3.0", + "union-value": "^0.2.3", + "unset-value": "^0.1.1" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "collection-visit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", + "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", + "requires": { + "lazy-cache": "^2.0.1", + "map-visit": "^0.1.5", + "object-visit": "^0.3.4" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "map-visit": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", + "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", + "requires": { + "lazy-cache": "^2.0.1", + "object-visit": "^0.3.4" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "object-visit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", + "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + }, + "union-value": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", + "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + } + }, + "unset-value": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", + "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + } + } + } + }, + "planar-dual": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/planar-dual/-/planar-dual-1.0.2.tgz", + "integrity": "sha1-tqQjVSOxsMt55fkm+OozXdmC1WM=", + "requires": { + "compare-angle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "planar-graph-to-polyline": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.5.tgz", + "integrity": "sha1-iCuGBRmbqIv9RkyVUzA1VsUrmIo=", + "requires": { + "edges-to-adjacency-list": "^1.0.0", + "planar-dual": "^1.0.0", + "point-in-big-polygon": "^2.0.0", + "robust-orientation": "^1.0.1", + "robust-sum": "^1.0.0", + "two-product": "^1.0.0", + "uniq": "^1.0.0" + } + }, + "plotly.js": { + "version": "1.52.2", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.52.2.tgz", + "integrity": "sha512-EZHr2ekxVNjucmNhku+JiLFoLV1wH6gW15T/6SFqtHFMvJZY4HeZogtRUPTLijXBPfusMWxxIKEDTzlMOLXajQ==", + "requires": { + "@plotly/d3-sankey": "0.7.2", + "@plotly/d3-sankey-circular": "0.33.1", + "@turf/area": "^6.0.1", + "@turf/bbox": "^6.0.1", + "@turf/centroid": "^6.0.2", + "alpha-shape": "^1.0.0", + "canvas-fit": "^1.5.0", + "color-normalize": "^1.5.0", + "color-rgba": "^2.1.1", + "convex-hull": "^1.0.3", + "country-regex": "^1.1.0", + "d3": "^3.5.12", + "d3-force": "^1.0.6", + "d3-hierarchy": "^1.1.9", + "d3-interpolate": "^1.4.0", + "delaunay-triangulate": "^1.1.6", + "es6-promise": "^3.0.2", + "fast-isnumeric": "^1.1.3", + "gl-cone3d": "^1.5.1", + "gl-contour2d": "^1.1.6", + "gl-error3d": "^1.0.15", + "gl-heatmap2d": "^1.0.5", + "gl-line3d": "^1.1.11", + "gl-mat4": "^1.2.0", + "gl-mesh3d": "^2.3.0", + "gl-plot2d": "^1.4.3", + "gl-plot3d": "^2.4.2", + "gl-pointcloud2d": "^1.0.2", + "gl-scatter3d": "^1.2.2", + "gl-select-box": "^1.0.3", + "gl-spikes2d": "^1.0.2", + "gl-streamtube3d": "^1.4.0", + "gl-surface3d": "^1.4.6", + "gl-text": "^1.1.8", + "glslify": "^7.0.0", + "has-hover": "^1.0.1", + "has-passive-events": "^1.0.0", + "is-mobile": "^2.1.0", + "mapbox-gl": "1.3.2", + "matrix-camera-controller": "^2.1.3", + "mouse-change": "^1.4.0", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "ndarray": "^1.0.18", + "ndarray-fill": "^1.0.2", + "ndarray-homography": "^1.0.0", + "point-cluster": "^3.1.8", + "polybooljs": "^1.2.0", + "regl": "^1.3.11", + "regl-error2d": "^2.0.8", + "regl-line2d": "^3.0.15", + "regl-scatter2d": "^3.1.7", + "regl-splom": "^1.0.8", + "right-now": "^1.0.0", + "robust-orientation": "^1.1.3", + "sane-topojson": "^4.0.0", + "strongly-connected-components": "^1.0.1", + "superscript-text": "^1.0.0", + "svg-path-sdf": "^1.1.3", + "tinycolor2": "^1.4.1", + "topojson-client": "^2.1.0", + "webgl-context": "^2.2.0", + "world-calendars": "^1.0.3" + }, + "dependencies": { + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", + "requires": { + "d3-svg-legend": "^1.13.0" + } + }, + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + } + } + }, + "point-cluster": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-3.1.8.tgz", + "integrity": "sha512-7klIr45dpMeZuqjIK9+qBg3m2IhyZJNJkdqjJFw0Olq75FM8ojrTMjClVUrMjNYRVqtwztxCHH71Fyjhg+YwyQ==", + "requires": { + "array-bounds": "^1.0.1", + "array-normalize": "^1.1.4", + "binary-search-bounds": "^2.0.4", + "bubleify": "^1.1.0", + "clamp": "^1.0.1", + "defined": "^1.0.0", + "dtype": "^2.0.0", + "flatten-vertex-data": "^1.0.2", + "is-obj": "^1.0.1", + "math-log2": "^1.0.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0" + } + }, + "point-in-big-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/point-in-big-polygon/-/point-in-big-polygon-2.0.0.tgz", + "integrity": "sha1-ObYT6mzxfWtD4Yj3fzTETGszulU=", + "requires": { + "binary-search-bounds": "^1.0.0", + "interval-tree-1d": "^1.0.1", + "robust-orientation": "^1.1.3", + "slab-decomposition": "^1.0.1" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" + } + } + }, + "polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" + }, + "polytope-closest-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz", + "integrity": "sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8=", + "requires": { + "numeric": "^1.2.6" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portal-vue": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.7.tgz", + "integrity": "sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==" + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", + "dev": true + } + } + }, + "postcss-modules-scope": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", + "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + } + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "dev": true, + "requires": { + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "potpack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", + "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-time": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-0.2.0.tgz", + "integrity": "sha1-ejvexAScYgzXxCt/NCt01W5z104=", + "requires": { + "is-number": "^2.0.2", + "nanoseconds": "^0.1.0" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "project-name": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/project-name/-/project-name-0.2.6.tgz", + "integrity": "sha1-Pk94H+HulLB4apuuU1BjdsN5r2k=", + "requires": { + "find-pkg": "^0.1.2", + "git-repo-name": "^0.6.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "prompts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "protocol-buffers-schema": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.4.0.tgz", + "integrity": "sha512-G/2kcamPF2S49W5yaMGdIpkG6+5wZF0fzBteLKgEHjbNzqjZQ85aAs1iJGto31EJaSTkNvHs5IXuHSaTLWBAiA==" + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pxls": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/pxls/-/pxls-2.3.2.tgz", + "integrity": "sha512-pQkwgbLqWPcuES5iEmGa10OlCf5xG0blkIF3dg7PpRZShbTYcvAdfFfGL03SMrkaSUaa/V0UpN9HWg40O2AIIw==", + "requires": { + "arr-flatten": "^1.1.0", + "compute-dims": "^1.1.0", + "flip-pixels": "^1.0.2", + "is-browser": "^2.1.0", + "is-buffer": "^2.0.3", + "to-uint8": "^1.4.1" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "quantize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quantize/-/quantize-1.0.2.tgz", + "integrity": "sha1-0lrCAKd7bXD0ASfKFxoQ4zyFRt4=" + }, + "quat-slerp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", + "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", + "requires": { + "gl-quat": "^1.0.0" + } + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "question-cache": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/question-cache/-/question-cache-0.5.1.tgz", + "integrity": "sha1-C8JzKRdTQXB99azTHvLd9nApFo0=", + "requires": { + "arr-flatten": "^1.0.1", + "arr-union": "^3.1.0", + "async-each-series": "^1.1.0", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "get-value": "^2.0.6", + "has-value": "^0.3.1", + "inquirer2": "^0.1.1", + "is-answer": "^0.1.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3", + "omit-empty": "^0.4.1", + "option-cache": "^3.4.0", + "os-homedir": "^1.0.1", + "project-name": "^0.2.5", + "set-value": "^0.3.3", + "to-choices": "^0.2.0", + "use": "^2.0.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "set-value": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", + "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", + "requires": { + "extend-shallow": "^2.0.1", + "isobject": "^2.0.0", + "to-object-path": "^0.2.0" + } + }, + "to-object-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", + "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", + "requires": { + "arr-flatten": "^1.0.1", + "is-arguments": "^1.0.2" + } + }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "requires": { + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + } + } + }, + "question-store": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/question-store/-/question-store-0.11.1.tgz", + "integrity": "sha1-gf1NRF9NWtwqYiPCUj+nEj4E/X0=", + "requires": { + "common-config": "^0.1.0", + "data-store": "^0.16.1", + "debug": "^2.2.0", + "is-answer": "^0.1.0", + "lazy-cache": "^2.0.1", + "project-name": "^0.2.6", + "question-cache": "^0.5.1" + }, + "dependencies": { + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" + }, + "quote-stream": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", + "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", + "requires": { + "minimist": "0.0.8", + "through2": "~0.4.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "rat-vec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.1.tgz", + "integrity": "sha1-Dd4rZrezS7G80qI4BerIBth/0X8=", + "requires": { + "big-rat": "^1.0.3" + } + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "rc-config-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-3.0.0.tgz", + "integrity": "sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ==", + "requires": { + "debug": "^4.1.1", + "js-yaml": "^3.12.0", + "json5": "^2.1.1", + "require-from-string": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "react": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", + "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", + "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + } + }, + "react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/read-file/-/read-file-0.2.0.tgz", + "integrity": "sha1-cMa6+IQux9FUD5gf0Oau1Mgb1UU=" + }, + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-json-fast": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "requires": { + "json-parse-even-better-errors": "^2.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redeyed": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "integrity": "sha1-N+mQpvKyGyoRwuakj9QTVpjLqX8=", + "requires": { + "esprima": "~1.0.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + } + } + }, + "reduce-object": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/reduce-object/-/reduce-object-0.1.3.tgz", + "integrity": "sha1-1UnUCmwpNvpOPpt4yonJMxRZQhg=", + "requires": { + "for-own": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "reduce-simplicial-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz", + "integrity": "sha1-dNaWovg196bc2SBl/YxRgfLt+Lw=", + "requires": { + "cell-orientation": "^1.0.1", + "compare-cell": "^1.0.0", + "compare-oriented-cell": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-regex/-/regex-regex-1.0.0.tgz", + "integrity": "sha1-kEih6uuHD01IDavHb8Qs3MC8OnI=" + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + } + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "registry-auth-token": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.0.tgz", + "integrity": "sha512-7uxS951DeOBOwsv8deX+l7HcjY2VZxaOgHtM6RKzg3HhpE+bJ0O7VbuMJLosC1T5WSFpHm0DuFIbqUl43jHpsA==", + "requires": { + "rc": "^1.2.8", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + }, + "regjsparser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", + "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "regl": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.3.13.tgz", + "integrity": "sha512-TTiCabJbbUykCL4otjqOvKqDFJhvJOT7xB51JxcDeSHGrEJl1zz4RthPcoOogqfuR3ECN4Te790DfHCXzli5WQ==" + }, + "regl-error2d": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.8.tgz", + "integrity": "sha512-5nszdicXbimRUnYB42i+O7KPcla7PzI62nZLCP6qVRKlQCf3rSrWbikMNd1S84LE8+deWHWcb8rZ/v7rZ9qmmw==", + "requires": { + "array-bounds": "^1.0.1", + "bubleify": "^1.2.0", + "color-normalize": "^1.5.0", + "flatten-vertex-data": "^1.0.2", + "object-assign": "^4.1.1", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.0.1", + "update-diff": "^1.1.0" + } + }, + "regl-line2d": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.0.15.tgz", + "integrity": "sha512-RuQbg9iZ6MyuInG8izF6zjQ/2g4qL6sg1egiuFalWzaGSvuve/IWBsIcqKTlwpiEsRt9b4cHu9NYs2fLt1gYJw==", + "requires": { + "array-bounds": "^1.0.1", + "array-normalize": "^1.1.4", + "bubleify": "^1.2.0", + "color-normalize": "^1.5.0", + "earcut": "^2.1.5", + "es6-weak-map": "^2.0.3", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "to-float32": "^1.0.1" + } + }, + "regl-scatter2d": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.1.7.tgz", + "integrity": "sha512-FWw1hMsQrV3Y0zMU8YOytGjwSBuV3V58t8GR/mhlSL2S04jXLK1m2eAa/rDP3SpvMDkdVEr744PPDeHwsZVUhA==", + "requires": { + "array-range": "^1.0.1", + "array-rearrange": "^2.2.2", + "clamp": "^1.0.1", + "color-id": "^1.1.0", + "color-normalize": "1.5.0", + "color-rgba": "^2.1.1", + "flatten-vertex-data": "^1.0.2", + "glslify": "^7.0.0", + "image-palette": "^2.1.0", + "is-iexplorer": "^1.0.0", + "object-assign": "^4.1.1", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "point-cluster": "^3.1.8", + "to-float32": "^1.0.1", + "update-diff": "^1.1.0" + } + }, + "regl-splom": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.8.tgz", + "integrity": "sha512-4GQTgcArCbGLsXhgalWVBxeW7OXllnu+Gvil/4SbQQmtiqLCl+xgF79pISKY9mLXTlobxiX7cVKdjGjp25559A==", + "requires": { + "array-bounds": "^1.0.1", + "array-range": "^1.0.1", + "bubleify": "^1.2.0", + "color-alpha": "^1.0.4", + "defined": "^1.0.0", + "flatten-vertex-data": "^1.0.2", + "left-pad": "^1.3.0", + "parse-rect": "^1.2.0", + "pick-by-alias": "^1.2.0", + "point-cluster": "^3.1.8", + "raf": "^3.4.1", + "regl-scatter2d": "^3.1.2" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "relative": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz", + "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=", + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "remote-origin-url": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/remote-origin-url/-/remote-origin-url-0.5.3.tgz", + "integrity": "sha512-crQ7Xk1m/F2IiwBx5oTqk/c0hjoumrEz+a36+ZoVupskQRE/q7pAwHKsTNeiZ31sbSTELvVlVv4h1W0Xo5szKg==", + "requires": { + "parse-git-config": "^1.1.1" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, + "repo-utils": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/repo-utils/-/repo-utils-0.3.7.tgz", + "integrity": "sha1-SrZq80DLEfp+XPgFgekr6Xwb964=", + "requires": { + "extend-shallow": "^2.0.1", + "get-value": "^2.0.6", + "git-config-path": "^1.0.1", + "is-absolute": "^0.2.6", + "kind-of": "^3.0.4", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3", + "omit-empty": "^0.4.1", + "parse-author": "^1.0.0", + "parse-git-config": "^1.0.2", + "parse-github-url": "^0.3.2", + "project-name": "^0.2.6" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "requestanimationframe": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/requestanimationframe/-/requestanimationframe-0.0.23.tgz", + "integrity": "sha1-7XmXLsCgUt+KzGuRxXUMsZ5/CQg=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "requires": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "dependencies": { + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "requires": { + "path-parse": "^1.0.5" + } + } + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-file": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/resolve-file/-/resolve-file-0.2.2.tgz", + "integrity": "sha1-FNvsWhnThPXW3GSin9ZigV0xdpY=", + "requires": { + "cwd": "^0.10.0", + "expand-tilde": "^2.0.1", + "extend-shallow": "^2.0.1", + "fs-exists-sync": "^0.1.0", + "global-modules": "^0.2.3", + "homedir-polyfill": "^1.0.0", + "lazy-cache": "^2.0.1", + "resolve": "^1.1.7" + }, + "dependencies": { + "cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", + "requires": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-glob/-/resolve-glob-1.0.0.tgz", + "integrity": "sha512-wSW9pVGJRs89k0wEXhM7C6+va9998NsDhgc0Y+6Nv8hrHsu0hUS7Ug10J1EiVtU6N2tKlSNvx9wLihL8Ao22Lg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-valid-glob": "^1.0.0", + "matched": "^1.0.2", + "relative": "^3.0.2", + "resolve-dir": "^1.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" + } + } + }, + "resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "requires": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "~2.3.4" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rethrow": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/rethrow/-/rethrow-0.2.3.tgz", + "integrity": "sha1-xVKPGQ6J7HU1iJRSob5omWtfZhY=", + "requires": { + "ansi-bgred": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-yellow": "^0.1.1", + "extend-shallow": "^1.1.4", + "lazy-cache": "^0.2.3", + "right-align": "^0.1.3" + }, + "dependencies": { + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "robust-compress": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-compress/-/robust-compress-1.0.0.tgz", + "integrity": "sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs=" + }, + "robust-determinant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/robust-determinant/-/robust-determinant-1.1.0.tgz", + "integrity": "sha1-jsrnm3nKqz509t6+IjflORon6cc=", + "requires": { + "robust-compress": "^1.0.0", + "robust-scale": "^1.0.0", + "robust-sum": "^1.0.0", + "two-product": "^1.0.0" + } + }, + "robust-dot-product": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-dot-product/-/robust-dot-product-1.0.0.tgz", + "integrity": "sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM=", + "requires": { + "robust-sum": "^1.0.0", + "two-product": "^1.0.0" + } + }, + "robust-in-sphere": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/robust-in-sphere/-/robust-in-sphere-1.1.3.tgz", + "integrity": "sha1-HFiD0WpOkjkpR27zSBmFe/Kpz3U=", + "requires": { + "robust-scale": "^1.0.0", + "robust-subtract": "^1.0.0", + "robust-sum": "^1.0.0", + "two-product": "^1.0.0" + } + }, + "robust-linear-solve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz", + "integrity": "sha1-DNasUEBpGm8qo81jEdcokFyjofE=", + "requires": { + "robust-determinant": "^1.1.0" + } + }, + "robust-orientation": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/robust-orientation/-/robust-orientation-1.1.3.tgz", + "integrity": "sha1-2v9bANO+TmByLw6cAVbvln8cIEk=", + "requires": { + "robust-scale": "^1.0.2", + "robust-subtract": "^1.0.0", + "robust-sum": "^1.0.0", + "two-product": "^1.0.2" + } + }, + "robust-point-in-polygon": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/robust-point-in-polygon/-/robust-point-in-polygon-1.0.3.tgz", + "integrity": "sha1-6mjwJaRN/mrt6A8IY3iHBc9UfsQ=", + "requires": { + "robust-orientation": "^1.0.2" + } + }, + "robust-product": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-product/-/robust-product-1.0.0.tgz", + "integrity": "sha1-aFJQAHzbunzx3nW/9tKScBEJir4=", + "requires": { + "robust-scale": "^1.0.0", + "robust-sum": "^1.0.0" + } + }, + "robust-scale": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/robust-scale/-/robust-scale-1.0.2.tgz", + "integrity": "sha1-d1Ey7QlULQKOWLLMecBikLz3jDI=", + "requires": { + "two-product": "^1.0.2", + "two-sum": "^1.0.0" + } + }, + "robust-segment-intersect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz", + "integrity": "sha1-MlK2oPwboUreaRXMvgnLzpqrHBw=", + "requires": { + "robust-orientation": "^1.1.3" + } + }, + "robust-subtract": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-subtract/-/robust-subtract-1.0.0.tgz", + "integrity": "sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo=" + }, + "robust-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz", + "integrity": "sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k=" + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane-topojson": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sane-topojson/-/sane-topojson-4.0.0.tgz", + "integrity": "sha512-bJILrpBboQfabG3BNnHI2hZl52pbt80BE09u4WhnrmzuF2JbMKZdl62G5glXskJ46p+gxE2IzOwGj/awR4g8AA==" + }, + "sass": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.25.0.tgz", + "integrity": "sha512-uQMjye0Y70SEDGO56n0j91tauqS9E1BmpKHtiYNQScXDHeaE9uHwNEqQNFf4Bes/3DHMNinB6u79JsG10XWNyw==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", + "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "requires": { + "to-object-path": "^0.3.0" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "sharkdown": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sharkdown/-/sharkdown-0.1.1.tgz", + "integrity": "sha512-exwooSpmo5s45lrexgz6Q0rFQM574wYIX3iDZ7RLLqOb7IAoQZu9nxlZODU972g19sR69OIpKP2cpHTzU+PHIg==", + "requires": { + "cardinal": "~0.4.2", + "minimist": "0.0.5", + "split": "~0.2.10" + }, + "dependencies": { + "minimist": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", + "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=" + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "signum": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-0.0.0.tgz", + "integrity": "sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "simplicial-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-1.0.0.tgz", + "integrity": "sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE=", + "requires": { + "bit-twiddle": "^1.0.0", + "union-find": "^1.0.0" + } + }, + "simplicial-complex-boundary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz", + "integrity": "sha1-csn/HiTeqjdMm7L6DL8MCB6++BU=", + "requires": { + "boundary-cells": "^2.0.0", + "reduce-simplicial-complex": "^1.0.0" + } + }, + "simplicial-complex-contour": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz", + "integrity": "sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE=", + "requires": { + "marching-simplex-table": "^1.0.0", + "ndarray": "^1.0.15", + "ndarray-sort": "^1.0.0", + "typedarray-pool": "^1.1.0" + } + }, + "simplify-planar-graph": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz", + "integrity": "sha1-vIWJNyXzLo+oriVoE5hEbSy892Y=", + "requires": { + "robust-orientation": "^1.0.1", + "simplicial-complex": "^0.3.3" + }, + "dependencies": { + "bit-twiddle": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-0.0.2.tgz", + "integrity": "sha1-wurruVKjuUrMFASX4c3NLxoz9Y4=" + }, + "simplicial-complex": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-0.3.3.tgz", + "integrity": "sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4=", + "requires": { + "bit-twiddle": "~0.0.1", + "union-find": "~0.0.3" + } + }, + "union-find": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/union-find/-/union-find-0.0.4.tgz", + "integrity": "sha1-uFSzMBYZva0USwAUx4+W6sDS8PY=" + } + } + }, + "sisteransi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" + }, + "slab-decomposition": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/slab-decomposition/-/slab-decomposition-1.0.2.tgz", + "integrity": "sha1-He1WdU1AixBznxRRA9/GGAf2UTQ=", + "requires": { + "binary-search-bounds": "^1.0.0", + "functional-red-black-tree": "^1.0.0", + "robust-orientation": "^1.1.3" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-object-arrays": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sort-object-arrays/-/sort-object-arrays-0.1.1.tgz", + "integrity": "sha1-mfVc8gWkkd3h9S8Jajaiawm0gy8=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spawn-please": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-0.3.0.tgz", + "integrity": "sha1-2zOOxM/2Orxp8dDgjO6euL69nRE=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "requires": { + "through": "2" + } + }, + "split-polygon": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split-polygon/-/split-polygon-1.0.0.tgz", + "integrity": "sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc=", + "requires": { + "robust-dot-product": "^1.0.0", + "robust-sum": "^1.0.0" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "src-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/src-stream/-/src-stream-0.1.1.tgz", + "integrity": "sha1-2T9G0oGjcAKB7A8wszoDFDiUpoE=", + "requires": { + "duplexify": "^3.4.2", + "merge-stream": "^0.1.8", + "through2": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "merge-stream": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.8.tgz", + "integrity": "sha1-SKB7O0oSHXSj7b/c20sIrb8CQLE=", + "requires": { + "through2": "^0.6.1" + }, + "dependencies": { + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + }, + "stardust-allofw": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stardust-allofw/-/stardust-allofw-0.1.1.tgz", + "integrity": "sha512-93pnjWtMQx6OT+FmULpEYkJGPJOF5beW4AYrdrAaPnU7ktP4UbzMySbQ0otrUjrO91TT8IWxyyVJg9XHYrd+iw==", + "requires": { + "allofw": "0.1.0", + "stardust-core": "^0.1.0" + }, + "dependencies": { + "stardust-core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stardust-core/-/stardust-core-0.1.1.tgz", + "integrity": "sha1-6gtcxBKrgpnfcf7NrmcN9K5WhPA=" + } + } + }, + "stardust-core": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/stardust-core/-/stardust-core-0.2.4.tgz", + "integrity": "sha512-7csLT8lEuLuikfln7O5VOxwFRSTbE6IvMrhsb2etWpNWhSg2eZZbcGeLI1CHH56qzK7yew4YFrKrDqNNfF8RUg==" + }, + "stardust-webgl": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/stardust-webgl/-/stardust-webgl-0.2.4.tgz", + "integrity": "sha512-3ipuWlhKPH45uYAJ5RV7yvtkuKUNZNIxyIy6jhVb/5M5h3m3kme4Ptdx9QLsJbDZEarDoc6ryIyaT8GL98+NtA==" + }, + "static-eval": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.3.tgz", + "integrity": "sha512-zsxDGucfAh8T339sSKgpFbvg15Fms2IVaJGC+jqp0bVsxhcpM+iMeAI8weNo8dmf4OblgifTBUoyk1vGVtYw2w==", + "requires": { + "escodegen": "^1.11.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "static-module": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", + "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", + "requires": { + "concat-stream": "~1.6.0", + "duplexer2": "~0.0.2", + "escodegen": "~1.3.2", + "falafel": "^2.1.0", + "has": "^1.0.0", + "object-inspect": "~0.4.0", + "quote-stream": "~0.0.0", + "readable-stream": "~1.0.27-1", + "shallow-copy": "~0.0.1", + "static-eval": "~0.2.0", + "through2": "~0.4.1" + }, + "dependencies": { + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "requires": { + "esprima": "~1.1.1", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.33" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "static-eval": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", + "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", + "requires": { + "escodegen": "~0.0.24" + }, + "dependencies": { + "escodegen": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", + "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", + "requires": { + "esprima": "~1.0.2", + "estraverse": "~1.3.0", + "source-map": ">= 0.1.2" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "estraverse": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", + "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-split-by": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", + "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", + "requires": { + "parenthesis": "^3.1.5" + } + }, + "string-to-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz", + "integrity": "sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==", + "requires": { + "atob-lite": "^2.0.0", + "is-base64": "^0.1.0" + }, + "dependencies": { + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string.prototype.trim": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", + "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-author": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stringify-author/-/stringify-author-0.1.3.tgz", + "integrity": "sha1-1YHgLOC1XNo8lT5irdIR+uSw72Y=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-bom-buffer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-bom-buffer/-/strip-bom-buffer-0.1.1.tgz", + "integrity": "sha1-yj3cSRnBP5/d8wsd/xAKmDUki00=", + "requires": { + "is-buffer": "^1.1.0", + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "strip-bom-string": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-0.1.2.tgz", + "integrity": "sha1-nG5yCjE7qYNliVGEBcz7iKX0G5w=" + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "strip-loader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/strip-loader/-/strip-loader-0.1.2.tgz", + "integrity": "sha1-UWYDgYFZk0KkJMYqSbvSGQLOjzM=", + "requires": { + "loader-utils": "^0.2.6" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "strongly-connected-components": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", + "integrity": "sha1-CSDitN9nyOrulsa2I0/inoc9upk=" + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "success-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz", + "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc=" + }, + "supercluster": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-6.0.2.tgz", + "integrity": "sha512-aa0v2HURjBTOpbcknilcfxGDuArM8khklKSmZ/T8ZXL0BuRwb5aRw95lz+2bmWpFvCXDX/+FzqHxmg0TIaJErw==", + "requires": { + "kdbush": "^3.0.0" + } + }, + "superscript-text": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", + "integrity": "sha1-58snUlZzYN9QvrBhDOjfPXHY39g=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "surface-nets": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/surface-nets/-/surface-nets-1.0.2.tgz", + "integrity": "sha1-5DPIy7qUpydMb0yZVStGG/H8eks=", + "requires": { + "ndarray-extract-contour": "^1.0.0", + "triangulate-hypercube": "^1.0.0", + "zero-crossings": "^1.0.0" + } + }, + "svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + }, + "svg-path-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.1.tgz", + "integrity": "sha1-v0WLeDcmv1NDG0Yz8nkvYHSNn3Q=", + "requires": { + "abs-svg-path": "^0.1.1", + "is-svg-path": "^1.0.1", + "normalize-svg-path": "^1.0.0", + "parse-svg-path": "^0.1.2" + }, + "dependencies": { + "normalize-svg-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.0.1.tgz", + "integrity": "sha1-b3Ka1rcLtMpO/y/ksQdInv4dVv4=", + "requires": { + "svg-arc-to-cubic-bezier": "^3.0.0" + } + } + } + }, + "svg-path-sdf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", + "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", + "requires": { + "bitmap-sdf": "^1.0.0", + "draw-svg-path": "^1.0.0", + "is-svg-path": "^1.0.1", + "parse-svg-path": "^0.1.2", + "svg-path-bounds": "^1.0.1" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=" + }, + "svgo": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", + "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.28", + "css-url-regex": "^1.1.0", + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "sylvester-es6": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/sylvester-es6/-/sylvester-es6-0.0.2.tgz", + "integrity": "sha1-PmUXilrjzD9BlULZzRrVVDWRKr8=" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tableize-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tableize-object/-/tableize-object-0.1.0.tgz", + "integrity": "sha1-fCngEzsn1ItWuedtOijSQd8bOiQ=", + "requires": { + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tape": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.0.tgz", + "integrity": "sha512-J/hvA+GJnuWJ0Sj8Z0dmu3JgMNU+MmusvkCT7+SN4/2TklW18FNCp/UuHIEhPZwHfy4sXfKYgC7kypKg4umbOw==", + "requires": { + "deep-equal": "~1.1.1", + "defined": "~1.0.0", + "dotignore": "~0.1.2", + "for-each": "~0.3.3", + "function-bind": "~1.1.1", + "glob": "~7.1.6", + "has": "~1.0.3", + "inherits": "~2.0.4", + "is-regex": "~1.0.5", + "minimist": "~1.2.0", + "object-inspect": "~1.7.0", + "resolve": "~1.14.2", + "resumer": "~0.0.0", + "string.prototype.trim": "~1.2.1", + "through": "~2.3.8" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "resolve": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", + "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "template-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/template-error/-/template-error-0.1.2.tgz", + "integrity": "sha1-GMn2ANkPLz37oIM+N/fLb0E1QtQ=", + "requires": { + "engine": "^0.1.5", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "rethrow": "^0.2.3" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "templates": { + "version": "0.24.3", + "resolved": "https://registry.npmjs.org/templates/-/templates-0.24.3.tgz", + "integrity": "sha1-i6uicOGlcnR022hXX4Ic4bT+TQU=", + "requires": { + "array-sort": "^0.1.2", + "async-each": "^1.0.0", + "base": "^0.11.1", + "base-data": "^0.6.0", + "base-engines": "^0.2.0", + "base-helpers": "^0.1.1", + "base-option": "^0.8.3", + "base-plugins": "^0.4.13", + "base-routes": "^0.2.1", + "debug": "^2.2.0", + "deep-bind": "^0.3.0", + "define-property": "^0.2.5", + "engine-base": "^0.1.2", + "export-files": "^2.1.1", + "extend-shallow": "^2.0.1", + "falsey": "^0.3.0", + "get-value": "^2.0.6", + "get-view": "^0.1.1", + "group-array": "^0.3.0", + "has-glob": "^0.1.1", + "has-value": "^0.3.1", + "inflection": "^1.10.0", + "is-valid-app": "^0.2.0", + "layouts": "^0.11.0", + "lazy-cache": "^2.0.1", + "match-file": "^0.2.0", + "mixin-deep": "^1.1.3", + "paginationator": "^0.1.3", + "pascalcase": "^0.1.1", + "set-value": "^0.3.3", + "template-error": "^0.1.2", + "vinyl-item": "^0.1.0", + "vinyl-view": "^0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "set-value": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.3.3.tgz", + "integrity": "sha1-uBIjaBY4oQiP2IpDW4qdMtro2bo=", + "requires": { + "extend-shallow": "^2.0.1", + "isobject": "^2.0.0", + "to-object-path": "^0.2.0" + } + }, + "to-object-path": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.2.0.tgz", + "integrity": "sha1-FjThtSqIugDjlJYZ/ACB3Jo7B8o=", + "requires": { + "arr-flatten": "^1.0.1", + "is-arguments": "^1.0.2" + } + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "^0.7.0" + } + }, + "terser": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", + "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "text-cache": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.2.1.tgz", + "integrity": "sha512-G52NFRYXEW9BL4E3kBPquefXql9OT3sNT4J16gcpl3/a8y/YioDOR2Iwga5rNs9tY7rH2xv6rF8fAYrbINn6Kg==", + "requires": { + "vectorize-text": "^3.2.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "time-diff": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/time-diff/-/time-diff-0.3.1.tgz", + "integrity": "sha1-Jej7c07qnmy15LA5TwWBC5yHwtg=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "log-utils": "^0.1.0", + "pretty-time": "^0.2.0" + }, + "dependencies": { + "ansi-colors": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.1.0.tgz", + "integrity": "sha1-M0rDbNPq1wjeXGnhmpjRhkImtD8=", + "requires": { + "ansi-bgblack": "^0.1.1", + "ansi-bgblue": "^0.1.1", + "ansi-bgcyan": "^0.1.1", + "ansi-bggreen": "^0.1.1", + "ansi-bgmagenta": "^0.1.1", + "ansi-bgred": "^0.1.1", + "ansi-bgwhite": "^0.1.1", + "ansi-bgyellow": "^0.1.1", + "ansi-black": "^0.1.1", + "ansi-blue": "^0.1.1", + "ansi-bold": "^0.1.1", + "ansi-cyan": "^0.1.1", + "ansi-dim": "^0.1.1", + "ansi-gray": "^0.1.1", + "ansi-green": "^0.1.1", + "ansi-grey": "^0.1.1", + "ansi-hidden": "^0.1.1", + "ansi-inverse": "^0.1.1", + "ansi-italic": "^0.1.1", + "ansi-magenta": "^0.1.1", + "ansi-red": "^0.1.1", + "ansi-reset": "^0.1.1", + "ansi-strikethrough": "^0.1.1", + "ansi-underline": "^0.1.1", + "ansi-white": "^0.1.1", + "ansi-yellow": "^0.1.1", + "lazy-cache": "^0.2.4" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + }, + "log-utils": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.1.5.tgz", + "integrity": "sha1-3g84+Vf0zW69Xctoddijua4HT3c=", + "requires": { + "ansi-colors": "^0.1.0", + "error-symbol": "^0.1.0", + "info-symbol": "^0.1.0", + "log-ok": "^0.1.1", + "success-symbol": "^0.1.0", + "time-stamp": "^1.0.1", + "warning-symbol": "^0.1.0" + } + } + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "requires": { + "extend-shallow": "^2.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "to-array-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/to-array-buffer/-/to-array-buffer-3.2.0.tgz", + "integrity": "sha512-zN33mwi0gpL+7xW1ITLfJ48CEj6ZQW0ZAP0MU+2W3kEY0PAIncyuxmD4OqkUVhPAbTP7amq9j/iwvZKYS+lzSQ==", + "requires": { + "flatten-vertex-data": "^1.0.2", + "is-blob": "^2.0.1", + "string-to-arraybuffer": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-choices": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-choices/-/to-choices-0.2.0.tgz", + "integrity": "sha1-IufnWgfWl9fkzsvVaxvwPBVlTXM=", + "requires": { + "ansi-gray": "^0.1.1", + "mixin-deep": "^1.1.3" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-file": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/to-file/-/to-file-0.2.0.tgz", + "integrity": "sha1-I2xsCIBl5XDe+9Fc9LTlZb5G6pM=", + "requires": { + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "file-contents": "^0.2.4", + "glob-parent": "^2.0.0", + "is-valid-glob": "^0.3.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "vinyl": "^1.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "to-float32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.0.1.tgz", + "integrity": "sha512-nOy2WSwae3xhZbc+05xiCuU3ZPPmH0L4Rg4Q1qiOGFSuNSCTB9nVJaGgGl3ZScxAclX/L8hJuDHJGDAzbfuKCQ==" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-px": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", + "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", + "requires": { + "parse-unit": "^1.0.1" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-uint8": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/to-uint8/-/to-uint8-1.4.1.tgz", + "integrity": "sha512-o+ochsMlTZyucbww8It401FC2Rx+OP2RpDeYbA6h+y9HgedDl1UjdsJ9CmzKEG7AFP9es5PmJ4eDWeeeXihESg==", + "requires": { + "arr-flatten": "^1.1.0", + "clamp": "^1.0.1", + "is-base64": "^0.1.0", + "is-float-array": "^1.0.0", + "to-array-buffer": "^3.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "topojson-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-2.1.0.tgz", + "integrity": "sha1-/59784mRGF4LQoTCsGroNPDqxsg=", + "requires": { + "commander": "2" + } + }, + "toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" + }, + "transform-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/transform-loader/-/transform-loader-0.2.4.tgz", + "integrity": "sha1-5ch4d7qW1R0/IlNoWHtG4ibRzsk=", + "requires": { + "loader-utils": "^1.0.2" + } + }, + "triangulate-hypercube": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz", + "integrity": "sha1-2Acdsuv8/VHzCNC88qXEils20Tc=", + "requires": { + "gamma": "^0.1.0", + "permutation-parity": "^1.0.0", + "permutation-rank": "^1.0.0" + } + }, + "triangulate-polyline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz", + "integrity": "sha1-v4uod6hQVBA/65+lphtOjXAXgU0=", + "requires": { + "cdt2d": "^1.0.0" + } + }, + "trim-leading-lines": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/trim-leading-lines/-/trim-leading-lines-0.1.1.tgz", + "integrity": "sha1-DnysPoMELc+Vp07TaWbxd0TVwWk=", + "requires": { + "is-whitespace": "^0.3.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "turntable-camera-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", + "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.2", + "gl-vec3": "^1.0.2" + } + }, + "two-product": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/two-product/-/two-product-1.0.2.tgz", + "integrity": "sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo=" + }, + "two-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/two-sum/-/two-sum-1.0.0.tgz", + "integrity": "sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "type-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz", + "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-pool": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", + "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", + "requires": { + "bit-twiddle": "^1.0.0", + "dup": "^1.0.0" + } + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "uglifyjs-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "uglify-js": "^3.6.0", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + } + }, + "webpack-sources": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.1.tgz", + "integrity": "sha512-XSz38193PTo/1csJabKaV4b53uRVotlMgqJXm3s3eje0Bu6gQTxYDqpD38CmQfDBA+gN+QqaGjasuC8I/7eW3Q==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "underscore": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==" + }, + "underscore.string": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-1.1.4.tgz", + "integrity": "sha1-m+BrI7jj2ZbqICD5mEICBp497hI=", + "requires": { + "underscore": "1.1.6" + }, + "dependencies": { + "underscore": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.6.tgz", + "integrity": "sha1-aGjaG91y11KFvgtOUPIo5w0AGiw=" + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + }, + "union-find": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/union-find/-/union-find-1.0.2.tgz", + "integrity": "sha1-KSusQV5q06iVNdI3AQ20pTYoTlg=" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "dependencies": { + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/update/-/update-0.7.4.tgz", + "integrity": "sha1-saCRwRo+KK4xui7vWLcRuCzpixQ=", + "requires": { + "arr-union": "^3.1.0", + "assemble-core": "^0.25.0", + "assemble-loader": "^0.6.1", + "base-cli-process": "^0.1.18", + "base-config-process": "^0.1.9", + "base-generators": "^0.4.5", + "base-questions": "^0.7.3", + "base-runtimes": "^0.2.0", + "base-store": "^0.4.4", + "common-config": "^0.1.0", + "data-store": "^0.16.1", + "export-files": "^2.1.1", + "extend-shallow": "^2.0.1", + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0", + "global-modules": "^0.2.2", + "gulp-choose-files": "^0.1.3", + "is-valid-app": "^0.2.0", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "log-utils": "^0.2.1", + "parser-front-matter": "^1.4.1", + "resolve-dir": "^0.1.0", + "resolve-file": "^0.2.0", + "set-blocking": "^2.0.0", + "strip-color": "^0.1.0", + "text-table": "^0.2.0", + "through2": "^2.0.1", + "yargs-parser": "^2.4.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "requires": { + "os-homedir": "^1.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + } + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + } + } + }, + "update-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", + "integrity": "sha1-9RAYLYHugZ+4LDprIrYrve2ngI8=" + }, + "update-notifier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz", + "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==", + "requires": { + "boxen": "^3.0.0", + "chalk": "^2.0.1", + "configstore": "^4.0.0", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^3.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-3.0.0.tgz", + "integrity": "sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "schema-utils": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-copy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/utils-copy/-/utils-copy-1.1.1.tgz", + "integrity": "sha1-biuXmCqozXPhGCo+b4vsPA9AWKc=", + "requires": { + "const-pinf-float64": "^1.0.0", + "object-keys": "^1.0.9", + "type-name": "^2.0.0", + "utils-copy-error": "^1.0.0", + "utils-indexof": "^1.0.0", + "utils-regex-from-string": "^1.0.0", + "validate.io-array": "^1.0.3", + "validate.io-buffer": "^1.0.1", + "validate.io-nonnegative-integer": "^1.0.0" + } + }, + "utils-copy-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-copy-error/-/utils-copy-error-1.0.1.tgz", + "integrity": "sha1-eR3jk8DwmJCv1Z88vqY18HmpT6U=", + "requires": { + "object-keys": "^1.0.9", + "utils-copy": "^1.1.0" + } + }, + "utils-extend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/utils-extend/-/utils-extend-1.0.8.tgz", + "integrity": "sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8=" + }, + "utils-indexof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-indexof/-/utils-indexof-1.0.0.tgz", + "integrity": "sha1-IP6r8J7xAYtSNkPoOA57yD7GG1w=", + "requires": { + "validate.io-array-like": "^1.0.1", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "utils-regex-from-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz", + "integrity": "sha1-/hopCfjeD/DVGCyA+8ZU1qaH0Yk=", + "requires": { + "regex-regex": "^1.0.0", + "validate.io-string-primitive": "^1.0.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "requires": { + "builtins": "^1.0.3" + } + }, + "validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=" + }, + "validate.io-array-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz", + "integrity": "sha1-evn363tRcVvrIhVmjsXM5U+t21o=", + "requires": { + "const-max-uint32": "^1.0.2", + "validate.io-integer-primitive": "^1.0.0" + } + }, + "validate.io-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz", + "integrity": "sha1-hS1nNAIZFNXROvwyUxdh43IO1E4=" + }, + "validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=", + "requires": { + "validate.io-number": "^1.0.3" + } + }, + "validate.io-integer-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz", + "integrity": "sha1-qaoBA1X+hoHA/qbBp0rSQZyt3cY=", + "requires": { + "validate.io-number-primitive": "^1.0.0" + } + }, + "validate.io-matrix-like": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz", + "integrity": "sha1-XsMqddCInaxzbepovdYUWxVe38M=" + }, + "validate.io-ndarray-like": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz", + "integrity": "sha1-2KOw7RZbvx0vwNAHMnDPpVIpWRk=" + }, + "validate.io-nonnegative-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz", + "integrity": "sha1-gGkkOgjF+Y6VQTySnf17GPP28p8=", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=" + }, + "validate.io-number-primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz", + "integrity": "sha1-0uAfICmJNp3PEVVElWQgOv5YTlU=" + }, + "validate.io-positive-integer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz", + "integrity": "sha1-ftLQO0wnVYzGagCqsPDpIYFKZYI=", + "requires": { + "validate.io-integer": "^1.0.5" + } + }, + "validate.io-string-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz", + "integrity": "sha1-uBNbn7E3K94C/dU60dDM1t55j+4=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vectorize-text": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/vectorize-text/-/vectorize-text-3.2.1.tgz", + "integrity": "sha512-rGojF+D9BB96iPZPUitfq5kaiS6eCJmfEel0NXOK/MzZSuXGiwhoop80PtaDas9/Hg/oaox1tI9g3h93qpuspg==", + "requires": { + "cdt2d": "^1.0.0", + "clean-pslg": "^1.1.0", + "ndarray": "^1.0.11", + "planar-graph-to-polyline": "^1.0.0", + "simplify-planar-graph": "^2.0.1", + "surface-nets": "^1.0.0", + "triangulate-polyline": "^1.0.0" + } + }, + "vega": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/vega/-/vega-5.9.1.tgz", + "integrity": "sha512-Wd5WAfaXPGuHk5cSFqiFNkkw5DXRSZcl+q4x351VUbmV5/IRipyGZx05EbBP5D9B40Xb/Tt2I+JQBBdxuYYIxQ==", + "requires": { + "vega-crossfilter": "4.0.1", + "vega-dataflow": "5.5.0", + "vega-encode": "4.5.2", + "vega-event-selector": "2.0.2", + "vega-expression": "2.6.3", + "vega-force": "4.0.3", + "vega-functions": "5.5.1", + "vega-geo": "4.3.0", + "vega-hierarchy": "4.0.3", + "vega-loader": "4.1.3", + "vega-parser": "5.12.0", + "vega-projection": "1.4.0", + "vega-regression": "1.0.4", + "vega-runtime": "5.0.2", + "vega-scale": "6.0.0", + "vega-scenegraph": "4.5.0", + "vega-statistics": "1.7.2", + "vega-time": "1.0.0", + "vega-transforms": "4.6.0", + "vega-typings": "0.12.0", + "vega-util": "1.12.2", + "vega-view": "5.4.0", + "vega-view-transforms": "4.5.0", + "vega-voronoi": "4.1.1", + "vega-wordcloud": "4.0.4" + } + }, + "vega-canvas": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.1.tgz", + "integrity": "sha512-k/S3EPeJ37D7fYDhv4sEg7fNWVpLheQY7flfLyAmJU7aSwCMgw8cZJi0CKHchJeculssfH+41NCqvRB1QtaJnw==" + }, + "vega-crossfilter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.0.1.tgz", + "integrity": "sha512-wLNS4JzKaOLj8EAzI/v8XBJjUWMRWYSu6EeQF4o9Opq/78u87Ol9Lc5I27UHsww5dNNH/tHubAV4QPIXnGOp5Q==", + "requires": { + "d3-array": "^2.0.3", + "vega-dataflow": "^5.1.0", + "vega-util": "^1.8.0" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + } + } + }, + "vega-dataflow": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.5.0.tgz", + "integrity": "sha512-9eRe2qLpwvEegBoSaH3vdziSLMZSszY02wxVmvcFzHe57Rf/eYEr0YRuW4qc+gMmwURPYu9wtmeUTiK4XhDKXw==", + "requires": { + "vega-loader": "^4.0.0", + "vega-util": "^1.11.0" + } + }, + "vega-encode": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.5.2.tgz", + "integrity": "sha512-iL1njX++VE0SAMJuDqc0k9kmsU8AeyRRHv15MXh2+PXe2JmyiSWn6HcF3RzFUy5xmKlZOU5BiL8KrTgTrxh+WA==", + "requires": { + "d3-array": "^2.4.0", + "d3-format": "^1.4.2", + "d3-interpolate": "^1.4.0", + "vega-dataflow": "^5.5.0", + "vega-scale": "^6.0.0", + "vega-time": "^1.0.0", + "vega-util": "^1.12.2" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-format": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + } + } + }, + "vega-event-selector": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-2.0.2.tgz", + "integrity": "sha512-Uv72vBfM0lrlI2belKHFMZuVnW2uJl2ShqWPwGSXPVe6p+PzgqoPJYC8A/i5N8B54UA4UMDzlbBeo3x7q2W9Yg==" + }, + "vega-expression": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-2.6.3.tgz", + "integrity": "sha512-sME1+45BToTGsftb1Q6Ubs2iRYEoXkD2NRGnJuKS9YJ2ITzZwPHF/jy2kHW3iLpuNjj54meaO7HMQ/hUKrciUw==", + "requires": { + "vega-util": "^1.11.0" + } + }, + "vega-force": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.0.3.tgz", + "integrity": "sha512-4stItN4jD9H1CENaCz4jXRNS1Bi9cozMOUjX2824FeJENi2RZSiAZAaGbscgerZQ/jbNcOHD8PHpC2pWldEvGA==", + "requires": { + "d3-force": "^2.0.1", + "vega-dataflow": "^5.4.0", + "vega-util": "^1.11.0" + }, + "dependencies": { + "d3-force": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.0.1.tgz", + "integrity": "sha512-zh73/N6+MElRojiUG7vmn+3vltaKon7iD5vB/7r9nUaBeftXMzRo5IWEG63DLBCto4/8vr9i3m9lwr1OTJNiCg==", + "requires": { + "d3-dispatch": "1", + "d3-quadtree": "1", + "d3-timer": "1" + } + } + } + }, + "vega-functions": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.5.1.tgz", + "integrity": "sha512-VTfEwf/ChSOGc4d4yUIgu2XoScky6NH06WN4vwVGY5PREhsyVPsQ+p2zqgD/N/a00EyWPHeOSHEhsPU28oIMtQ==", + "requires": { + "d3-array": "^2.4.0", + "d3-color": "^1.4.0", + "d3-format": "^1.4.2", + "d3-geo": "^1.11.9", + "d3-time-format": "^2.2.2", + "vega-dataflow": "^5.5.0", + "vega-expression": "^2.6.3", + "vega-scale": "^6.0.0", + "vega-scenegraph": "^4.5.0", + "vega-selections": "^5.1.0", + "vega-statistics": "^1.7.1", + "vega-time": "^1.0.0", + "vega-util": "^1.12.1" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-format": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.3.tgz", + "integrity": "sha512-mm/nE2Y9HgGyjP+rKIekeITVgBtX97o1nrvHCWX8F/yBYyevUTvu9vb5pUnKwrcSw7o7GuwMOWjS9gFDs4O+uQ==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + } + } + }, + "vega-geo": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.3.0.tgz", + "integrity": "sha512-Rcz4z+TR4qy727pjBWSsbMAn8eM9bDZ5MXKqo5AWuFkoj/8ngv13vafHd1tvEMTA8L5BjAW3/eTqN4tyx9KSQg==", + "requires": { + "d3-array": "^2.4.0", + "d3-color": "^1.4.0", + "d3-geo": "^1.11.9", + "vega-canvas": "^1.2.1", + "vega-dataflow": "^5.1.1", + "vega-projection": "^1.4.0", + "vega-statistics": "^1.7.1", + "vega-util": "^1.12.1" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + } + } + }, + "vega-hierarchy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.0.3.tgz", + "integrity": "sha512-9wNe+KyKqZW1S4++jCC38HuAhZbqNhfY7gOvwiMLjsp65tMtRETrtvYfHkULClm3UokUIX54etAXREAGW7znbw==", + "requires": { + "d3-hierarchy": "^1.1.8", + "vega-dataflow": "^5.4.0", + "vega-util": "^1.11.0" + } + }, + "vega-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.1.3.tgz", + "integrity": "sha512-50aetjuct4WqU7LctwnZqF/NCyya9aZ1HDQZ9unFi++62vOQgRfbXLNL/dZavqwnWX3S9i0ltCznLyFMG4ck8g==", + "requires": { + "d3-dsv": "^1.1.1", + "d3-time-format": "^2.2.1", + "node-fetch": "^2.6.0", + "topojson-client": "^3.0.1", + "vega-util": "^1.11.0" + }, + "dependencies": { + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, + "topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "requires": { + "commander": "2" + } + } + } + }, + "vega-parser": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-5.12.0.tgz", + "integrity": "sha512-sIQcWp7aqafpfELEJr+gQDsz7TlLYaHkowKhp3O/pcOdIuvqeI3IYpP2+oNpXVGi8ikcq8cJLcCUMi9oP2Xtrw==", + "requires": { + "vega-dataflow": "^5.5.0", + "vega-event-selector": "^2.0.2", + "vega-expression": "^2.6.3", + "vega-functions": "^5.5.0", + "vega-scale": "^6.0.0", + "vega-util": "^1.12.1" + } + }, + "vega-projection": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.4.0.tgz", + "integrity": "sha512-Prb/E41PqZT5b+46rHv6BZLDsXMe+NFClHxJ9NbwW7mntz8aMGAHiYolVa/M2KuTLbsXVgDAPxk/aA9tbQ0SSg==", + "requires": { + "d3-geo": "^1.11.9", + "d3-geo-projection": "^2.7.1" + } + }, + "vega-regression": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.0.4.tgz", + "integrity": "sha512-fHWJ0t1VEZOzpfBrI66Wo6RxMnqvJXYnXcIUZlOrZ9RLLbb1I6cdEASZp0cQ8M2oYAqu0YVgC0UEjnLs9mJaxQ==", + "requires": { + "d3-array": "^2.4.0", + "vega-dataflow": "^5.4.1", + "vega-statistics": "^1.7.2", + "vega-util": "^1.12.2" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + } + } + }, + "vega-runtime": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-5.0.2.tgz", + "integrity": "sha512-Cuv+RY6kprH+vtNERg6xP4dgcdYGD2ZnxPxJNEtGi7dmtQQTBa1s7jQ0VDXTolsO6lKJ3B7np2GzKJYwevgj1A==", + "requires": { + "vega-dataflow": "^5.1.1", + "vega-util": "^1.11.0" + } + }, + "vega-scale": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-6.0.0.tgz", + "integrity": "sha512-uNJ5LC+s+XLxdO2iXC36/TLen3mMNv0wzhMZMNXa8h+Ih10geJ57sHbYYA8Z8403JC9AYTaWUe7m0H9CHgV9NA==", + "requires": { + "d3-array": "^2.4.0", + "d3-interpolate": "^1.4.0", + "d3-scale": "^3.2.1", + "vega-util": "^1.12.1" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-scale": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.2.1.tgz", + "integrity": "sha512-huz5byJO/6MPpz6Q8d4lg7GgSpTjIZW/l+1MQkzKfu2u8P6hjaXaStOpmyrD6ymKoW87d2QVFCKvSjLwjzx/rA==", + "requires": { + "d3-array": "1.2.0 - 2", + "d3-format": "1", + "d3-interpolate": "^1.2.0", + "d3-time": "1", + "d3-time-format": "2" + } + } + } + }, + "vega-scenegraph": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.5.0.tgz", + "integrity": "sha512-nO1bTFwhLdkOPzJ++f8dmlMX6OLZya9c94/HZNwFRfGNfri1vXyCIudFwCJD9/h0dJ0kSWfG8ybH9wDQMcZZDw==", + "requires": { + "d3-path": "^1.0.9", + "d3-shape": "^1.3.7", + "vega-canvas": "^1.2.1", + "vega-loader": "^4.1.3", + "vega-util": "^1.12.1" + }, + "dependencies": { + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + } + } + }, + "vega-selections": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.1.0.tgz", + "integrity": "sha512-Gm+16RaCMkWbimqKh9kuIGMK91vutJsTbIDKBXxmq0c3pTvf+Djy6KfBoFsipEJ9wkwhXHSqpLqS1tExV93E9g==", + "requires": { + "vega-expression": "^2.6.1", + "vega-util": "^1.11.0" + } + }, + "vega-statistics": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.7.2.tgz", + "integrity": "sha512-G6rvZ50MqnmiN1fGqDnFoCLWFwBCYt3nCucXu3zWov7A1/lsatvbDKYeSlVlnvT9OHtv4L+3pRpepFh5IhXKFg==", + "requires": { + "d3-array": "^2.4.0" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + } + } + }, + "vega-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-1.0.0.tgz", + "integrity": "sha512-r0yOFr/VklJwD3ew1+fEcB7E0LBCLChYlwh0KoO6cTIWMdlC4KhIIUN3/FuBfUZ4qx4V/xp71xH2YYYZTH6izg==", + "requires": { + "d3-array": "^2.3.3", + "d3-time": "^1.1.0", + "d3-time-format": "^2.2.1", + "vega-util": "^1.12.0" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + } + } + }, + "vega-transforms": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.6.0.tgz", + "integrity": "sha512-5nsMMnyOME/Xe1xLNGCcQ+BS94cix9gSItHiXqU7wR50ukp5U9JoUxnfeYJkuv37FAbnFpkuYlPcBCWp55zXhQ==", + "requires": { + "d3-array": "^2.4.0", + "vega-dataflow": "^5.5.0", + "vega-statistics": "^1.7.1", + "vega-time": "^1.0.0", + "vega-util": "^1.12.1" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + } + } + }, + "vega-typings": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.12.0.tgz", + "integrity": "sha512-K+IoUTTtXW3E1Qhr/y+JgLRxy476viAm6DeM8IiVrA8vvuLA3FTzHaeI7TCnaWEwk9xxLJBtdVKKC5FGbp0Nyw==", + "requires": { + "vega-util": "^1.12.1" + } + }, + "vega-util": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.12.2.tgz", + "integrity": "sha512-p02+oQ/XU/gzY9S/CTZinym2NKWEMIneLc+FYdUeJZZnDGa3DvcNgUDlVR90JlwLcYZNs5dBdfYLfdRHsKZKiw==" + }, + "vega-view": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.4.0.tgz", + "integrity": "sha512-Q8nH93NceWJRB4/KTehOvsrpbCGGDnkjOCcNQpTsGgu6QRmgMTHtRQTHkE+LhLXMO/55zZrVR22thvMEH9r36w==", + "requires": { + "d3-array": "^2.4.0", + "d3-timer": "^1.0.10", + "vega-dataflow": "^5.5.0", + "vega-functions": "^5.5.1", + "vega-runtime": "^5.0.2", + "vega-scenegraph": "^4.5.0", + "vega-util": "^1.12.1" + }, + "dependencies": { + "d3-array": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.4.0.tgz", + "integrity": "sha512-KQ41bAF2BMakf/HdKT865ALd4cgND6VcIztVQZUTt0+BH3RWy6ZYnHghVXf6NFjt2ritLr8H1T8LreAAlfiNcw==" + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + } + } + }, + "vega-view-transforms": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.5.0.tgz", + "integrity": "sha512-8n52147HxNSjQ23NeHN//AWt99zZP+Ukiy4kSbkCJGPZ3dW3NYdunEYNvZWyMmOKSrHIMtgdcHUM9FmPTQpE9w==", + "requires": { + "vega-dataflow": "^5.4.1", + "vega-scenegraph": "^4.4.0", + "vega-util": "^1.12.0" + } + }, + "vega-voronoi": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.1.1.tgz", + "integrity": "sha512-agLmr+UGxJs5KB9D8GeZqxgeWWGoER/eVHPcFFPgVuoNBsrqf2bdoltmIkRnpiRsQnGCibGixhFEDCc9GGNAww==", + "requires": { + "d3-delaunay": "^5.1.3", + "vega-dataflow": "^5.1.1", + "vega-util": "^1.11.0" + } + }, + "vega-wordcloud": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.0.4.tgz", + "integrity": "sha512-+FwgCKTj8JBMbBjNiVciLvjQnk+rC59uyecmlTsmtUGVZz5wyANooYcXt4xtiRu+G8ohdlJ6L/59+UFTaUR8og==", + "requires": { + "vega-canvas": "^1.2.1", + "vega-dataflow": "^5.4.1", + "vega-scale": "^6.0.0", + "vega-statistics": "^1.7.1", + "vega-util": "^1.12.1" + } + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "requires": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "vinyl-item": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vinyl-item/-/vinyl-item-0.1.0.tgz", + "integrity": "sha1-8ngTyBFC66ScpYSd5PQvb6Dl4Jg=", + "requires": { + "base": "^0.8.1", + "base-option": "^0.8.2", + "base-plugins": "^0.4.12", + "clone": "^1.0.2", + "clone-stats": "^1.0.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "vinyl": "^1.1.1" + }, + "dependencies": { + "base": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/base/-/base-0.8.1.tgz", + "integrity": "sha1-aQC7MA8sdZbJnz2DurhyLYGLdI8=", + "requires": { + "arr-union": "^3.1.0", + "cache-base": "^0.8.2", + "class-utils": "^0.3.2", + "component-emitter": "^1.2.0", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "lazy-cache": "^1.0.3", + "mixin-deep": "^1.1.3" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + } + } + }, + "cache-base": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", + "integrity": "sha1-YM6zUEAh7O7HAR/TOEt/TpVym/o=", + "requires": { + "collection-visit": "^0.2.1", + "component-emitter": "^1.2.1", + "get-value": "^2.0.5", + "has-value": "^0.3.1", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.1", + "set-value": "^0.4.2", + "to-object-path": "^0.3.0", + "union-value": "^0.2.3", + "unset-value": "^0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "collection-visit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz", + "integrity": "sha1-L2JIPK7MlfCDuaRUo+6eYTmteVc=", + "requires": { + "lazy-cache": "^2.0.1", + "map-visit": "^0.1.5", + "object-visit": "^0.3.4" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "map-visit": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", + "integrity": "sha1-2+Q5J85VJbgN/BVzpE1oxR8mgWs=", + "requires": { + "lazy-cache": "^2.0.1", + "object-visit": "^0.3.4" + } + }, + "object-visit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", + "integrity": "sha1-rhXPhvCy/dVRdxY2RIRSxUw9qCk=", + "requires": { + "isobject": "^2.0.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + }, + "union-value": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz", + "integrity": "sha1-c3UVJ4ZnkFfns3qmdug0aPwCdPA=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + } + }, + "unset-value": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz", + "integrity": "sha1-UGgQuGfyfCpabpsEgzYx9t5Y0xA=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + } + } + }, + "vinyl-view": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/vinyl-view/-/vinyl-view-0.1.2.tgz", + "integrity": "sha1-CaxtfIASEr8JJr2dQQb0XmxPyXc=", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "engine-base": "^0.1.2", + "isobject": "^2.1.0", + "lazy-cache": "^2.0.1", + "mixin-deep": "^1.1.3", + "vinyl-item": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vt-pbf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.1.tgz", + "integrity": "sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.0.5" + } + }, + "vue": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", + "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" + }, + "vue-bootstrap-slider": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/vue-bootstrap-slider/-/vue-bootstrap-slider-2.1.8.tgz", + "integrity": "sha512-UwV/T+Fy8jhlHLOVL5MPp5yl076u1FUM0WeK/ScD267XODrvvpy/xioL16ZgKUQPvu+3Bok8lR39Z6hiTGeUSQ==", + "requires": { + "bootstrap-slider": "^10.6.0", + "lodash": "^4.17.11" + } + }, + "vue-chartjs": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-3.5.0.tgz", + "integrity": "sha512-yWNhG3B6g6lvYqNInP0WaDWNZG/SNb6XnltkjR0wYC5pmLm6jvdiotj8er7Mui8qkJGfLZe6ULjrZdHWjegAUg==" + }, + "vue-class-component": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-7.2.3.tgz", + "integrity": "sha512-oEqYpXKaFN+TaXU+mRLEx8dX0ah85aAJEe61mpdoUrq0Bhe/6sWhyZX1JjMQLhVsHAkncyhedhmCdDVSasUtDw==" + }, + "vue-cli-plugin-vuetify": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.0.5.tgz", + "integrity": "sha512-jtxcidjLT5f1H9QLYKLFjo/ZG42ud4pI9bK3WNO5DXyhiMDMTwSZ7b3NcJVRH7tKYbv5/ty0VPdDGlf4w22AMA==", + "dev": true, + "requires": { + "semver": "^7.1.2", + "shelljs": "^0.8.3" + } + }, + "vue-clickaway": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/vue-clickaway/-/vue-clickaway-2.2.2.tgz", + "integrity": "sha512-25SpjXKetL06GLYoLoC8pqAV6Cur9cQ//2g35GRFBV4FgoljbZZjTINR8g2NuVXXDMLSUXaKx5dutgO4PaDE7A==", + "requires": { + "loose-envify": "^1.2.0" + } + }, + "vue-eslint-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz", + "integrity": "sha512-yR0dLxsTT7JfD2YQo9BhnQ6bUTLsZouuzt9SKRP7XNaZJV459gvlsJo4vT2nhZ/2dH9j3c53bIx9dnqU2prM9g==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "vue-functional-data-merge": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", + "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.9.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.0.tgz", + "integrity": "sha512-FeDHvTSpwyLeF7LIV1PYkvqUQgTJ8UmOxhSlCyRSxaXCKk+M6NF4tDQsLsPPNeDPyR7TfRQ8MLg6v+8PsDV9xQ==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-numeric": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vue-numeric/-/vue-numeric-2.3.0.tgz", + "integrity": "sha1-1uWqfFA1qG8uNkgfsf0P4rxEX5I=", + "requires": { + "accounting-js": "^1.1.1" + } + }, + "vue-papa-parse": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vue-papa-parse/-/vue-papa-parse-1.3.0.tgz", + "integrity": "sha512-+nn4Yh8/GFcMaEdg8VuQNE/UV0U9xz4LPasjNAqCcjAwVNHolW4A9mPhfTKJ8zkS6gvJGDc7qWUEZsFx6az3Aw==", + "requires": { + "papaparse": "^4.6.3", + "vue": "^2.6.10" + }, + "dependencies": { + "papaparse": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-4.6.3.tgz", + "integrity": "sha512-LRq7BrHC2kHPBYSD50aKuw/B/dGcg29omyJbKWY3KsYUZU69RKwaBHu13jGmCYBtOc4odsLCrFyk6imfyNubJQ==" + } + } + }, + "vue-plotly": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vue-plotly/-/vue-plotly-1.1.0.tgz", + "integrity": "sha512-GW52p+ZD0AKHgtE7vdkljJ79fiRugkhFkcE+Es5Ok9YWulHq8KxywQdO0rK1ejGIfVv1yAQKiKxhzYcYE/lXyw==", + "requires": { + "core-js": "^3.6.4", + "plotly.js": "^1.52.1", + "vue": "^2.6.11", + "vue-resize-directive": "^1.2.0" + }, + "dependencies": { + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + } + } + }, + "vue-plugin-load-script": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vue-plugin-load-script/-/vue-plugin-load-script-1.2.0.tgz", + "integrity": "sha512-QbWjZSFRToSP6S0nZFsH618PsTlZgSg8m8Xv602vezznLTHYd0wAXEw0jlYND7L6BMe0KcA7cvUwLROyfBlQ4w==" + }, + "vue-property-decorator": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.4.0.tgz", + "integrity": "sha512-0o85LJSTLZvDaB7IXfmpONfAQZ7NgScFvptFSrlFFSsScR716muJb3mMFojNnKC3Vpm7CM4PsmHNdk30uuNpag==", + "requires": { + "vue-class-component": "^7.1.0" + } + }, + "vue-resize-directive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vue-resize-directive/-/vue-resize-directive-1.2.0.tgz", + "integrity": "sha512-LmpFexQcl1XYyz3DQrTrq3Efgj50MKEON60nR9MMAq1D2ZtXFg1WDcy1wy1T0SeduNtIu9hos2aLTsJUplvjlQ==", + "requires": { + "css-element-queries": "^1.0.2", + "intersection-observer": "^0.5.0", + "lodash.debounce": "^4.0.8" + } + }, + "vue-router": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.5.tgz", + "integrity": "sha512-BszkPvhl7I9h334GjckCh7sVFyjTPMMJFJ4Bsrem/Ik+B/9gt5tgrk8k4gGLO4ZpdvciVdg7O41gW4DisQWurg==" + }, + "vue-slider-component": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vue-slider-component/-/vue-slider-component-3.1.1.tgz", + "integrity": "sha512-5BagCDOqK7q3WRdQrT16cjfSDPp1/VxKDk0i92u1tRT03fPJKzYmkbWSeJVHuET5IB9nVWuTGUPgUo0jTzQ3QQ==", + "requires": { + "vue-property-decorator": "^8.0.0" + } + }, + "vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", + "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz", + "integrity": "sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vue-underscore": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vue-underscore/-/vue-underscore-0.1.4.tgz", + "integrity": "sha1-w9zuJqbgJ53ylEimBBp+ZMIJgao=", + "requires": { + "underscore": "^1.8.3" + } + }, + "vue2-perfect-scrollbar": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vue2-perfect-scrollbar/-/vue2-perfect-scrollbar-1.3.0.tgz", + "integrity": "sha512-QCFTgRtUHsn4WSvR08pjKJEXQJLqFFl4V7ODsFAhJkdhYweY4Ac6KYqwoxnXRIeJXd/JZgY9vy1601Z0osNJcQ==", + "requires": { + "cssnano": "^4.1.3", + "perfect-scrollbar": "^1.4.0", + "postcss-import": "^12.0.0" + } + }, + "vue2-simplert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vue2-simplert/-/vue2-simplert-1.0.0.tgz", + "integrity": "sha512-ofwOJsAk2vRRdYA6UB+RDdoM00rY+s9iPX+LcqCTssba2TGfphNXgdct5rnfH0NQ9+Iy4E3LwZ14olvlLq1SHw==", + "dev": true, + "requires": { + "gitbook-plugin-github": "^2.0.0", + "vue2-simplert-core": "1.0.3" + } + }, + "vue2-simplert-core": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vue2-simplert-core/-/vue2-simplert-core-1.0.3.tgz", + "integrity": "sha512-yKDS5jkp/VAyCYS+AxHT4bFJzysfdCKQMQzu7eAOqAJuRMewp2JH+fPcS+NlOifp7sD04fGBmMtgMj1Btegdfw==" + }, + "vue2-simplert-plugin": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vue2-simplert-plugin/-/vue2-simplert-plugin-0.5.3.tgz", + "integrity": "sha512-+IMwM4ca3MydvVw/RyLeNZAAANNPfAcNqXJ+nU6J51DBIhy2TzAKBs1q9cmftpB8RPPC1czCixiFzw3Cq4jELA==", + "requires": { + "vue": "^2.5.17", + "vue2-simplert-core": "1.0.3" + } + }, + "vuetify-loader": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/vuetify-loader/-/vuetify-loader-1.4.3.tgz", + "integrity": "sha512-fS0wRil682Ebsj2as+eruBoMPKaQYDhu/fDAndnTItzSY4RK4LOEIsssVL4vD6QY8dvUgoGL84SUQ6vGr777CA==", + "dev": true, + "requires": { + "loader-utils": "^1.2.0" + } + }, + "vuex": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.2.tgz", + "integrity": "sha512-ha3jNLJqNhhrAemDXcmMJMKf1Zu4sybMPr9KxJIuOpVcsDQlTBYLLladav2U+g1AvdYDG5Gs0xBTb0M5pXXYFQ==" + }, + "warning-symbol": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz", + "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=" + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "weakmap-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/weakmap-shim/-/weakmap-shim-1.1.1.tgz", + "integrity": "sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k=" + }, + "webgl-context": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", + "integrity": "sha1-jzfXJXz23xzQpJ5qextyG5TMhqA=", + "requires": { + "get-canvas-context": "^1.0.1" + } + }, + "webpack": { + "version": "4.41.6", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz", + "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz", + "integrity": "sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.15", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", + "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.2.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.6", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.25", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.4.0", + "spdy": "^4.0.1", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "12.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } + } + }, + "webpack-require": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/webpack-require/-/webpack-require-0.0.16.tgz", + "integrity": "sha1-3wSnmbvZbljgWr1mtNt38W910YQ=", + "requires": { + "invariant": "^2.1.0", + "memory-fs": "^0.2.0", + "object-assign": "^3.0.0", + "path-is-absolute": "^1.0.0", + "source-map": "^0.4.4", + "webpack": "^1.11.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browserify-aes": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", + "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", + "requires": { + "inherits": "^2.0.1" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "requires": { + "pako": "~0.2.0" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "crypto-browserify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", + "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", + "requires": { + "browserify-aes": "0.4.0", + "pbkdf2-compat": "2.0.1", + "ripemd160": "0.2.0", + "sha.js": "2.2.6" + } + }, + "enhanced-resolve": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", + "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + }, + "interpret": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", + "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } + } + }, + "memory-fs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", + "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "node-libs-browser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", + "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.1.4", + "buffer": "^4.9.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "3.3.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "0.0.1", + "os-browserify": "^0.2.0", + "path-browserify": "0.0.0", + "process": "^0.11.0", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.0.5", + "stream-browserify": "^2.0.1", + "stream-http": "^2.3.1", + "string_decoder": "^0.10.25", + "timers-browserify": "^2.0.2", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "ripemd160": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", + "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=" + }, + "sha.js": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", + "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=" + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + }, + "tapable": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", + "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=" + }, + "uglify-js": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", + "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", + "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", + "requires": { + "async": "^0.9.0", + "chokidar": "^1.0.0", + "graceful-fs": "^4.1.2" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "webpack": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", + "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", + "requires": { + "acorn": "^3.0.0", + "async": "^1.3.0", + "clone": "^1.0.2", + "enhanced-resolve": "~0.9.0", + "interpret": "^0.6.4", + "loader-utils": "^0.2.11", + "memory-fs": "~0.3.0", + "mkdirp": "~0.5.0", + "node-libs-browser": "^0.7.0", + "optimist": "~0.6.0", + "supports-color": "^3.1.0", + "tapable": "~0.1.8", + "uglify-js": "~2.7.3", + "watchpack": "^0.2.1", + "webpack-core": "~0.6.9" + }, + "dependencies": { + "memory-fs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", + "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "wgs84": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz", + "integrity": "sha1-NP3FVZF7blfPKigu0ENxDASc3HY=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha1-slxQMrokEo/8QdCfr0pewbnBQzU=", + "requires": { + "object-assign": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "write-json": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/write-json/-/write-json-0.2.2.tgz", + "integrity": "sha1-+k4VKennY6T5LwfZhBMX49JI2vM=", + "requires": { + "write": "^0.2.1" + }, + "dependencies": { + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + } + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "zero-crossings": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/zero-crossings/-/zero-crossings-1.0.1.tgz", + "integrity": "sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8=", + "requires": { + "cwise-compiler": "^1.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100755 index 0000000..a668fad --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,156 @@ +{ + "name": "istacking", + "version": "1.0.0", + "private": true, + "description": "ISOVIS Group", + "author": "Angelos Chatzimparmpas ", + "scripts": { + "build": "node build/build.js", + "lint": "eslint --ext .js,.vue src", + "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", + "start": "npm run dev" + }, + "dependencies": { + "@babel/core": "^7.8.4", + "@babel/runtime": "^7.8.4", + "@fortawesome/fontawesome-free": "^5.12.1", + "@fortawesome/fontawesome-svg-core": "^1.2.27", + "@fortawesome/free-solid-svg-icons": "^5.12.1", + "@fortawesome/vue-fontawesome": "^0.1.9", + "@statnett/vue-plotly": "^0.3.2", + "@types/d3-drag": "^1.2.3", + "@types/node": "^13.7.4", + "ajv": "^6.12.0", + "audit": "0.0.6", + "axios": "^0.19.2", + "axios-progress-bar": "^1.2.0", + "babel-preset-vue": "^2.0.2", + "blob": "0.1.0", + "bootstrap": "^4.4.1", + "bootstrap-toggle": "^2.2.2", + "bootstrap-vue": "^2.5.0", + "circlepack-chart": "^1.3.0", + "clean-webpack-plugin": "^3.0.0", + "colorbrewer": "^1.3.0", + "cryo": "0.0.6", + "d3": "^5.15.0", + "d3-array": "^2.4.0", + "d3-brush": "^1.1.5", + "d3-dispatch": "^1.0.6", + "d3-drag": "^1.2.5", + "d3-heatmap": "^1.2.1", + "d3-lasso": "0.0.5", + "d3-loom": "^1.0.2", + "d3-selection": "^1.4.1", + "d3-selection-multi": "^1.0.1", + "d3-svg-legend": "^1.13.0", + "d3_exploding_boxplot": "^0.2.1", + "file-saver": "^2.0.2", + "file-system": "^2.2.2", + "fix": "0.0.6", + "fs": "0.0.2", + "fs-es6": "0.0.2", + "ify-loader": "^1.1.0", + "interactjs": "^1.8.4", + "jquery": "^3.4.1", + "mdbvue": "^6.5.0", + "merge": "^1.2.1", + "mini-css-extract-plugin": "^0.9.0", + "npm-check-updates": "^4.0.1", + "papaparse": "^5.1.1", + "parcoord-es": "^2.2.10", + "plotly.js": "^1.52.2", + "popper.js": "^1.16.1", + "react": "^16.12.0", + "react-dom": "^16.12.0", + "stardust-allofw": "^0.1.1", + "stardust-core": "^0.2.4", + "stardust-webgl": "^0.2.4", + "strip-loader": "^0.1.2", + "toposort": "^2.0.2", + "transform-loader": "^0.2.4", + "underscore": "^1.9.2", + "update": "^0.7.4", + "vega": "^5.9.1", + "vue": "^2.6.11", + "vue-bootstrap-slider": "^2.1.8", + "vue-papa-parse": "^1.3.0", + "vue-plotly": "^1.1.0", + "vue-router": "^3.1.5", + "vue-slider-component": "^3.1.1", + "vue-underscore": "^0.1.4", + "vue2-simplert-plugin": "^0.5.3", + "webpack-cli": "^3.3.11", + "webpack-require": "0.0.16" + }, + "devDependencies": { + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-proposal-export-namespace-from": "^7.8.3", + "@babel/plugin-proposal-function-sent": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-throw-expressions": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.8.3", + "@babel/preset-env": "^7.8.4", + "autoprefixer": "^9.7.4", + "babel-eslint": "^10.0.3", + "babel-helper-vue-jsx-merge-props": "^2.0.3", + "babel-loader": "^8.0.6", + "babel-plugin-transform-vue-jsx": "^3.7.0", + "chalk": "^3.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.4.2", + "eslint": "^6.8.0", + "eslint-config-standard": "^14.1.0", + "eslint-friendly-formatter": "^4.0.1", + "eslint-loader": "^3.0.3", + "eslint-plugin-import": "^2.20.1", + "eslint-plugin-node": "^11.0.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "eslint-plugin-vue": "^6.2.1", + "extract-text-webpack-plugin": "^3.0.2", + "file-loader": "^5.1.0", + "friendly-errors-webpack-plugin": "^1.7.0", + "html-webpack-plugin": "^3.2.0", + "node-notifier": "^6.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.3", + "ora": "^4.0.3", + "portfinder": "^1.0.25", + "postcss-import": "^12.0.1", + "postcss-loader": "^3.0.0", + "postcss-url": "^8.0.0", + "rimraf": "^3.0.2", + "sass": "^1.25.0", + "sass-loader": "^8.0.2", + "semver": "^7.1.3", + "shelljs": "^0.8.3", + "uglifyjs-webpack-plugin": "^2.2.0", + "url-loader": "^3.0.0", + "vue-class-component": "^7.2.3", + "vue-cli-plugin-vuetify": "^2.0.5", + "vue-loader": "^15.9.0", + "vue-property-decorator": "^8.4.0", + "vue-style-loader": "^4.1.2", + "vue-template-compiler": "^2.6.11", + "vue2-simplert": "^1.0.0", + "vuetify-loader": "^1.4.3", + "webpack": "^4.41.6", + "webpack-bundle-analyzer": "^3.6.0", + "webpack-dev-server": "^3.10.3", + "webpack-merge": "^4.2.2" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ], + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100755 index 0000000..abc4341 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/frontend/src/assets/isovis.jpg b/frontend/src/assets/isovis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d179686e162e61107ad2ed618c90ef847aa7551f GIT binary patch literal 5940 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 46 diff --git a/frontend/src/assets/w3.css b/frontend/src/assets/w3.css new file mode 100755 index 0000000..a4bf1ec --- /dev/null +++ b/frontend/src/assets/w3.css @@ -0,0 +1,229 @@ +/* W3.CSS 4.13 June 2019 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent}a:active,a:hover{outline-width:0} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +h3{font-size:24px}h3 +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} +.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block} +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} +.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:1205px){.w3-auto{max-width:95%}} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:1050px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* Colors */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} +.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} +.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} \ No newline at end of file diff --git a/frontend/src/components/About.vue b/frontend/src/components/About.vue new file mode 100644 index 0000000..5529315 --- /dev/null +++ b/frontend/src/components/About.vue @@ -0,0 +1,8 @@ + + + diff --git a/frontend/src/components/AlgorithmHyperParam.vue b/frontend/src/components/AlgorithmHyperParam.vue new file mode 100644 index 0000000..f577a96 --- /dev/null +++ b/frontend/src/components/AlgorithmHyperParam.vue @@ -0,0 +1,351 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/Algorithms.vue b/frontend/src/components/Algorithms.vue new file mode 100644 index 0000000..3759f75 --- /dev/null +++ b/frontend/src/components/Algorithms.vue @@ -0,0 +1,1113 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/CrossoverMutationSpace.vue b/frontend/src/components/CrossoverMutationSpace.vue new file mode 100644 index 0000000..3d5d43e --- /dev/null +++ b/frontend/src/components/CrossoverMutationSpace.vue @@ -0,0 +1,309 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/DataSetExecController.vue b/frontend/src/components/DataSetExecController.vue new file mode 100644 index 0000000..0b19f40 --- /dev/null +++ b/frontend/src/components/DataSetExecController.vue @@ -0,0 +1,86 @@ + + + diff --git a/frontend/src/components/HyperParameterSpace.vue b/frontend/src/components/HyperParameterSpace.vue new file mode 100644 index 0000000..0c598de --- /dev/null +++ b/frontend/src/components/HyperParameterSpace.vue @@ -0,0 +1,312 @@ + + + \ No newline at end of file diff --git a/frontend/src/components/Main.vue b/frontend/src/components/Main.vue new file mode 100755 index 0000000..49889c2 --- /dev/null +++ b/frontend/src/components/Main.vue @@ -0,0 +1,974 @@ + + + + + + + \ No newline at end of file diff --git a/frontend/src/components/NotFound.vue b/frontend/src/components/NotFound.vue new file mode 100644 index 0000000..ec2d23e --- /dev/null +++ b/frontend/src/components/NotFound.vue @@ -0,0 +1,8 @@ + + + diff --git a/frontend/src/components/Parameters.vue b/frontend/src/components/Parameters.vue new file mode 100644 index 0000000..beb1726 --- /dev/null +++ b/frontend/src/components/Parameters.vue @@ -0,0 +1,846 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/PerformanceMetrics.vue b/frontend/src/components/PerformanceMetrics.vue new file mode 100644 index 0000000..64c5ff9 --- /dev/null +++ b/frontend/src/components/PerformanceMetrics.vue @@ -0,0 +1,148 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/Predictions.vue b/frontend/src/components/Predictions.vue new file mode 100644 index 0000000..248e02c --- /dev/null +++ b/frontend/src/components/Predictions.vue @@ -0,0 +1,454 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/VotingResults.vue b/frontend/src/components/VotingResults.vue new file mode 100644 index 0000000..1c69f28 --- /dev/null +++ b/frontend/src/components/VotingResults.vue @@ -0,0 +1,408 @@ + + + \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100755 index 0000000..922450f --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,29 @@ +import Vue from 'vue' +import BootstrapVue from 'bootstrap-vue' +import App from './App' +import 'bootstrap/dist/css/bootstrap.min.css' +import 'bootstrap-vue/dist/bootstrap-vue.css' +import router from './router' +import { library } from '@fortawesome/fontawesome-svg-core' +import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' +import { faDna, faSearch, faTrash} from '@fortawesome/free-solid-svg-icons' +import bFormSlider from 'vue-bootstrap-slider' + +library.add(faDna, faSearch, faTrash) + +Vue.component('font-awesome-icon', FontAwesomeIcon) + +Vue.use(bFormSlider) + +Vue.use(BootstrapVue) + +Vue.config.productionTip = false + +export const EventBus = new Vue() + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + router, + render: h => h(App) +}) diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100755 index 0000000..0e05ef9 --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,19 @@ +import Vue from 'vue' +import Router from 'vue-router' + +const routerOptions = [ + { path: '/', component: 'Main' }, + { path: '/about', component: 'About' }, + { path: '*', component: 'NotFound' } +] +const routes = routerOptions.map(route => { + return { + ...route, + component: () => import(`@/components/${route.component}.vue`) + } +}) +Vue.use(Router) +export default new Router({ + routes, + mode: 'history' +}) diff --git a/frontend/static/.gitkeep b/frontend/static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/vue.config.js b/frontend/vue.config.js new file mode 100644 index 0000000..2dd8dcc --- /dev/null +++ b/frontend/vue.config.js @@ -0,0 +1,10 @@ +module.exports = { + chainWebpack: config => { + config + .plugin('html') + .tap(args => { + args[0].chunksSortMode = 'none' + return args + }) + } + } \ No newline at end of file diff --git a/insertMongo.py b/insertMongo.py new file mode 100644 index 0000000..fffbe5b --- /dev/null +++ b/insertMongo.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +import sys +import pandas as pd +import pymongo +import json +import os + + +def import_content(filepath): + mng_client = pymongo.MongoClient('localhost', 27017) + mng_db = mng_client['mydb'] + #collection_name = 'StanceCTest' + collection_name = 'StanceC' + db_cm = mng_db[collection_name] + cdir = os.path.dirname(__file__) + file_res = os.path.join(cdir, filepath) + + data = pd.read_csv(file_res) + data_json = json.loads(data.to_json(orient='records')) + db_cm.remove() + db_cm.insert(data_json) + +if __name__ == "__main__": + filepath = '/Users/anchaa/Documents/Research/StackVis_code/StackVis/stance.csv' + import_content(filepath) \ No newline at end of file diff --git a/insertMongo.pyc b/insertMongo.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e596b0542e3542447b59aa71704d67f76d896b3b GIT binary patch literal 961 zcmZ`$%Z}496unORo|ZuaED(G^SJNLr2vinqm_;gBR0zvsn`tshT*aP|Dy6Go!yoXK zY*?{^bDg%VNNV@^dc-|i z_l~$v>pq!;z9Dfyc1R|r+k_fJ24N$zAV>5dNYt^xYTie){12WhEda+@J**{`|A8$K z6@s;(>O(?%K`n4f&-W11qkT$kLM@+r6cQ>@DggT2W8XhA18V!!QY}*N7>&{2JwyHMDXH!ra x&z!NyjBh!6iS3|)Es-*N0_NX{|DAJ$uve8cccp#J7wR8ln~KAmj%QO$`WN8`&4&O0 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0c55c00 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,123 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/d3-selection": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.0.10.tgz", + "integrity": "sha1-3PsN3837GtJq6kNRMjdx4a6pboQ=" + }, + "d3-array": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.0.1.tgz", + "integrity": "sha1-N1wCh0/NlsFu2fG89bSnvlPzWOc=" + }, + "d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "d3-dispatch": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.1.tgz", + "integrity": "sha1-S9ZaQ87P9DGN653yRVKqi/KBqEA=" + }, + "d3-ease": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz", + "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ==" + }, + "d3-format": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.0.2.tgz", + "integrity": "sha1-E4YYMgtLvrQ7XA/zBRkHn7vXN14=" + }, + "d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "requires": { + "d3-color": "1" + } + }, + "d3-legend": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d3-legend/-/d3-legend-1.0.0.tgz", + "integrity": "sha1-KtwzKEMy/5bSIdSTL3kXRj+i8Xk=" + }, + "d3-scale": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.3.tgz", + "integrity": "sha1-T56PDMLqDzkl/wSsJ63AkEX6TJA=", + "requires": { + "d3-array": "1", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "d3-selection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.0.2.tgz", + "integrity": "sha1-rmYq/UcCrJxdoDmyEHoXZPockHA=" + }, + "d3-svg-legend": { + "version": "2.25.6", + "resolved": "https://registry.npmjs.org/d3-svg-legend/-/d3-svg-legend-2.25.6.tgz", + "integrity": "sha1-jY3BvWk8N47ki2+CPook5o8uGtI=", + "requires": { + "@types/d3-selection": "1.0.10", + "d3-array": "1.0.1", + "d3-dispatch": "1.0.1", + "d3-format": "1.0.2", + "d3-scale": "1.0.3", + "d3-selection": "1.0.2", + "d3-transition": "1.0.3" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz", + "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==", + "requires": { + "d3-time": "1" + } + }, + "d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + }, + "d3-transition": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.0.3.tgz", + "integrity": "sha1-kdyYa92zCXNjkyCoXbcs5KsaJ7s=", + "requires": { + "d3-color": "1", + "d3-dispatch": "1", + "d3-ease": "1", + "d3-interpolate": "1", + "d3-selection": "1", + "d3-timer": "1" + } + }, + "d3v3": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3v3/-/d3v3-1.0.3.tgz", + "integrity": "sha1-37Ddsh7cPkXD62CzheZYfTFdClk=" + } + } +} diff --git a/run.py b/run.py new file mode 100644 index 0000000..268e583 --- /dev/null +++ b/run.py @@ -0,0 +1,1362 @@ +from flask import Flask, render_template, jsonify, request +from flask_pymongo import PyMongo +from flask_cors import CORS, cross_origin + +import json +import copy +import warnings +import re +import random +import math +import pandas as pd +import numpy as np +import multiprocessing + +from joblib import Memory + +from sklearn.model_selection import RandomizedSearchCV +from sklearn.model_selection import GridSearchCV +from sklearn.neighbors import KNeighborsClassifier +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import cross_val_predict +from sklearn.metrics import matthews_corrcoef +from sklearn.metrics import log_loss +from imblearn.metrics import geometric_mean_score +from sklearn.manifold import MDS +from sklearn.manifold import TSNE +import umap + +# this block of code is for the connection between the server, the database, and the client (plus routing) + +# access MongoDB +app = Flask(__name__) + +app.config["MONGO_URI"] = "mongodb://localhost:27017/mydb" +mongo = PyMongo(app) + +cors = CORS(app, resources={r"/data/*": {"origins": "*"}}) + +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/Reset', methods=["GET", "POST"]) +def reset(): + global DataRawLength + global DataResultsRaw + global previousState + previousState = [] + + global filterActionFinal + filterActionFinal = '' + + global keySpecInternal + keySpecInternal = 1 + + global dataSpacePointsIDs + dataSpacePointsIDs = [] + + global previousStateActive + previousStateActive = [] + + global RANDOM_SEED + RANDOM_SEED = 42 + + global KNNModelsCount + global LRModelsCount + + global factors + factors = [1,1,1,1,0,0,0,0] + + global keyData + keyData = 0 + + KNNModelsCount = 0 + LRModelsCount = 100 + + global XData + XData = [] + global yData + yData = [] + + global XDataStored + XDataStored = [] + global yDataStored + yDataStored = [] + + global detailsParams + detailsParams = [] + + global algorithmList + algorithmList = [] + + global ClassifierIDsList + ClassifierIDsList = '' + + # Initializing models + + global resultsList + resultsList = [] + + global RetrieveModelsList + RetrieveModelsList = [] + + global allParametersPerformancePerModel + allParametersPerformancePerModel = [] + + global allParametersPerfCrossMutr + allParametersPerfCrossMutr = [] + + global HistoryPreservation + HistoryPreservation = [] + + global all_classifiers + all_classifiers = [] + + global crossValidation + crossValidation = 5 + + # models + global KNNModels + KNNModels = [] + global RFModels + RFModels = [] + + global scoring + scoring = {'accuracy': 'accuracy', 'precision_micro': 'precision_micro', 'precision_macro': 'precision_macro', 'precision_weighted': 'precision_weighted', 'recall_micro': 'recall_micro', 'recall_macro': 'recall_macro', 'recall_weighted': 'recall_weighted', 'roc_auc_ovo_weighted': 'roc_auc_ovo_weighted'} + + global loopFeatures + loopFeatures = 2 + + global results + results = [] + + global resultsMetrics + resultsMetrics = [] + + global parametersSelData + parametersSelData = [] + + global target_names + target_names = [] + + global target_namesLoc + target_namesLoc = [] + return 'The reset was done!' + +# retrieve data from client and select the correct data set +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/ServerRequest', methods=["GET", "POST"]) +def retrieveFileName(): + global DataRawLength + global DataResultsRaw + global DataResultsRawTest + global DataRawLengthTest + + fileName = request.get_data().decode('utf8').replace("'", '"') + + global keySpecInternal + keySpecInternal = 1 + + global filterActionFinal + filterActionFinal = '' + + global dataSpacePointsIDs + dataSpacePointsIDs = [] + + global RANDOM_SEED + RANDOM_SEED = 42 + + global keyData + keyData = 0 + + global XData + XData = [] + + global previousState + previousState = [] + + global previousStateActive + previousStateActive = [] + + global yData + yData = [] + + global XDataStored + XDataStored = [] + + global yDataStored + yDataStored = [] + + global filterDataFinal + filterDataFinal = 'mean' + + global ClassifierIDsList + ClassifierIDsList = '' + + global algorithmList + algorithmList = [] + + global detailsParams + detailsParams = [] + + # Initializing models + + global RetrieveModelsList + RetrieveModelsList = [] + + global resultsList + resultsList = [] + + global allParametersPerformancePerModel + allParametersPerformancePerModel = [] + + global allParametersPerfCrossMutr + allParametersPerfCrossMutr = [] + + global HistoryPreservation + HistoryPreservation = [] + + global all_classifiers + all_classifiers = [] + + global crossValidation + crossValidation = 5 + + global scoring + scoring = {'accuracy': 'accuracy', 'precision_weighted': 'precision_weighted', 'recall_weighted': 'recall_weighted', 'f1_weighted': 'f1_weighted', 'roc_auc_ovo_weighted': 'roc_auc_ovo_weighted'} + + global loopFeatures + loopFeatures = 2 + + # models + global KNNModels + global SVCModels + global GausNBModels + global MLPModels + global LRModels + global LDAModels + global QDAModels + global RFModels + global ExtraTModels + global AdaBModels + global GradBModels + + KNNModels = [] + SVCModels = [] + GausNBModels = [] + MLPModels = [] + LRModels = [] + LDAModels = [] + QDAModels = [] + RFModels = [] + ExtraTModels = [] + AdaBModels = [] + GradBModels = [] + + global results + results = [] + + global resultsMetrics + resultsMetrics = [] + + global parametersSelData + parametersSelData = [] + + global StanceTest + StanceTest = False + + global target_names + + target_names = [] + + global target_namesLoc + + target_namesLoc = [] + + DataRawLength = -1 + DataRawLengthTest = -1 + data = json.loads(fileName) + if data['fileName'] == 'HeartC': + CollectionDB = mongo.db.HeartC.find() + elif data['fileName'] == 'StanceC': + StanceTest = True + CollectionDB = mongo.db.StanceC.find() + CollectionDBTest = mongo.db.StanceCTest.find() + elif data['fileName'] == 'DiabetesC': + CollectionDB = mongo.db.DiabetesC.find() + else: + CollectionDB = mongo.db.IrisC.find() + DataResultsRaw = [] + for index, item in enumerate(CollectionDB): + item['_id'] = str(item['_id']) + item['InstanceID'] = index + DataResultsRaw.append(item) + DataRawLength = len(DataResultsRaw) + + DataResultsRawTest = [] + if (StanceTest): + for index, item in enumerate(CollectionDBTest): + item['_id'] = str(item['_id']) + item['InstanceID'] = index + DataResultsRawTest.append(item) + DataRawLengthTest = len(DataResultsRawTest) + + dataSetSelection() + return 'Everything is okay' + +# Retrieve data set from client +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/SendtoSeverDataSet', methods=["GET", "POST"]) +def sendToServerData(): + + uploadedData = request.get_data().decode('utf8').replace("'", '"') + uploadedDataParsed = json.loads(uploadedData) + DataResultsRaw = uploadedDataParsed['uploadedData'] + + DataResults = copy.deepcopy(DataResultsRaw) + + for dictionary in DataResultsRaw: + for key in dictionary.keys(): + if (key.find('*') != -1): + target = key + continue + continue + DataResultsRaw.sort(key=lambda x: x[target], reverse=True) + DataResults.sort(key=lambda x: x[target], reverse=True) + + for dictionary in DataResults: + del dictionary[target] + + global AllTargets + global target_names + global target_namesLoc + AllTargets = [o[target] for o in DataResultsRaw] + AllTargetsFloatValues = [] + + previous = None + Class = 0 + for i, value in enumerate(AllTargets): + if (i == 0): + previous = value + target_names.append(value) + if (value == previous): + AllTargetsFloatValues.append(Class) + else: + Class = Class + 1 + target_names.append(value) + AllTargetsFloatValues.append(Class) + previous = value + + ArrayDataResults = pd.DataFrame.from_dict(DataResults) + + global XData, yData, RANDOM_SEED + XData, yData = ArrayDataResults, AllTargetsFloatValues + + global XDataStored, yDataStored + XDataStored = XData.copy() + yDataStored = yData.copy() + + return 'Processed uploaded data set' + +def dataSetSelection(): + global XDataTest, yDataTest + XDataTest = pd.DataFrame() + global StanceTest + global AllTargets + global target_names + target_namesLoc = [] + if (StanceTest): + DataResultsTest = copy.deepcopy(DataResultsRawTest) + + for dictionary in DataResultsRawTest: + for key in dictionary.keys(): + if (key.find('*') != -1): + target = key + continue + continue + + DataResultsRawTest.sort(key=lambda x: x[target], reverse=True) + DataResultsTest.sort(key=lambda x: x[target], reverse=True) + + for dictionary in DataResultsTest: + del dictionary['_id'] + del dictionary['InstanceID'] + del dictionary[target] + + AllTargetsTest = [o[target] for o in DataResultsRawTest] + AllTargetsFloatValuesTest = [] + + previous = None + Class = 0 + for i, value in enumerate(AllTargetsTest): + if (i == 0): + previous = value + target_namesLoc.append(value) + if (value == previous): + AllTargetsFloatValuesTest.append(Class) + else: + Class = Class + 1 + target_namesLoc.append(value) + AllTargetsFloatValuesTest.append(Class) + previous = value + + ArrayDataResultsTest = pd.DataFrame.from_dict(DataResultsTest) + + XDataTest, yDataTest = ArrayDataResultsTest, AllTargetsFloatValuesTest + + DataResults = copy.deepcopy(DataResultsRaw) + + for dictionary in DataResultsRaw: + for key in dictionary.keys(): + if (key.find('*') != -1): + target = key + continue + continue + + DataResultsRaw.sort(key=lambda x: x[target], reverse=True) + DataResults.sort(key=lambda x: x[target], reverse=True) + + for dictionary in DataResults: + del dictionary['_id'] + del dictionary['InstanceID'] + del dictionary[target] + + AllTargets = [o[target] for o in DataResultsRaw] + AllTargetsFloatValues = [] + + previous = None + Class = 0 + for i, value in enumerate(AllTargets): + if (i == 0): + previous = value + target_names.append(value) + if (value == previous): + AllTargetsFloatValues.append(Class) + else: + Class = Class + 1 + target_names.append(value) + AllTargetsFloatValues.append(Class) + previous = value + + ArrayDataResults = pd.DataFrame.from_dict(DataResults) + + global XData, yData, RANDOM_SEED + XData, yData = ArrayDataResults, AllTargetsFloatValues + + global XDataStored, yDataStored + XDataStored = XData.copy() + yDataStored = yData.copy() + + warnings.simplefilter('ignore') + return 'Everything is okay' + +# Retrieve data from client +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/factors', methods=["GET", "POST"]) +def RetrieveFactors(): + global factors + global allParametersPerformancePerModel + Factors = request.get_data().decode('utf8').replace("'", '"') + FactorsInt = json.loads(Factors) + factors = FactorsInt['Factors'] + + return 'Everything Okay' + +# Initialize every model for each algorithm +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/ServerRequestSelParameters', methods=["GET", "POST"]) +def retrieveModel(): + + # get the models from the frontend + RetrievedModel = request.get_data().decode('utf8').replace("'", '"') + RetrievedModel = json.loads(RetrievedModel) + + global algorithms + algorithms = RetrievedModel['Algorithms'] + + global XData + global yData + global LRModelsCount + + # loop through the algorithms + global allParametersPerformancePerModel + global HistoryPreservation + + for eachAlgor in algorithms: + if (eachAlgor) == 'KNN': + clf = KNeighborsClassifier() + params = {'n_neighbors': list(range(1, 100)), 'metric': ['chebyshev', 'manhattan', 'euclidean', 'minkowski'], 'algorithm': ['brute', 'kd_tree', 'ball_tree'], 'weights': ['uniform', 'distance']} + AlgorithmsIDsEnd = KNNModelsCount + else: + clf = LogisticRegression(random_state=RANDOM_SEED) + params = {'C': list(np.arange(1,100,1)), 'max_iter': list(np.arange(50,500,50)), 'solver': ['lbfgs', 'newton-cg', 'sag', 'saga'], 'penalty': ['l2', 'none']} + AlgorithmsIDsEnd = LRModelsCount + allParametersPerformancePerModel = randomSearch(XData, yData, clf, params, eachAlgor, AlgorithmsIDsEnd) + HistoryPreservation = allParametersPerformancePerModel.copy() + # call the function that sends the results to the frontend + + return 'Everything Okay' + +location = './cachedir' +memory = Memory(location, verbose=0) + +@memory.cache +def randomSearch(XData, yData, clf, params, eachAlgor, AlgorithmsIDsEnd): + + search = RandomizedSearchCV( + estimator=clf, param_distributions=params, n_iter=100, + cv=crossValidation, refit='accuracy', scoring=scoring, + verbose=0, n_jobs=-1) + + # fit and extract the probabilities + search.fit(XData, yData) + + # process the results + cv_results = [] + cv_results.append(search.cv_results_) + df_cv_results = pd.DataFrame.from_dict(cv_results) + + # number of models stored + number_of_models = len(df_cv_results.iloc[0][0]) + + # initialize results per row + df_cv_results_per_row = [] + + # loop through number of models + modelsIDs = [] + for i in range(number_of_models): + number = AlgorithmsIDsEnd+i + modelsIDs.append(eachAlgor+str(number)) + # initialize results per item + df_cv_results_per_item = [] + for column in df_cv_results.iloc[0]: + df_cv_results_per_item.append(column[i]) + df_cv_results_per_row.append(df_cv_results_per_item) + + # store the results into a pandas dataframe + df_cv_results_classifiers = pd.DataFrame(data = df_cv_results_per_row, columns= df_cv_results.columns) + + # copy and filter in order to get only the metrics + metrics = df_cv_results_classifiers.copy() + metrics = metrics.filter(['mean_test_accuracy','mean_test_precision_weighted','mean_test_recall_weighted','mean_test_f1_weighted','mean_test_roc_auc_ovo_weighted']) + + # concat parameters and performance + parametersPerformancePerModel = pd.DataFrame(df_cv_results_classifiers['params']) + parametersLocal = parametersPerformancePerModel['params'].copy() + + Models = [] + for index, items in enumerate(parametersLocal): + Models.append(index) + parametersLocalNew = [ parametersLocal[your_key] for your_key in Models ] + + perModelProb = [] + + resultsWeighted = [] + resultsCorrCoef = [] + resultsLogLoss = [] + resultsLogLossFinal = [] + + # influence calculation for all the instances + inputs = range(len(XData)) + num_cores = multiprocessing.cpu_count() + + for eachModelParameters in parametersLocalNew: + clf.set_params(**eachModelParameters) + clf.fit(XData, yData) + yPredict = clf.predict(XData) + yPredict = np.nan_to_num(yPredict) + yPredictProb = cross_val_predict(clf, XData, yData, cv=crossValidation, method='predict_proba') + yPredictProb = np.nan_to_num(yPredictProb) + perModelProb.append(yPredictProb.tolist()) + + resultsWeighted.append(geometric_mean_score(yData, yPredict, average='weighted')) + resultsCorrCoef.append(matthews_corrcoef(yData, yPredict)) + resultsLogLoss.append(log_loss(yData, yPredictProb, normalize=True)) + + maxLog = max(resultsLogLoss) + minLog = min(resultsLogLoss) + for each in resultsLogLoss: + resultsLogLossFinal.append((each-minLog)/(maxLog-minLog)) + + metrics.insert(5,'geometric_mean_score_weighted',resultsWeighted) + metrics.insert(6,'matthews_corrcoef',resultsCorrCoef) + metrics.insert(7,'log_loss',resultsLogLossFinal) + + perModelProbPandas = pd.DataFrame(perModelProb) + + results.append(modelsIDs) + results.append(parametersPerformancePerModel) + results.append(metrics) + results.append(perModelProbPandas) + + return results + +def PreprocessingIDs(): + dicKNN = allParametersPerformancePerModel[0] + dicLR = allParametersPerformancePerModel[4] + + df_concatIDs = dicKNN + dicLR + + return df_concatIDs + +def PreprocessingMetrics(): + dicKNN = allParametersPerformancePerModel[2] + dicLR = allParametersPerformancePerModel[6] + + dfKNN = pd.DataFrame.from_dict(dicKNN) + dfLR = pd.DataFrame.from_dict(dicLR) + + df_concatMetrics = pd.concat([dfKNN, dfLR]) + df_concatMetrics = df_concatMetrics.reset_index(drop=True) + return df_concatMetrics + +def PreprocessingPred(): + dicKNN = allParametersPerformancePerModel[3] + dicLR = allParametersPerformancePerModel[7] + + dfKNN = pd.DataFrame.from_dict(dicKNN) + dfLR = pd.DataFrame.from_dict(dicLR) + + df_concatProbs = pd.concat([dfKNN, dfLR]) + df_concatProbs.reset_index(drop=True, inplace=True) + + predictionsKNN = [] + for column, content in dfKNN.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsKNN.append(el) + + predictionsLR = [] + for column, content in dfLR.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsLR.append(el) + + predictions = [] + for column, content in df_concatProbs.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictions.append(el) + + return [predictionsKNN, predictionsLR, predictions] + +def PreprocessingParam(): + dicKNN = allParametersPerformancePerModel[1] + dicLR = allParametersPerformancePerModel[5] + + dicKNN = dicKNN['params'] + dicLR = dicLR['params'] + + dicKNN = {int(k):v for k,v in dicKNN.items()} + dicLR = {int(k):v for k,v in dicLR.items()} + + dfKNN = pd.DataFrame.from_dict(dicKNN) + dfLR = pd.DataFrame.from_dict(dicLR) + + dfKNN = dfKNN.T + dfLR = dfLR.T + + df_params = pd.concat([dfKNN, dfLR]) + return df_params + +def PreprocessingParamSep(): + dicKNN = allParametersPerformancePerModel[1] + dicLR = allParametersPerformancePerModel[5] + + dicKNN = dicKNN['params'] + dicLR = dicLR['params'] + + dicKNN = {int(k):v for k,v in dicKNN.items()} + dicLR = {int(k):v for k,v in dicLR.items()} + + dfKNN = pd.DataFrame.from_dict(dicKNN) + dfLR = pd.DataFrame.from_dict(dicLR) + + dfKNN = dfKNN.T + dfLR = dfLR.T + + return [dfKNN, dfLR] + +# remove that maybe! +def preProcsumPerMetric(factors): + sumPerClassifier = [] + loopThroughMetrics = PreprocessingMetrics() + loopThroughMetrics = loopThroughMetrics.fillna(0) + loopThroughMetrics.loc[:, 'log_loss'] = 1 - loopThroughMetrics.loc[:, 'log_loss'] + for row in loopThroughMetrics.iterrows(): + rowSum = 0 + name, values = row + for loop, elements in enumerate(values): + rowSum = elements*factors[loop] + rowSum + if sum(factors) is 0: + sumPerClassifier = 0 + else: + sumPerClassifier.append(rowSum/sum(factors) * 100) + return sumPerClassifier + +def preProcMetricsAllAndSel(): + loopThroughMetrics = PreprocessingMetrics() + loopThroughMetrics = loopThroughMetrics.fillna(0) + global factors + metricsPerModelColl = [] + metricsPerModelColl.append(loopThroughMetrics['mean_test_accuracy']) + metricsPerModelColl.append(loopThroughMetrics['geometric_mean_score_weighted']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_precision_weighted']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_recall_weighted']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_f1_weighted']) + metricsPerModelColl.append(loopThroughMetrics['matthews_corrcoef']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_roc_auc_ovo_weighted']) + metricsPerModelColl.append(loopThroughMetrics['log_loss']) + + f=lambda a: (abs(a)+a)/2 + for index, metric in enumerate(metricsPerModelColl): + if (index == 5): + metricsPerModelColl[index] = ((f(metric))*factors[index]) * 100 + elif (index == 7): + metricsPerModelColl[index] = ((1 - metric)*factors[index] ) * 100 + else: + metricsPerModelColl[index] = (metric*factors[index]) * 100 + metricsPerModelColl[index] = metricsPerModelColl[index].to_json() + return metricsPerModelColl + +def FunMDS (data): + mds = MDS(n_components=2, random_state=RANDOM_SEED) + XTransformed = mds.fit_transform(data).T + XTransformed = XTransformed.tolist() + return XTransformed + +def FunTsne (data): + tsne = TSNE(n_components=2, random_state=RANDOM_SEED).fit_transform(data) + tsne.shape + return tsne + +def FunUMAP (data): + trans = umap.UMAP(n_neighbors=15, random_state=RANDOM_SEED).fit(data) + Xpos = trans.embedding_[:, 0].tolist() + Ypos = trans.embedding_[:, 1].tolist() + return [Xpos,Ypos] + +# Sending the overview classifiers' results to be visualized as a scatterplot +@app.route('/data/PlotClassifiers', methods=["GET", "POST"]) +def SendToPlot(): + while (len(DataResultsRaw) != DataRawLength): + pass + InitializeEnsemble() + response = { + 'OverviewResults': Results + } + return jsonify(response) + +def InitializeEnsemble(): + XModels = PreprocessingMetrics() + global ModelSpaceMDS + global ModelSpaceTSNE + global allParametersPerformancePerModel + + XModels = XModels.fillna(0) + + ModelSpaceMDS = FunMDS(XModels) + ModelSpaceTSNE = FunTsne(XModels) + ModelSpaceTSNE = ModelSpaceTSNE.tolist() + ModelSpaceUMAP = FunUMAP(XModels) + + PredictionProbSel = PreprocessingPred() + + returnResults(ModelSpaceMDS,ModelSpaceTSNE,ModelSpaceUMAP,PredictionProbSel) + +def returnResults(ModelSpaceMDS,ModelSpaceTSNE,ModelSpaceUMAP,PredictionProbSel): + + global Results + global AllTargets + Results = [] + + parametersGen = PreprocessingParam() + metricsPerModel = preProcMetricsAllAndSel() + sumPerClassifier = preProcsumPerMetric(factors) + ModelsIDs = PreprocessingIDs() + + + parametersGenPD = parametersGen.to_json(orient='records') + XDataJSONEntireSet = XData.to_json(orient='records') + XDataColumns = XData.columns.tolist() + + Results.append(json.dumps(ModelsIDs)) + Results.append(json.dumps(sumPerClassifier)) + Results.append(json.dumps(parametersGenPD)) + Results.append(json.dumps(metricsPerModel)) + Results.append(json.dumps(XDataJSONEntireSet)) + Results.append(json.dumps(XDataColumns)) + Results.append(json.dumps(yData)) + Results.append(json.dumps(target_names)) + Results.append(json.dumps(AllTargets)) + Results.append(json.dumps(ModelSpaceMDS)) + Results.append(json.dumps(ModelSpaceTSNE)) + Results.append(json.dumps(ModelSpaceUMAP)) + Results.append(json.dumps(PredictionProbSel)) + + return Results + +# Initialize crossover and mutation processes +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/CrossoverMutation', methods=["GET", "POST"]) +def CrossoverMutateFun(): + + # get the models from the frontend + RemainingIds = request.get_data().decode('utf8').replace("'", '"') + RemainingIds = json.loads(RemainingIds) + + RemainingIds = RemainingIds['RemainingPoints'] + + global XData + global yData + global LRModelsCount + + # loop through the algorithms + global allParametersPerfCrossMutr + global HistoryPreservation + global allParametersPerformancePerModel + + KNNIDs = list(filter(lambda k: 'KNN' in k, RemainingIds)) + LRIDs = list(filter(lambda k: 'LR' in k, RemainingIds)) + + countKNN = 0 + countLR = 0 + setMaxLoopValue = 50 + paramAllAlgs = PreprocessingParam() + KNNIntIndex = [] + LRIntIndex = [] + + localCrossMutr = [] + allParametersPerfCrossMutrKNNC = [] + + while countKNN < setMaxLoopValue: + for dr in KNNIDs: + KNNIntIndex.append(int(re.findall('\d+', dr)[0])) + KNNPickPair = random.sample(KNNIntIndex,2) + + pairDF = paramAllAlgs.iloc[KNNPickPair] + crossoverDF = pd.DataFrame() + for column in pairDF: + listData = [] + randomZeroOne = random.randint(0, 1) + valuePerColumn = pairDF[column].iloc[randomZeroOne] + listData.append(valuePerColumn) + crossoverDF[column] = listData + if (((paramAllAlgs['algorithm'] == crossoverDF['algorithm'].iloc[0]) & (paramAllAlgs['metric'] == crossoverDF['metric'].iloc[0]) & (paramAllAlgs['n_neighbors'] == crossoverDF['n_neighbors'].iloc[0]) & (paramAllAlgs['weights'] == crossoverDF['weights'].iloc[0])).any()): + crossoverDF = pd.DataFrame() + else: + clf = KNeighborsClassifier() + params = {'n_neighbors': [crossoverDF['n_neighbors'].iloc[0]], 'metric': [crossoverDF['metric'].iloc[0]], 'algorithm': [crossoverDF['algorithm'].iloc[0]], 'weights': [crossoverDF['weights'].iloc[0]]} + AlgorithmsIDsEnd = 200 + countKNN + localCrossMutr = crossoverMutation(XData, yData, clf, params, 'KNN', AlgorithmsIDsEnd) + countKNN += 1 + crossoverDF = pd.DataFrame() + + for loop in range(setMaxLoopValue - 1): + localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4] + localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True) + localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True) + localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True) + + allParametersPerfCrossMutrKNNC.append(localCrossMutr[0]) + allParametersPerfCrossMutrKNNC.append(localCrossMutr[1]) + allParametersPerfCrossMutrKNNC.append(localCrossMutr[2]) + allParametersPerfCrossMutrKNNC.append(localCrossMutr[3]) + + HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrKNNC + + countKNN = 0 + KNNIntIndex = [] + localCrossMutr.clear() + allParametersPerfCrossMutrKNNM = [] + + while countKNN < setMaxLoopValue: + for dr in KNNIDs: + KNNIntIndex.append(int(re.findall('\d+', dr)[0])) + KNNPickPair = random.sample(KNNIntIndex,1) + + pairDF = paramAllAlgs.iloc[KNNPickPair] + crossoverDF = pd.DataFrame() + for column in pairDF: + listData = [] + if (column == 'n_neighbors'): + randomNumber = random.randint(101, math.floor(((len(yData)/crossValidation)*(crossValidation-1)))-1) + listData.append(randomNumber) + crossoverDF[column] = listData + else: + valuePerColumn = pairDF[column].iloc[0] + listData.append(valuePerColumn) + crossoverDF[column] = listData + if (((paramAllAlgs['algorithm'] == crossoverDF['algorithm'].iloc[0]) & (paramAllAlgs['metric'] == crossoverDF['metric'].iloc[0]) & (paramAllAlgs['n_neighbors'] == crossoverDF['n_neighbors'].iloc[0]) & (paramAllAlgs['weights'] == crossoverDF['weights'].iloc[0])).any()): + crossoverDF = pd.DataFrame() + else: + clf = KNeighborsClassifier() + params = {'n_neighbors': [crossoverDF['n_neighbors'].iloc[0]], 'metric': [crossoverDF['metric'].iloc[0]], 'algorithm': [crossoverDF['algorithm'].iloc[0]], 'weights': [crossoverDF['weights'].iloc[0]]} + AlgorithmsIDsEnd = 250 + countKNN + localCrossMutr = crossoverMutation(XData, yData, clf, params, 'KNN', AlgorithmsIDsEnd) + countKNN += 1 + crossoverDF = pd.DataFrame() + + for loop in range(setMaxLoopValue - 1): + localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4] + localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True) + localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True) + localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True) + + allParametersPerfCrossMutrKNNM.append(localCrossMutr[0]) + allParametersPerfCrossMutrKNNM.append(localCrossMutr[1]) + allParametersPerfCrossMutrKNNM.append(localCrossMutr[2]) + allParametersPerfCrossMutrKNNM.append(localCrossMutr[3]) + + HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrKNNM + + localCrossMutr.clear() + allParametersPerfCrossMutrLRC = [] + + while countLR < setMaxLoopValue: + for dr in LRIDs: + LRIntIndex.append(int(re.findall('\d+', dr)[0])) + LRPickPair = random.sample(LRIntIndex,2) + + pairDF = paramAllAlgs.iloc[LRPickPair] + crossoverDF = pd.DataFrame() + for column in pairDF: + listData = [] + randomZeroOne = random.randint(0, 1) + valuePerColumn = pairDF[column].iloc[randomZeroOne] + listData.append(valuePerColumn) + crossoverDF[column] = listData + if (((paramAllAlgs['C'] == crossoverDF['C'].iloc[0]) & (paramAllAlgs['max_iter'] == crossoverDF['max_iter'].iloc[0]) & (paramAllAlgs['solver'] == crossoverDF['solver'].iloc[0]) & (paramAllAlgs['penalty'] == crossoverDF['penalty'].iloc[0])).any()): + crossoverDF = pd.DataFrame() + else: + clf = LogisticRegression(random_state=RANDOM_SEED) + params = {'C': [crossoverDF['C'].iloc[0]], 'max_iter': [crossoverDF['max_iter'].iloc[0]], 'solver': [crossoverDF['solver'].iloc[0]], 'penalty': [crossoverDF['penalty'].iloc[0]]} + AlgorithmsIDsEnd = 300 + countLR + localCrossMutr = crossoverMutation(XData, yData, clf, params, 'LR', AlgorithmsIDsEnd) + countLR += 1 + crossoverDF = pd.DataFrame() + + for loop in range(setMaxLoopValue - 1): + localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4] + localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True) + localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True) + localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True) + + allParametersPerfCrossMutrLRC.append(localCrossMutr[0]) + allParametersPerfCrossMutrLRC.append(localCrossMutr[1]) + allParametersPerfCrossMutrLRC.append(localCrossMutr[2]) + allParametersPerfCrossMutrLRC.append(localCrossMutr[3]) + + HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrLRC + + countLR = 0 + LRIntIndex = [] + localCrossMutr.clear() + allParametersPerfCrossMutrLRM = [] + + while countLR < setMaxLoopValue: + for dr in LRIDs: + LRIntIndex.append(int(re.findall('\d+', dr)[0])) + LRPickPair = random.sample(LRIntIndex,1) + + pairDF = paramAllAlgs.iloc[LRPickPair] + crossoverDF = pd.DataFrame() + for column in pairDF: + listData = [] + if (column == 'C'): + randomNumber = random.randint(101, 1000) + listData.append(randomNumber) + crossoverDF[column] = listData + else: + valuePerColumn = pairDF[column].iloc[0] + listData.append(valuePerColumn) + crossoverDF[column] = listData + if (((paramAllAlgs['C'] == crossoverDF['C'].iloc[0]) & (paramAllAlgs['max_iter'] == crossoverDF['max_iter'].iloc[0]) & (paramAllAlgs['solver'] == crossoverDF['solver'].iloc[0]) & (paramAllAlgs['penalty'] == crossoverDF['penalty'].iloc[0])).any()): + crossoverDF = pd.DataFrame() + else: + clf = LogisticRegression(random_state=RANDOM_SEED) + params = {'C': [crossoverDF['C'].iloc[0]], 'max_iter': [crossoverDF['max_iter'].iloc[0]], 'solver': [crossoverDF['solver'].iloc[0]], 'penalty': [crossoverDF['penalty'].iloc[0]]} + AlgorithmsIDsEnd = 350 + countLR + localCrossMutr = crossoverMutation(XData, yData, clf, params, 'LR', AlgorithmsIDsEnd) + countLR += 1 + crossoverDF = pd.DataFrame() + + for loop in range(setMaxLoopValue - 1): + localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4] + localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True) + localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True) + localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True) + + allParametersPerfCrossMutrLRM.append(localCrossMutr[0]) + allParametersPerfCrossMutrLRM.append(localCrossMutr[1]) + allParametersPerfCrossMutrLRM.append(localCrossMutr[2]) + allParametersPerfCrossMutrLRM.append(localCrossMutr[3]) + + HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrLRM + + allParametersPerfCrossMutr = allParametersPerfCrossMutrKNNC + allParametersPerfCrossMutrKNNM + allParametersPerfCrossMutrLRC + allParametersPerfCrossMutrLRM + + KNNIntIndex = [] + for dr in KNNIDs: + KNNIntIndex.append(int(re.findall('\d+', dr)[0])) + + allParametersPerformancePerModel[0] = [j for i, j in enumerate(allParametersPerformancePerModel[0]) if i not in KNNIntIndex] + allParametersPerformancePerModel[1].drop(allParametersPerformancePerModel[1].index[KNNIntIndex], inplace=True) + allParametersPerformancePerModel[2].drop(allParametersPerformancePerModel[2].index[KNNIntIndex], inplace=True) + allParametersPerformancePerModel[3].drop(allParametersPerformancePerModel[3].index[KNNIntIndex], inplace=True) + + LRIntIndex = [] + for dr in LRIDs: + LRIntIndex.append(int(re.findall('\d+', dr)[0]) - 100) + + allParametersPerformancePerModel[4] = [j for i, j in enumerate(allParametersPerformancePerModel[4]) if i not in LRIntIndex] + allParametersPerformancePerModel[5].drop(allParametersPerformancePerModel[5].index[LRIntIndex], inplace=True) + allParametersPerformancePerModel[6].drop(allParametersPerformancePerModel[6].index[LRIntIndex], inplace=True) + allParametersPerformancePerModel[7].drop(allParametersPerformancePerModel[7].index[LRIntIndex], inplace=True) + + return 'Everything Okay' + +def crossoverMutation(XData, yData, clf, params, eachAlgor, AlgorithmsIDsEnd): + + search = GridSearchCV( + estimator=clf, param_grid=params, cv=crossValidation, refit='accuracy', + scoring=scoring, verbose=0, n_jobs=-1) + + # fit and extract the probabilities + search.fit(XData, yData) + + # process the results + cv_results = [] + cv_results.append(search.cv_results_) + df_cv_results = pd.DataFrame.from_dict(cv_results) + + # number of models stored + number_of_models = len(df_cv_results.iloc[0][0]) + + # initialize results per row + df_cv_results_per_row = [] + + # loop through number of models + modelsIDs = [] + for i in range(number_of_models): + number = AlgorithmsIDsEnd+i + modelsIDs.append(eachAlgor+str(number)) + # initialize results per item + df_cv_results_per_item = [] + for column in df_cv_results.iloc[0]: + df_cv_results_per_item.append(column[i]) + df_cv_results_per_row.append(df_cv_results_per_item) + + # store the results into a pandas dataframe + df_cv_results_classifiers = pd.DataFrame(data = df_cv_results_per_row, columns= df_cv_results.columns) + + # copy and filter in order to get only the metrics + metrics = df_cv_results_classifiers.copy() + metrics = metrics.filter(['mean_test_accuracy','mean_test_precision_weighted','mean_test_recall_weighted','mean_test_f1_weighted','mean_test_roc_auc_ovo_weighted']) + + # concat parameters and performance + parametersPerformancePerModel = pd.DataFrame(df_cv_results_classifiers['params']) + parametersLocal = parametersPerformancePerModel['params'].copy() + + Models = [] + for index, items in enumerate(parametersLocal): + Models.append(index) + + parametersLocalNew = [ parametersLocal[your_key] for your_key in Models ] + + perModelProb = [] + + resultsWeighted = [] + resultsCorrCoef = [] + resultsLogLoss = [] + resultsLogLossFinal = [] + + # influence calculation for all the instances + inputs = range(len(XData)) + num_cores = multiprocessing.cpu_count() + + for eachModelParameters in parametersLocalNew: + clf.set_params(**eachModelParameters) + clf.fit(XData, yData) + yPredict = clf.predict(XData) + yPredict = np.nan_to_num(yPredict) + yPredictProb = cross_val_predict(clf, XData, yData, cv=crossValidation, method='predict_proba') + yPredictProb = np.nan_to_num(yPredictProb) + perModelProb.append(yPredictProb.tolist()) + + resultsWeighted.append(geometric_mean_score(yData, yPredict, average='weighted')) + resultsCorrCoef.append(matthews_corrcoef(yData, yPredict)) + resultsLogLoss.append(log_loss(yData, yPredictProb, normalize=True)) + + maxLog = max(resultsLogLoss) + minLog = min(resultsLogLoss) + for each in resultsLogLoss: + resultsLogLossFinal.append((each-minLog)/(maxLog-minLog)) + + metrics.insert(5,'geometric_mean_score_weighted',resultsWeighted) + metrics.insert(6,'matthews_corrcoef',resultsCorrCoef) + metrics.insert(7,'log_loss',resultsLogLossFinal) + + perModelProbPandas = pd.DataFrame(perModelProb) + + results.append(modelsIDs) + results.append(parametersPerformancePerModel) + results.append(metrics) + results.append(perModelProbPandas) + + return results + +def PreprocessingIDsCM(): + dicKNNC = allParametersPerfCrossMutr[0] + dicKNNM = allParametersPerfCrossMutr[4] + dicLRC = allParametersPerfCrossMutr[8] + dicLRM = allParametersPerfCrossMutr[12] + + df_concatIDs = dicKNNC + dicKNNM + dicLRC + dicLRM + + return df_concatIDs + +def PreprocessingMetricsCM(): + dicKNNC = allParametersPerfCrossMutr[2] + dicKNNM = allParametersPerfCrossMutr[6] + dicLRC = allParametersPerfCrossMutr[10] + dicLRM = allParametersPerfCrossMutr[14] + + dfKNNC = pd.DataFrame.from_dict(dicKNNC) + dfKNNM = pd.DataFrame.from_dict(dicKNNM) + dfLRC = pd.DataFrame.from_dict(dicLRC) + dfLRM = pd.DataFrame.from_dict(dicLRM) + + df_concatMetrics = pd.concat([dfKNNC, dfKNNM, dfLRC, dfLRM]) + df_concatMetrics = df_concatMetrics.reset_index(drop=True) + return df_concatMetrics + +def PreprocessingPredCM(): + dicKNNC = allParametersPerfCrossMutr[3] + dicKNNM = allParametersPerfCrossMutr[7] + dicLRC = allParametersPerfCrossMutr[11] + dicLRM = allParametersPerfCrossMutr[15] + + dfKNNC = pd.DataFrame.from_dict(dicKNNC) + dfKNNM = pd.DataFrame.from_dict(dicKNNM) + dfLRC = pd.DataFrame.from_dict(dicLRC) + dfLRM = pd.DataFrame.from_dict(dicLRM) + + df_concatProbs = pd.concat([dfKNNC, dfKNNM, dfLRC, dfLRM]) + predictions = [] + for column, content in df_concatProbs.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictions.append(el) + + return predictions + +def PreprocessingParamCM(): + dicKNNC = allParametersPerfCrossMutr[1] + dicKNNM = allParametersPerfCrossMutr[5] + dicLRC = allParametersPerfCrossMutr[9] + dicLRM = allParametersPerfCrossMutr[13] + + dicKNNC = dicKNNC['params'] + dicKNNM = dicKNNM['params'] + dicLRC = dicLRC['params'] + dicLRM = dicLRM['params'] + + dicKNNC = {int(k):v for k,v in dicKNNC.items()} + dicKNNM = {int(k):v for k,v in dicKNNM.items()} + dicLRC = {int(k):v for k,v in dicLRC.items()} + dicLRM = {int(k):v for k,v in dicLRM.items()} + + dfKNNC = pd.DataFrame.from_dict(dicKNNC) + dfKNNM = pd.DataFrame.from_dict(dicKNNM) + dfLRC = pd.DataFrame.from_dict(dicLRC) + dfLRM = pd.DataFrame.from_dict(dicLRM) + + dfKNNC = dfKNNC.T + dfKNNM = dfKNNM.T + dfLRC = dfLRC.T + dfLRM = dfLRM.T + + df_params = pd.concat([dfKNNC, dfKNNM, dfLRC, dfLRM]) + return df_params + +def PreprocessingParamSepCM(): + dicKNNC = allParametersPerfCrossMutr[1] + dicKNNM = allParametersPerfCrossMutr[5] + dicLRC = allParametersPerfCrossMutr[9] + dicLRM = allParametersPerfCrossMutr[13] + + dicKNNC = dicKNNC['params'] + dicKNNM = dicKNNM['params'] + dicLRC = dicLRC['params'] + dicLRM = dicLRM['params'] + + dicKNNC = {int(k):v for k,v in dicKNNC.items()} + dicKNNM = {int(k):v for k,v in dicKNNM.items()} + dicLRC = {int(k):v for k,v in dicLRC.items()} + dicLRM = {int(k):v for k,v in dicLRM.items()} + + dfKNNC = pd.DataFrame.from_dict(dicKNNC) + dfKNNM = pd.DataFrame.from_dict(dicKNNM) + dfLRC = pd.DataFrame.from_dict(dicLRC) + dfLRM = pd.DataFrame.from_dict(dicLRM) + + dfKNNC = dfKNNC.T + dfKNNM = dfKNNM.T + dfLRC = dfLRC.T + dfLRM = dfLRM.T + + return [dfKNNC, dfKNNM, dfLRC, dfLRM] + +# remove that maybe! +def preProcsumPerMetricCM(factors): + sumPerClassifier = [] + loopThroughMetrics = PreprocessingMetricsCM() + loopThroughMetrics = loopThroughMetrics.fillna(0) + loopThroughMetrics.loc[:, 'log_loss'] = 1 - loopThroughMetrics.loc[:, 'log_loss'] + for row in loopThroughMetrics.iterrows(): + rowSum = 0 + name, values = row + for loop, elements in enumerate(values): + rowSum = elements*factors[loop] + rowSum + if sum(factors) is 0: + sumPerClassifier = 0 + else: + sumPerClassifier.append(rowSum/sum(factors) * 100) + return sumPerClassifier + +def preProcMetricsAllAndSelCM(): + loopThroughMetrics = PreprocessingMetricsCM() + loopThroughMetrics = loopThroughMetrics.fillna(0) + global factors + metricsPerModelColl = [] + metricsPerModelColl.append(loopThroughMetrics['mean_test_accuracy']) + metricsPerModelColl.append(loopThroughMetrics['geometric_mean_score_weighted']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_precision_weighted']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_recall_weighted']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_f1_weighted']) + metricsPerModelColl.append(loopThroughMetrics['matthews_corrcoef']) + metricsPerModelColl.append(loopThroughMetrics['mean_test_roc_auc_ovo_weighted']) + metricsPerModelColl.append(loopThroughMetrics['log_loss']) + + f=lambda a: (abs(a)+a)/2 + for index, metric in enumerate(metricsPerModelColl): + if (index == 5): + metricsPerModelColl[index] = ((f(metric))*factors[index]) * 100 + elif (index == 7): + metricsPerModelColl[index] = ((1 - metric)*factors[index] ) * 100 + else: + metricsPerModelColl[index] = (metric*factors[index]) * 100 + metricsPerModelColl[index] = metricsPerModelColl[index].to_json() + return metricsPerModelColl + +# Sending the overview classifiers' results to be visualized as a scatterplot +@app.route('/data/PlotCrossMutate', methods=["GET", "POST"]) +def SendToPlotCM(): + while (len(DataResultsRaw) != DataRawLength): + pass + PreProcessingInitial() + response = { + 'OverviewResultsCM': ResultsCM + } + return jsonify(response) + +def PreProcessingInitial(): + XModels = PreprocessingMetricsCM() + global allParametersPerfCrossMutr + + XModels = XModels.fillna(0) + + ModelSpaceMDSCM = FunMDS(XModels) + ModelSpaceTSNECM = FunTsne(XModels) + ModelSpaceTSNECM = ModelSpaceTSNECM.tolist() + ModelSpaceUMAPCM = FunUMAP(XModels) + + PredictionProbSel = PreprocessingPredCM() + + CrossMutateResults(ModelSpaceMDSCM,ModelSpaceTSNECM,ModelSpaceUMAPCM,PredictionProbSel) + +def CrossMutateResults(ModelSpaceMDSCM,ModelSpaceTSNECM,ModelSpaceUMAPCM,PredictionProbSel): + + global ResultsCM + global AllTargets + ResultsCM = [] + + parametersGen = PreprocessingParamCM() + metricsPerModel = preProcMetricsAllAndSelCM() + sumPerClassifier = preProcsumPerMetricCM(factors) + ModelsIDs = PreprocessingIDsCM() + + + parametersGenPD = parametersGen.to_json(orient='records') + XDataJSONEntireSet = XData.to_json(orient='records') + XDataColumns = XData.columns.tolist() + + ResultsCM.append(json.dumps(ModelsIDs)) + ResultsCM.append(json.dumps(sumPerClassifier)) + ResultsCM.append(json.dumps(parametersGenPD)) + ResultsCM.append(json.dumps(metricsPerModel)) + ResultsCM.append(json.dumps(XDataJSONEntireSet)) + ResultsCM.append(json.dumps(XDataColumns)) + ResultsCM.append(json.dumps(yData)) + ResultsCM.append(json.dumps(target_names)) + ResultsCM.append(json.dumps(AllTargets)) + ResultsCM.append(json.dumps(ModelSpaceMDSCM)) + ResultsCM.append(json.dumps(ModelSpaceTSNECM)) + ResultsCM.append(json.dumps(ModelSpaceUMAPCM)) + ResultsCM.append(json.dumps(PredictionProbSel)) + + return Results + +def PreprocessingPredSel(SelectedIDs): + + numberIDKNN = [] + numberIDLR = [] + for el in SelectedIDs: + match = re.match(r"([a-z]+)([0-9]+)", el, re.I) + if match: + items = match.groups() + if (items[0] == 'KNN'): + numberIDKNN.append(int(items[1])) + else: + numberIDLR.append(int(items[1]) - 100) + + dicKNN = allParametersPerformancePerModel[3] + dicLR = allParametersPerformancePerModel[7] + + dfKNN = pd.DataFrame.from_dict(dicKNN) + dfKNN = dfKNN.loc[numberIDKNN] + dfLR = pd.DataFrame.from_dict(dicLR) + dfLR = dfLR.loc[numberIDLR] + dfLR.index += 100 + df_concatProbs = pd.concat([dfKNN, dfLR]) + + predictionsKNN = [] + for column, content in dfKNN.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsKNN.append(el) + + predictionsLR = [] + for column, content in dfLR.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictionsLR.append(el) + predictions = [] + for column, content in df_concatProbs.items(): + el = [sum(x)/len(x) for x in zip(*content)] + predictions.append(el) + + return [predictionsKNN, predictionsLR, predictions] + +@cross_origin(origin='localhost',headers=['Content-Type','Authorization']) +@app.route('/data/SendtoSeverSelIDs', methods=["GET", "POST"]) +def RetrieveSelIDsPredict(): + global ResultsSelPred + ResultsSelPred = [] + RetrieveIDsSelection = request.get_data().decode('utf8').replace("'", '"') + RetrieveIDsSelection = json.loads(RetrieveIDsSelection) + RetrieveIDsSelection = RetrieveIDsSelection['predictSelectionIDs'] + ResultsSelPred = PreprocessingPredSel(RetrieveIDsSelection) + + return 'Everything Okay' + +@app.route('/data/RetrievePredictions', methods=["GET", "POST"]) +def SendPredictSel(): + global ResultsSelPred + response = { + 'PredictSel': ResultsSelPred + } + return jsonify(response) \ No newline at end of file
  • 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 N-opIt`KRV<{{x`J^acO` literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/termui.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/termui.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c3df1159be88c98d2d7f6d669074ad00056a344 GIT binary patch literal 18863 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 E09G7UO8@`> literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/testing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e3ae1d05e8a175156978c922e86c6c41270606e GIT binary patch literal 10257 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/types.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/types.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2174f4520664229e57f70331ab6d4c3f8c587be GIT binary patch literal 17506 zcmb_kTZ|l6TCS?DzRcC*u`_lYXH)Uo8_!~o6YniM1j~t?NgP5u*ppUTu46o#sKQz3uzwdUTwt#xYn?ilcUqF37>eJo~>N8SbM19tqLw!!_2T-5) z_MyH{>IYF@@b;s=U+PbwzUUo5{eaY$P(SEBf%+5v68b-c`jU4D^+WRhFzScBCsBV= z>QAD6#Cr<$r=)%a^`qX?s6Q?Br%?Zx_YCUKNc|}4j`u9;&-(k(|I^-a@0j=T56#-g z`~$a*+B5z^ln%x=YR~#lqCDmwM)`672+HH0dDU1x@e@M6`V&CgSS}|sVb|}}qgeTF zJDH08n{hqf?fS`lGido8x9!*Cu-*%jLtB1a=d)-xiv4!o?=(U$=xil(e8KO1r9zb~ z)>(Je*7aeN!dqWFyKE-2uejb@u0o%&ua>Q(61h#k;kH^ycz>`l_r=`Is(I|+~&i5k6bqL;jpU0uob)(^s)v)6` zy-s7>?QHqp#P;cYou&%g=oi?)tRC1hh$Bb&QLh!t{POjUkHbZs^tV>i8DnOfz7u$U zyBo%SCtjX71e&;;E#Er(bl(v$Z5D8 z4ip2%4L9yZ#vR-btU=)}sKPTq8D&C?P4zN|Hh&zWIBGI)I)& z+C0-$!F4zG&s=xa8Bm4itLRKyo!Q)}*I$f2)A`(W@6(NX_xjoAFO{et^K@cfxZD`;FxOHFRw-K0{llT+&T<6MBO%B-0E#hip! zvIY$cE%?V@GPx|7UkLkK{c~6RxTiWKFy8?$x|lUE)pSV=r2d#V&g;Z zYdZ$vasdvgNV!hX!JOMJn}F`ZUJM3k2T_!90I5nAL#eZ(`H;_6Rvhqn#GXCR_f}V( zvn$W%Wc2V=9*{NYfv{Te{g(eT`D%;(r}wOOyyX~Sj$vs)A#L`93t9$gGzsmA*a2$r zUnc|?bgqZjzy(BEE~Q*7UumJjMQZkPP712^40PM&Ab5AmK$X32j;){rVH34MB2Htw*SQvfo}t#LpFp!h=pgW*18AXV z(t9h2V%^s`Ra|OHYZ(P^2zpkkR{upEUpRgX|WF#0R|8SD{}xw zgaubHbs=36F$B4y<+-e>J1M7)?n~i`%@JP7*JJhPhwI_1Wvg11YmOpW?4x=zU9Y!8 zuh;VH^<=hQe;)`*-<0chFKqB}5Y-z{RAB_nBsO0wsv-3RizOC^SdhciQ5GL#G2}nF zqj*(wD7dJIwaTn*+6B8}Thn%>P$^eRm1$|wz{~uPjCdYb#GXejDc`1r{h@K&gf(RY z=*495LN?8O;CfIE8u6mBoh64lXmRp0=psk4a^-#y1EIf zHtJRepMqWmbvP&uJ!NY2lXx;ReSr_?E9eAqz5a{rG*|gcV>5u-*Nw(lYX)D)R6N}5 zPHP*7Lf1B8^V+ofiU};5#_nuv4b0o-E%RNYa~$sqc=v{W7u$Sur|5wh?^?IaFB%=| z3s};fQf4ighJGfCD^&Z%UfewWVp3Lqw*_IiTvl9FGW`xMXdwi}MI^ItcLMkh`cYDV zv6_@TpHGD5Q(jdM*FP89}B^ zg485=WJS$+W~SHCNyDyWI-7&>kH2FBYm2d(%)DKF>&oQ|uU@_S>O~>b`>-@f7T8zy zdJ{cmV?RA{?5yPk);^ApHBvs!yGfXN0WUUiMI{vE>PkWJ*<;~m-&OIOa_&|%b#kn5 zq@1t%s8D6a=546R*t%`pvUleP=AFX8zN`7^3i!zeKXp@nDxytsP#oCT3aXX1Ev9Xq zwC#>=%YMfBF6BOOu+T!zZR!*z0tj5mwlDQ^x!U_L2b*bak+-~YpPdbo10y>J+E;SELxv`GVN4sLK`+i%d$ zceh;P7;l@wP1I?ZhD|XKqh7ZgD(KtP5r852GHl^cj9EC)(p}_iyVrf1i0Bkj7iK8@ zWcmK8?>no?Z?10W*_;l$akQbM81%DTYIJQrCMDfuvg(@#a75)9naZOlEh~&NT}J@! zB{Rz5Z{W%>yzhd1Gt_Q^c{JcJMdAfECLNPc?xaq|63r0shW(`z(R&}60~opXP8f6) zhs=hjUAT96+F!qhD;s_>9sYi9>O*J1`G)|!_%kP>mA-Y#!3556?1xQ;cHp;0CUazT zGWYQ!X-k)J30OL~Arf|sYb6Dt1ffxoV8@$-!j2Am;O-7=6N;ak4qIL{-dnn5%Toxj zfqBhRX9q9{-#_~X0uc21%)0*7UR zgDoJa9gN|=cIxna;J5{SzfOZlo4te+l=TE*rG6H#_M(qQ^LKEGMQm8pu!t)VRnuY) zRIHNOpHE>pN#hmprNE8dcqYU;Jk;B!5R+ByPwP)lo>0rAC%Q=*g%hn>kyUp&msC~_ zDOqdA>hknnBjgyGD^Yr4j_h#;?yCb=@!8in66akh!ViEJlz$6~?;5!BKhEYnuE;?# zF1~30-(#oDUh2fTB23C~u>CDx<;su@FojFtM)z;GLUnjMH8EqWX+ia!P1Tt}bv6J* zGnyGO90B1cPvkL;EM}UHhu~WQx9T)T&}xic(W6_4KS1k_8nF(BGvt)3u_od*KxF8+j^a3J1U-v7Zu(G70peJQg`kmm`3OCt3sFzHn(5~kWCXp6>e?7X5ck3mn@HuYf0VcWQQEGez6TWoPg1`bRUV!5 z>30?N$I`~qJ&v_GDsNy}vp=?P7KWmPN^04z_D^devKed({B!8KQ;z66 zmCt>$$0zFU?>I#gKTPvcg47BR23d7&x$+RDM;#`ejlf_S#JPyKe}F5ZeOW0})lC;G z2Nj<;aOHoT#d%zhs^;ci3B%Tip4&tfk=-%2CL;+Gy^fpQ>06AU(Wvj>tXX%BTeOc% z*jt}q>=O3{+@EDg4a8gUilf?3ET&SGJ4>3Rwqo% z&e|mXn9dV|{r07cA{)4KsN;0KUf|_ur(np@UPA@GsL^61=vZv3 zV~nlF1;mGrK|~oh?|`Pu>Hv zN2Ve5WzLpkJwVggfI&t zxMxo6Y!d+=9RNa(kpzHdWRGP&v6<`Q9)PKK(T4>H!`X31jc&1F8RtP71-EyRoTK+L zm2(4|CJ+Uw0nHX-BExWYdvVBpaOMfn@P*&)VfVA4ZDm*ll6DdMuEO?cc%$Q-ber7b zq@j+jsW$c(r7P@{2GKUYrP+_6uvIM2Ip;h#gIPmp^1#VOUB3|^0YqC}8ylxLHuPMv zG21}81YC+3%W|+l+;Hdqo?TmPt0C?rU%j%MB`KVeDGPA0>oR zGw3j3hXZjUT+ld(vqYy6{G|CQ%t4Xf=(2tb>7K{qv&uBMCqdM9Sdo7RQxom#zw(kW16%ZOK8LQXDhITVh2n1fbyvL2w-V;9W zpbZC;FE$WDSQwxro-2!fF<>dbYD zU7ac=i9Q$T6Ec}(2mYuNh7QkHscO)VybFV(oXeSgJOw){G}GXfJ;1sdtFVsO7#LZ8;m+! zI9T^cX(}c*i9D%fl$n$yV=qEX3usMB8Y|fzfs5YNCW{6OkA=@-k2;`NdW>ROYzg=w z`d@!;4T~6hrK0xHl)w4p8LOZhB3|YK@5FRw@bM_kXlO%(;$TRBl5$g$0*cj-%+qU$ zd1D>nRGAbfn#Fc$$L^V6vLDhlY+d*3TxFfi_eoBd4u{^)ps|aPA^dow<$iOrx`qKbh4}*dO+n z=Hhv=HvZi-Zk0`=e+-VvKF^L9=*GnR2j$yiVcmCu6%Q@HTK>Z5K5wy_*rfWTNGa(< zSCc6EPhAkn#k3^yxUd`}z`T%YS>ARdH;$FsMq@S0Vh??>m)e}9xP_g%D6iT9`N94+ z9XuGC*{jm^=32eVMTqd7#W8LIw_n?5=zWw zZC1-(J#u3Dd#Fgf`A?B>Fh(w76lHxTF8B*>fa_}BHuViFiS%SlC zRxFTvxiY2rjy#?Jk*?3WeI8FmiT!P@I`kpo~S&SCM>xcDv|RM-kJh zz;IDP*wZuGbR%eWJ)1Po@CIX}Szk0Byg(s6HH0~lYw}bD43iDhG+v||es-8{xPdi= zH|m}nZErX?pn@eOG5vOxs;`Y*IP5%tp`eG-j5G!hMr@(63Fs7KXgK+dc7OncIe{a8 zlIf|}-fsFJ4(%goO5pUtqqLGbH()oC`6Mk{avmok zUw0;31ws5AaIlF%d$87Ml|{R4WISqggOK!e#;`IZ{?$>!%knPQLFOB$fLNyVlFGm( zwB0~x;zrzWM!DUanYbD+?I6ZR`Pc-QWxWc~k*67BEZHB=a^u10IY;Z%^EkYBSjId3 zh(e1(fp`$eVa924H71ZI>WtIA=P)l8>%y#vWNe}js{Eo~Y82i4bGpok^ zC=pX__ZoP!9YXqHhS-_jlDu2=ckep1pFsb~(bhcE_~9O4bPcw(^=gB`1^)3jH|P{9 z54J`JCD^3JK^bLfP(g{i9aFuI(u!Wk7J*T(c-%CZ;uE#Wx6vjIK|H5bJJp#*G?g{> zG$qz;8Ab^OgQ&J-D(B|f)Wu99s|Zt5Jrv8+FnmRpCR4dINh+CWNGchNCzXsfliAED zBvO;hXRn)hW08W*Q~*8UFC0VU8|@S zCLP80ZS3yfGCQ-V6|-8Jeg@Crm(kBKqNKBn=#Ho_p~#Hz2|F3dVk5-vv0oPu0hl;y z@T***4nQu!N}9*I`iEpK_qNSVa9VPC$gPSV1~jp;h7boic1)Buqwq|$`nDNe#4}4h z9~X8Qc4J}|lCyVW@12O+(1rK zvM_e^!?<*3Zcy5pziX-=;_GQ~Tqb;jp7upQM(c&N^^c`BS1`Ht{%@OV0W)4?C~@b& zT??y%ql6LYL`?qXAilYnfAfTV14!T-aLnXyvh^;Pk=*=W0IP9YHBt5tors)cC!%9o zwbK+3)>-KDpCZmdGS5nlTh-ih7+HQv$qPs&&8m#$uU^|hpo{C0Z4!i@Uy#YyzppZU%@SsSSNW6B=K4qDc#gXi3Me`hlOdFf0qQlh8qLU!9nqiXRR!Gj)`=1 zJLj#%^p5EX`dP(1eD9srpG}!Vj;1YF*4Ee8*4Ngm%QF)_h#Xuh#tcRr2Z7Oj9S2It zcQ|pjs63_J1~?7}D;1HR4Lr{OC|}Owie5x9>Nt3kR9>@vB$azbNiQ$qUXEfS)f`C( zJcNlr=``GjnWVVhL%ha41evuC&6%moJSzZ3zE(saEGT}r+l6K0YURvRKdGA36xZ6- zN=i%?ow*=^Ed-53{V~WCodO*<{H{LlB*)7(5C&vi21BHV2gw?FcA_5}VGnAZ=FHGD zq2x#7JZ2|H(qK!CG?7ynG^c5rr4c0wa?wD@Tp?L}>I;oT7Bj1h!$@vJ*ukn{qvv5q zcmnsGwbSXfH}msOYnavEU=x;^CH=(&|7i|{lX$XT0bV*8oPL8>19K38t{!bL0Q{|8 zoXEhU_#w{HAdHOo8T}SP%DCeqa9YJHIdcPCYQTxPI01SDjqX=NPs4vyt?~W>$&T8R z`F|fm4P3+-1{efTaUiKeH9xVy#)z}yY5KtyG~s)*x0vSziT)kyeYmi~zC59tI_X-A zTZy%TU09qh80YSfreESxc%0+hUy@fiMhOuW!DOzAS6*U3u@#-eP1YP^6lM9DvSixY zp6(U(|6gSNVo!a3yx)9jXfiz0NU5iDA$2k;M7_Y|u6fAtiiZf55@KgBePlX$2b?#r zh!=sWA;Yr^?;sKUeJhI{nquK#&fh{K^&2eqfMn_=#Ap1QU3KoSvzgmQ|7ksQ@w11} z$Xb46oc=cCVpN7?+9`>0pgplAugequL0J&H{x91u9w2}f`$_EYd z9KPWhV7<9y^=I@Ta`+@SK1fDXDFs~7Dhf?P*;vTyJ`!7q2AUs0S%2O5I^t;}2rD>C zf!ToEEK;e=3K=VJUSehy1O55IZ!rjIeZ%~Qal0^vT}}LjA#M}%Ch)R|Z%2-Iie>tnc$Q>f z0)8D0rj%<&2tGqGqFvu(Kg4e`wGIiRgLK81k|QbfgKn1mB(dB5Y%C*_zQ$%D6QEZ5 z5hp;a(}2dTSpB)NNmOBc?>Q=T3{8cp)Jfivp!9j6`)a{oN0UG0Fr+0Mu|i_ytUYTh zKF<@M32BDTgy{YeHy&Y(Fg2{{Rc6cLc=0MpL=Fk8#Aa;8*xtQu;lPd2smML89EM#}1j}MAKoAA%5iao9uY2Gpv4| z#Vag`D0PL!Itxjkco%m(JrVUbB{G@Jzl_ia_Orr{jw1gSn=YeRE{Nbu%Bgu$o87|y z7yw}sQ5JjTq53Ai_y;6h>H=N2jp`xmAcmKIJd%q={J`}u{1h3dlAf;0Wu JlAZo5{2!<%G^qdp literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/click/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70e234378256fb467fb7b5af2336a28fadf77aac GIT binary patch literal 14119 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 TKGAZUhg(N*&dY9|XdU?<5dAVA literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py b/backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py new file mode 100644 index 0000000..d9d26d2 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_bashcomplete.py @@ -0,0 +1,83 @@ +import os +import re +from .utils import echo +from .parser import split_arg_string +from .core import MultiCommand, Option + + +COMPLETION_SCRIPT = ''' +%(complete_func)s() { + COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + %(autocomplete_var)s=complete $1 ) ) + return 0 +} + +complete -F %(complete_func)s -o default %(script_names)s +''' + +_invalid_ident_char_re = re.compile(r'[^a-zA-Z0-9_]') + + +def get_completion_script(prog_name, complete_var): + cf_name = _invalid_ident_char_re.sub('', prog_name.replace('-', '_')) + return (COMPLETION_SCRIPT % { + 'complete_func': '_%s_completion' % cf_name, + 'script_names': prog_name, + 'autocomplete_var': complete_var, + }).strip() + ';' + + +def resolve_ctx(cli, prog_name, args): + ctx = cli.make_context(prog_name, args, resilient_parsing=True) + while ctx.protected_args + ctx.args and isinstance(ctx.command, MultiCommand): + a = ctx.protected_args + ctx.args + cmd = ctx.command.get_command(ctx, a[0]) + if cmd is None: + return None + ctx = cmd.make_context(a[0], a[1:], parent=ctx, resilient_parsing=True) + return ctx + + +def get_choices(cli, prog_name, args, incomplete): + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return + + choices = [] + if incomplete and not incomplete[:1].isalnum(): + for param in ctx.command.params: + if not isinstance(param, Option): + continue + choices.extend(param.opts) + choices.extend(param.secondary_opts) + elif isinstance(ctx.command, MultiCommand): + choices.extend(ctx.command.list_commands(ctx)) + + for item in choices: + if item.startswith(incomplete): + yield item + + +def do_complete(cli, prog_name): + 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) + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if complete_instr == 'source': + echo(get_completion_script(prog_name, complete_var)) + return True + elif complete_instr == 'complete': + return do_complete(cli, prog_name) + return False diff --git a/backend/venv/lib/python3.7/site-packages/click/_compat.py b/backend/venv/lib/python3.7/site-packages/click/_compat.py new file mode 100644 index 0000000..2b43412 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_compat.py @@ -0,0 +1,648 @@ +import re +import io +import os +import sys +import codecs +from weakref import WeakKeyDictionary + + +PY2 = sys.version_info[0] == 2 +WIN = sys.platform.startswith('win') +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile('\033\[((?:\d|;)*)([a-zA-Z])') + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream(stream, encoding, errors): + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = 'replace' + return _NonClosingTextIOWrapper(stream, encoding, errors, + line_buffering=True) + + +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, **extra): + self._stream = stream = _FixupStream(stream) + 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. + """ + + def __init__(self, stream): + self._stream = stream + + 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): + 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): + 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) + 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. + try: + import msvcrt + except ImportError: + set_binary_mode = lambda x: x + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + 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(): + return set_binary_mode(sys.stdout) + + def get_binary_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) + + 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 _make_text_stream(sys.stdout, encoding, errors) + + 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 _make_text_stream(sys.stderr, encoding, errors) + + 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,) + 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): + 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) + + def _force_correct_text_writer(text_writer, encoding, errors): + 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) + + 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) + + 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) + + 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) + + 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 'w' in mode: + 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, 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 + + 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 + + +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: + 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/backend/venv/lib/python3.7/site-packages/click/_termui_impl.py b/backend/venv/lib/python3.7/site-packages/click/_termui_impl.py new file mode 100644 index 0000000..7cfd3d5 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_termui_impl.py @@ -0,0 +1,547 @@ +""" + 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: (c) 2014 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" +import os +import sys +import time +import math +from ._compat import _default_text_stdout, range_type, PY2, isatty, \ + open_stream, strip_ansi, term_len, get_best_encoding, WIN +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, long)) 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 + + 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 + + def render_finish(self): + if self.is_hidden: + 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 = self.eta + 1 + 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_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + 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) + if show_percent is None: + show_percent = not self.show_pos + else: + if 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) + + 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': bar, + 'info': self.info_sep.join(info_bits) + }).rstrip() + + def render_progress(self): + from .termui import get_terminal_size + nl = False + + if self.is_hidden: + buf = [self.label] + nl = True + else: + 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: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=nl) + 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 = self.avg[-6:] + [-(self.start - time.time()) / (self.pos)] + + 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 next(self): + if self.is_hidden: + return next(self.iter) + try: + rv = next(self.iter) + self.current_item = rv + except StopIteration: + self.finish() + self.render_progress() + raise StopIteration() + else: + self.update(1) + return rv + + if not PY2: + __next__ = next + del next + + +def pager(text, 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, text, color) + pager_cmd = (os.environ.get('PAGER', None) or '').strip() + if pager_cmd: + if WIN: + return _tempfilepager(text, pager_cmd, color) + return _pipepager(text, pager_cmd, color) + if os.environ.get('TERM') in ('dumb', 'emacs'): + return _nullpager(stdout, text, color) + if WIN or sys.platform.startswith('os2'): + return _tempfilepager(text, 'more <', color) + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return _pipepager(text, '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(text, 'more', color) + return _nullpager(stdout, text, color) + finally: + os.unlink(filename) + + +def _pipepager(text, 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 + + if not color: + text = strip_ansi(text) + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + env=env) + encoding = get_best_encoding(c.stdin) + try: + c.stdin.write(text.encode(encoding, 'replace')) + c.stdin.close() + except (IOError, KeyboardInterrupt): + pass + + # 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(text, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + filename = tempfile.mktemp() + 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, text, color): + """Simply print unformatted text. This is the ultimate fallback.""" + 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) + + 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 == '\x03': + raise KeyboardInterrupt() + if ch == '\x04': + raise EOFError() + + +if WIN: + import msvcrt + + def getchar(echo): + rv = msvcrt.getch() + if echo: + msvcrt.putchar(rv) + _translate_ch_to_exc(rv) + if PY2: + enc = getattr(sys.stdin, 'encoding', None) + if enc is not None: + rv = rv.decode(enc, 'replace') + else: + rv = rv.decode('cp1252', 'replace') + return rv +else: + import tty + import termios + + def getchar(echo): + 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) + ch = os.read(fd, 32) + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + if f is not None: + f.close() + except termios.error: + pass + _translate_ch_to_exc(ch) + return ch.decode(get_best_encoding(sys.stdin), 'replace') diff --git a/backend/venv/lib/python3.7/site-packages/click/_textwrap.py b/backend/venv/lib/python3.7/site-packages/click/_textwrap.py new file mode 100644 index 0000000..7e77603 --- /dev/null +++ b/backend/venv/lib/python3.7/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/backend/venv/lib/python3.7/site-packages/click/_unicodefun.py b/backend/venv/lib/python3.7/site-packages/click/_unicodefun.py new file mode 100644 index 0000000..9e17a38 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_unicodefun.py @@ -0,0 +1,118 @@ +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__ + 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 ' + 'http://click.pocoo.org/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 + rv = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate()[0] + 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 where\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 http://click.pocoo.org/python3/' + 'for mitigation steps.' + extra) diff --git a/backend/venv/lib/python3.7/site-packages/click/_winconsole.py b/backend/venv/lib/python3.7/site-packages/click/_winconsole.py new file mode 100644 index 0000000..9aed942 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/_winconsole.py @@ -0,0 +1,273 @@ +# -*- 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 click._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, + ) + + +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( + _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( + _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') + 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/backend/venv/lib/python3.7/site-packages/click/core.py b/backend/venv/lib/python3.7/site-packages/click/core.py new file mode 100644 index 0000000..7456451 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/core.py @@ -0,0 +1,1744 @@ +import errno +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 make_str, make_default_short_help, echo, get_os_args +from .exceptions import ClickException, UsageError, BadParameter, Abort, \ + MissingParameter +from .termui import prompt, confirm +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 +from ._unicodefun import _check_for_unicode_literals, _verify_python3_env + + +_missing = object() + + +SUBCOMMAND_METAVAR = 'COMMAND [ARGS]...' +SUBCOMMANDS_METAVAR = 'COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...' + + +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): + sys.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"). This restriction was supposed to ' + 'be lifted in 6.0 but the fix was flawed. This ' + 'will be fixed in Click 7.0' % ( + 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. 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. + 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: + self.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 utiltiies 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.""" + sys.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 of 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 + 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.exit(1) + else: + raise + 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. + """ + + 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): + 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 [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + if short_help is None and help: + short_help = make_default_short_help(help) + self.short_help = short_help + self.add_help_option = add_help_option + + 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) + parser.allow_interspersed_args = ctx.allow_interspersed_args + parser.ignore_unknown_options = ctx.ignore_unknown_options + 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 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(): + formatter.write_text(self.help) + + 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. + """ + 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. + """ + rows = [] + 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 + + help = cmd.short_help or '' + 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: + 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): + """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): + 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 + + @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 = ctx.lookup_default(self.name) + if value is None: + value = self.value_from_envvar(ctx) + 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: + 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 [] + + +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. + :param prompt: if set to `True` or a non empty string then the user will + be prompted for input if not set. 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_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, **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 + + # 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 + + # 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])) + name = possible_names[-1][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): + 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.default is not None and self.show_default: + extra.append('default: %s' % ( + ', '.join('%s' % d for d in self.default) + if isinstance(self.default, (list, tuple)) + else self.default, )) + 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, + hide_input=self.hide_input, + 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.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() + elif len(decls) == 2: + name, arg = decls + else: + raise TypeError('Arguments take exactly one or two ' + 'parameter declarations, got %d' % len(decls)) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [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/backend/venv/lib/python3.7/site-packages/click/decorators.py b/backend/venv/lib/python3.7/site-packages/click/decorators.py new file mode 100644 index 0000000..9893452 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/decorators.py @@ -0,0 +1,304 @@ +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[1:], **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(), + callback=f, params=params, **attrs) + + +def command(name=None, cls=None, **attrs): + """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. + :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): + if 'help' in attrs: + attrs['help'] = inspect.cleandoc(attrs['help']) + OptionClass = attrs.pop('cls', Option) + _param_memo(f, OptionClass(param_decls, **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: + module = sys._getframe(1).f_globals.get('__name__') + 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/backend/venv/lib/python3.7/site-packages/click/exceptions.py b/backend/venv/lib/python3.7/site-packages/click/exceptions.py new file mode 100644 index 0000000..74a4542 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/exceptions.py @@ -0,0 +1,201 @@ +from ._compat import PY2, filename_to_ui, get_text_stderr +from .utils import echo + + +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): + if PY2: + if message is not None: + message = message.encode('utf-8') + Exception.__init__(self, message) + self.message = message + + def format_message(self): + return self.message + + 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 + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + if self.ctx is not None: + color = self.ctx.color + echo(self.ctx.get_usage() + '\n', 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.opts or [self.param.human_readable_name] + else: + return 'Invalid value: %s' % self.message + if isinstance(param_hint, (tuple, list)): + param_hint = ' / '.join('"%s"' % x for x in 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.opts or [self.param.human_readable_name] + else: + param_hint = None + if isinstance(param_hint, (tuple, list)): + param_hint = ' / '.join('"%s"' % x for x in 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 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +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.""" diff --git a/backend/venv/lib/python3.7/site-packages/click/formatting.py b/backend/venv/lib/python3.7/site-packages/click/formatting.py new file mode 100644 index 0000000..a3d6a4d --- /dev/null +++ b/backend/venv/lib/python3.7/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/backend/venv/lib/python3.7/site-packages/click/globals.py b/backend/venv/lib/python3.7/site-packages/click/globals.py new file mode 100644 index 0000000..14338e6 --- /dev/null +++ b/backend/venv/lib/python3.7/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 it's 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/backend/venv/lib/python3.7/site-packages/click/parser.py b/backend/venv/lib/python3.7/site-packages/click/parser.py new file mode 100644 index 0000000..9775c9f --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/parser.py @@ -0,0 +1,426 @@ +# -*- 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('%s option requires an argument' % opt) + raise BadOptionUsage('%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) + + 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('%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) + 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/backend/venv/lib/python3.7/site-packages/click/termui.py b/backend/venv/lib/python3.7/site-packages/click/termui.py new file mode 100644 index 0000000..d9fba52 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/termui.py @@ -0,0 +1,539 @@ +import os +import sys +import struct + +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 +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', 'red', 'green', 'yellow', 'blue', 'magenta', + 'cyan', 'white', 'reset') +_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): + prompt = text + 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): + """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:: 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. + """ + 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) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + # If a default is set and used, then the confirmation + # prompt is always skipped because that's the only thing + # that really makes sense. + elif default is not None: + 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 + + if get_winterm_size is not None: + return get_winterm_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, 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: 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 not isinstance(text, string_types): + text = text_type(text) + from ._termui_impl import pager + return pager(text + '\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) + * ``reset`` (reset the color code only) + + .. versionadded:: 2.0 + + :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.index(fg) + 30)) + except ValueError: + raise TypeError('Unknown color %r' % fg) + if bg: + try: + bits.append('\033[%dm' % (_ansi_colors.index(bg) + 40)) + except ValueError: + 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(text, 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 + """ + return echo(style(text, **styles), 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('http://click.pocoo.org/') + 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. + + .. 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 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/backend/venv/lib/python3.7/site-packages/click/testing.py b/backend/venv/lib/python3.7/site-packages/click/testing.py new file mode 100644 index 0000000..4416c77 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/testing.py @@ -0,0 +1,322 @@ +import os +import sys +import shutil +import tempfile +import contextlib + +from ._compat import iteritems, 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. +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, output_bytes, exit_code, exception, + exc_info=None): + #: The runner that created the result + self.runner = runner + #: The output as bytes. + self.output_bytes = output_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happend if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The output as unicode string.""" + return self.output_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + def __repr__(self): + return '' % ( + 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. + """ + + def __init__(self, charset=None, env=None, echo_stdin=False): + if charset is None: + charset = 'utf-8' + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + + 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: + sys.stdout = sys.stderr = bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = sys.stderr = io.TextIOWrapper( + bytes_output, encoding=self.charset) + + 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 + 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, **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 + :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 out: + exception = None + exit_code = 0 + + try: + cli.main(args=args or (), + prog_name=self.get_default_prog_name(cli), **extra) + except SystemExit as e: + if e.code != 0: + exception = e + + exc_info = sys.exc_info() + + exit_code = e.code + 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() + output = out.getvalue() + + return Result(runner=self, + output_bytes=output, + 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/backend/venv/lib/python3.7/site-packages/click/types.py b/backend/venv/lib/python3.7/site-packages/click/types.py new file mode 100644 index 0000000..3639002 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/types.py @@ -0,0 +1,550 @@ +import os +import stat + +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. + + See :ref:`choice-opts` for an example. + """ + name = 'choice' + + def __init__(self, choices): + self.choices = choices + + def get_metavar(self, param): + return '[%s]' % '|'.join(self.choices) + + def get_missing_message(self, param): + return 'Choose from %s.' % ', '.join(self.choices) + + def convert(self, value, param, ctx): + # Exact match + if value in self.choices: + return value + + # Match through normalization + if ctx is not None and \ + ctx.token_normalize_func is not None: + value = ctx.token_normalize_func(value) + for choice in self.choices: + if ctx.token_normalize_func(choice) == value: + return choice + + self.fail('invalid choice: %s. (choose from %s)' % + (value, ', '.join(self.choices)), param, ctx) + + def __repr__(self): + return 'Choice(%r)' % list(self.choices) + + +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 BoolParamType(ParamType): + name = 'boolean' + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ('true', '1', 'yes', 'y'): + return True + elif value in ('false', '0', 'no', 'n'): + return False + self.fail('%s is not a valid boolean' % value, param, ctx) + + def __repr__(self): + return 'BOOL' + + +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 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. + + 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. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param 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' + if 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/backend/venv/lib/python3.7/site-packages/click/utils.py b/backend/venv/lib/python3.7/site-packages/click/utils.py new file mode 100644 index 0000000..eee626d --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/click/utils.py @@ -0,0 +1,415 @@ +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): + 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 as 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: http://pypi.python.org/pypi/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)) diff --git a/backend/venv/lib/python3.7/site-packages/easy_install.py b/backend/venv/lib/python3.7/site-packages/easy_install.py new file mode 100644 index 0000000..d87e984 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/backend/venv/lib/python3.7/site-packages/flask/__init__.py b/backend/venv/lib/python3.7/site-packages/flask/__init__.py new file mode 100644 index 0000000..59f0fff --- /dev/null +++ b/backend/venv/lib/python3.7/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.3' + +# 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/backend/venv/lib/python3.7/site-packages/flask/__main__.py b/backend/venv/lib/python3.7/site-packages/flask/__main__.py new file mode 100644 index 0000000..4aee654 --- /dev/null +++ b/backend/venv/lib/python3.7/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/backend/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..13de640bb033f1cbbca1296bf010be8346f5bf27 GIT binary patch literal 1850 zcmZ8h+inv_7+xROu^lIla{>Yx&KMFOLPA1HD+;9&Qj02rRB5DYwB8-tYtQU%XU0y# zMeqA4yg(nIk1?0@idX1W|9@i#=t%zjpY}h`yjWZ;J8=H`c;&Z0i;nXTGV_xK;yL{E z!;Iqu4t0VI%>>yXC$cg}a~TKdyvWM}Eu?fo6s1dDS)wK2i-9W^WSN#_g;r#hR#RC? zEXo?KrSyVWlFM{i)@fa?&=uLB4Y^8JvUai&<(jsH&ffPxFWC8tMVGXCb#I8 zyiTvn8}x?UrrW8$B8a?6Z^~Qrmb^`G%RBT=DzA#W@*cgH(u?B0d_W(_CT*sCO+1v3 z=p(s9cjPYJl`YzmZQ7O{+L2w_m3wqgKBkZ5KHZlG^dS9aNj#B<^f2S_!_g5vf-0BA zQ+Z6k0d1W=3sz2?W@GXZx>hD|`oh!Wl==ftIVHa*GW1p4SDxgju^N+}r+Gl)i2Tac z_&uKtT7zA+IoV%0^GkZbX%R)<4;hm)6Cd{*Nc?_qNI2bD(;(R))s&E)OeEE zBGus1Q>E=q6AnVJO# z=U$()Q5;6#+$d-XI}Oc{`7!kT%ruL(;!l)<2{127Y-V6xHOt=B5G#x$y8`agf|zg4 zm^Pk2wly^W%s2D4G4%9j!wdIz35BWUOt9khVT{ZS!%Jhkg|lSyG%jP!GR)Y87h=K_ z6-LYveD0kLfNb(Cs{R>4hNgaPBijxG> znN4^;al78*uq-&zuj+=C%8zs$!GGg~L-Y8{I39=mhpU;k!%S zAr}e6Qx()#5f%|@2uldd2z7)Nga&|h2O{plxYR0&))3YaHV`%ut^n8^ETOuJ>@|cf zgzEsb+?%h7RyR_?Y}hawwT)&3rS5Di)J+uKLb#1^2jMQlJ%sxR4-lFN4-p;#SV!%^ zA9b<$VgKBgX4gckT~xcX0ni#6d|tf|j(UPV5dP(DSm!BR-1gK{ZFult6?I#xc5lSk zkv@nHr@_9@lIdQ@^p6H3CA$5Cr%&7O+DVw~h7qi)5W5pO?0Vg>(@vkAHa-#KHe;~0 uhOt%xsXdc%FcJJaoP#C+`D{L4%~UhX*;T-u9La8Gfy?c?)qF8m&HM+@8abZA+Z4D{_eWhAN2AobZmeKNV!zjudXT^t>4ZGRL84gCVg1Pqit@Pj>TL-zg}FG z85429ST+!G4KDKnB~9knD>7xb<>3ctV&sCSKo{K5FjfMLrP|Q(l(CLIj!qWhC}7E= z-Au#I)6}R|czk+FhcuB%Lq;}rFKW#7q{UmZNpCYlX>KdsNcEHDs&cm0cAkBuExAxE IRPYY|1t?O9EdT%j literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/_compat.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea62020b292a2dda3352a39350751c99435004f9 GIT binary patch literal 3330 zcmbVO-EteZ6$X~eU;SCOELpbGz)6#atxZa9J+U>8C$*}0JZTu!QX6}x9n5k8QY$TY zw*VxI8nqXeXOg@25v-Zq7`oo3ga{H4L4}vlfJ(aU3A#u`X~zpn!WZS|B=BWPKa=I4 zBFjA*RAmilT~yp!LsZ>3A!=@%1f+U0HJA=&D55r!bA#Dn*706)esCd}1OAGb5R=bo za8dffeEMg(fY@@O=OMbh1Y=!Hjqs;O_%mbtbAUfH#$P;ze>s?wSH$cQg)`2J3!wYF zm=hOayej5{x8%N&bGiHJoT88%UN9Z?^N{uUYZexEm+288W?_=b19B8)_+7ma>p( zqvAY=naG}|ZvUQCI)=5Z$8@~UbjF@aSWSOn*jBhFnaP-txlB(0av8ba zrd8;(5@q>N#r-X_!v6gYyScQy#JWRfwj^5*lSCTLj0^`Yw{azjBbjQs!tQVU?mE*_ zvfn>kUF&SDv0kRwAXA`=G+~_RR^wX?&Ca(T&#sWzbfjorc4a=08XwLd}Mw4I0ABM-Imp{?Cb!a-Mr_hwNc=tNb3oY5C`a{5jJ zV?g5<^q3q`r+3q{er%+&{*D}Kyn}do2UR}7TLi|T{{&!Fg-y1y7bd$BkQFBQ>##5X z-`Hi)eDGt?S5BbeV$*$Tdb>#ys=kJp0!eKHf-~(u{5(PnVZ(83t*bCOq}$}s+o`L$ zL;8XqddKt`J%la_uY>ibI5#ScWH*dR3lcln`(qPV*?9AHh%{cGO2;L=} z;!E=!Ip~lTrOufx7!Vt%(X`uwmVW_Tjxm9}&Ov$C^lsdSNSNS!H;toANQi@qOp$}I z$0G5H*IkO zYc7>u!i)_v7DZ@VY&c@atkGEIzJe_MiX4`X5Q=u3jheo~dSLxD97x+RTe0T&QfZeo zVBNBtSs(EWt782_qo?vI=c@>g8AIqn^NqT-M!Pyq-`0SKGa)P*oDVXwn;<{Q`CoU# zq*zf{017od^)~YCMBu8ht&eYg9~PV*HLBhN-p)W3gm*VoL+%Vdg0a3C=F$N-O9h+* z#y#IZ$z8RmUgMKK!jqhh%kw4m0n9$Jv-vO|^3h|=R$bCZHNh3lL{+DJ%=KjEPx?@S{wIAF9iJ_469 z{vP0eu>criAd`7ey-Z8xFuCRL@TbKJ0SW|`yN_cfE)S)rTmh@07ETv6P{R#%_ zV`+L-DR8&kj}7OK@f>GA+VBphPPB4son~3R1MBKtBtJ)T9mz5hRPq$TtEyiD`6F}( zSfe%1Nj4$6o9|+biY$V{fThz;o_3Edtv|VG>pT`<4){ugOTbO)M(!Jq0b(bMg5xII zmg3adDIl^BX2m~fHHYV4M1n@MRrol87t|=sG_`;tFV55yGBZ&I-&~P_FFf4}yOAvc z2~JBn2;B4Lijb|2YNqv*EbZHRv@v>=?Zhc4>&tx^xeyE%?mznc)3pv?f3p6BuWmm6 z?7<_x_W0qZ!pF!~vhFtOhUT)pEk*XsX>UlJg#3Os@m+ zy_z>oYbBrhv_dN$*c~iCN#W-;$`z2~{G}9luU4te`|yu*RgZeGJ_kEt2HZLN9Z5s! AE&u=k literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/app.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/app.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..837bb258c4a56cf9fe0fce63e24b1e2ab9f95de5 GIT binary patch literal 71414 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/blueprints.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/blueprints.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34f7888ff981a272e61ec1893bca936979c52285 GIT binary patch literal 20472 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/cli.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29cf9e74593d286b6cec1680e3c00c024e3f5b2a GIT binary patch literal 25067 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ec9a53f942a636bd4b55541cdb92f13273df3c1 GIT binary patch literal 10210 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 bcCc5iWjNb%u~b;TYrklJ(RS?0@>l-{J!+~Z literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/debughelpers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6fa1a4190cc07c2fe80d049fe93548b25ca4583b GIT binary patch literal 6625 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 W!x-`BuJ|y@bIZ>MXM)qg<^Ka#sub1$ literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/globals.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/globals.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9062852bbf9f8c7160cb44255686298a77e9d988 GIT binary patch literal 1777 zcmb_dQE%He5SC;)ww1(5yJEnGJ#c%PfmL>j7HflH7@B6-fFcN%00RUJ0xh0x#+0a% zloJ=(9-94`{(=2~{S2W`+tdESo_3^_#KHQu(dLPFIv>CL?npo1-i|yRzy0yiPp>vS z?@y~-j}RB%;M8wWFfZ|#&jR7+K@#|O-4d-lOv1dKv{4U}4c1ONY=d=v^^z{@vK~Hr zEMlAZj3B)7l1(SKpbgQLpKRkZfG*p*3Q+4e+P2enoYrG~r|q(x6K}9vy+a@o!7&k3 z&*Q0(V=A<>{IWhGXLUVtW42x4YHR_;WO&mc1zP1F#ofRsvJaP%|Mxn-47P#712 zW`-|-WU?@DVd7QX{Y;ii#iui~Pkw((9*y=!WW030J;uGj#s-?lF2cUx85A1!$@7yJ zUl0vIUVeXYcyw||CQ^}HA^--4a-rksFU-#y_;shG%5W+MK^?u685JjnX7gr!jBuB) z-~A}noEK9fE2B9BA}2(_s|vJPgL^vT2xeJwj3JgJ2U;|VFJ(ojF_4!Am`%OXKqggz z3Cn^CZfrtGPyxVzMYJFd7vG(p9$)Vi6LKI6T?yl|XELjDq>kDc1iuE+Sd5ry#0!-9 z>J=R$YBH1Oc4NAb91&QgSc$QKJf@%ep7)*vX;~tjs~ER6`QMU6FdPf5CNu+b&dtna z)${{d-+a|W=uNcD(U&e`aw<^~3y5qgw$g@FC9%Z)8}%wWzKC(AO)8%ckk1or5Ny`y zE|)j0vc_VZAxUloC|fuWaB70WcxV34{-w{nc~^aC0@J$k-}olH^e?@u0FRP?G-%iN z)23n4%v_|}wOGr@vflckDh$uzP${YE2Y1{+sWjKqx--S5HAZ2Jh6T+*;qBqQ_0%Rl z{$|5c@dY(7Tu?QfNWnnqVXlVbvow9GpA=s%*yAiM7mr3}@^pHp#NOn|vuDH8Vadyf zyg)2MJgoBB9^K=k;kWj*58as`HfKIAmxy0TIj>5KFI`pSGu&NwQF#7_-^GvG#`S+C zs-L$m#Id5b>@RLW+mI{J1GL`-y^EF%ryI7) zw!*HupWwn(*So|kdA+)q-dWgGR`t>A7Ny!jHEH371OL64dMRF%%%(Cz&%03Wp{4FL zjZ$|sXpM)v_NPaKdvzyGu}{;q?zx*oN}-j7n)J^>&0j+`jfK6wl zqim+i?xEUNSm4QKbK)!@b>Eslu;PIgw`{tVqqO@~E?FhuYirUUqX>g7f43KQ!&bM0 NpYDe1hQ8nT{{e-%^N;`l literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/helpers.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/helpers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2269b9b01e7dcc6900d0bfbc7b9ad4340184c94 GIT binary patch literal 33264 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%0AEUXK)Yd@qdXW3YCf) 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�#oqLzzZpJL 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 AS^xk5 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/templating.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/templating.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e618ff904408e44e9e7355decac102423f66bd0c GIT binary patch literal 4987 zcmd5=O>+~;8J;gmWBC)-5Fk``Af!NB#s+F(Sr@g%_lCrAs6YjFimmZj-I7Nh&B)y& zV_c&g!k$t|j;S2+ac?>02jrYzFvsMye<7zlZ}(^{yI_+;4jEUs`n&sm-{<}E{n^>3 zf$y*XIQ#XDj|}6V)ER#c8h24-j*1z+!AxewX5aFyzU@2xnqM;wW-}+Q_Zxnr@A|Il z*W#&u({J{t{b}^;tnrQE&wObxmrZ?Ruqp1mwS61?CYwfonp^14vKcmub#rWv&Et2T zEwB^#U0^4l8Lf|of58))9==W-%I)Qh_Xly9MM+l;{^r=%RHIL@hWB}rNiW;t-lm9H zmwQ?2{VYm);f-azYPFpX-iWBXm92Vz`_{X0?fNxu^Nrf^G>l_TyLs4OR!6SJQJW`{ zuX^{NJzVl6=ib_r2andDJ@PuK@cOCX9^+XU#d5j%9o}rT?4o%;lzc4>85hO$qhvP{ zX+qB`7M^P|_PKOEm&ZHeyaWW8mXUJt1w6ncHW?_4~m~CEUuSeHb9upK-6d+eh$^ppb!JFda zfN73Y5>SGxxB*Qw7KEwNDUqR2C-xZ#`3@GWNgHiI;v zA`Wv%3W8+2|MwTE*p^-#ZF4X51n&;xP?Ui8_#yVZ&0*$kh0>F0A1fJ)GRPo|l}NUe z^mWWhS<;TTmA>{ArI)3*84o#Fm}K5-b&X7+Ct>DAnb!^zNShCUMA98~P7>m59HF$Y z+6n~}yaTu3maY~sE*4Q;L6I&h15%wa=gj@ZiDQ??r>?hZ z1+E}A;fiJu^iwvBsXY?}JHs$8XBt7k(smH2vnTE&Pz!Y_G3O$RB%AFzj-}AhMyL8J z7~RFt`(eatfK#os*mZ5M{f4&FzFS)8DK-b5&KIX2Msg5l?JZzl8B}fI_FvueG&?mk z;xq*w$v93(I#G}SOJPo7#nVLTK9ozr<|tfBH9dw1qK3)?6iGHf$s1k@Z!_0hrjk+1 z5~nex+7oQ6#Plg`rc(@a|KsfkFSwqnA(D?mbx#o^I$>B~YvzD#ME2by(x^TyAK1OiSJUsL>yjqeSH2}^TbN|8zXg}OhQ9p%E zR221pMx$$tpk*Ux?-l5UCLWj%jjz{VS)i`Xhi z%mw)o7&U)}@y%g(i^l^v4e?`|Cp*xZ(irn--~y_`9iQsknbQ+Gm|@Gi9G|%m4t3-3B8{A%GjBCiSptor=f4QAWb;r8r+f6JdZ|+E8;R$ ziU-Fi{}>ZbQ6%|q!_-vI5iBqN7j%*yRBnRgWuvrFa1v2WD~{3R5f`_ zDHYdV(rXDAAqSG-{4v7-Q;-L(AV{i5WU45QWT=u0s8r7)Pe{kl0 z9^YUTiOo;A~>UH0HntBi9C^Iij zxX1VKNO&k57RPuGB4(Z8sgqVUWhJ?q7GyLLT~9bbL@u||Va#Y}xQlF5JuFgT*L&Ym z9yJcu$IQ?{SF52@tyzdv8^9lE<*w8^DEBKo6jRzfA}aAuQwRZ`BWyu?rxrnrrf{}C1+{|788$W_Qf4n?7wCo`l* z`X3TU!8uNcm%Zm>SR9ILEa7mNrChed0cS@6tWVccE^lh5tV*oLeEcwQ|F5tkZbD27 zC*l@b{xm5#{>4G8LxNS;6e=7Dic^o{;Pf#Zlv{s?r5X-XB^*{UvfetO47*=fkh~!% z*jK5MpcGsOcnzHjO7))wg>=86?Wj~XQrS+GmMe>{-%el?bj8H`Dz8wucXTHAMH4Gj WqK|M6Hgmyt=ND!d?z>a&!oL9)YU+Lf literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/testing.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/testing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc63f692bce97c93a876c88ae4b9d39f25cf1ee7 GIT binary patch literal 7860 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 literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc b/backend/venv/lib/python3.7/site-packages/flask/__pycache__/wrappers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3abb0e74edeab22d51408d34b286bf9da5f10e04 GIT binary patch literal 6794 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 CM@~`z literal 0 HcmV?d00001 diff --git a/backend/venv/lib/python3.7/site-packages/flask/_compat.py b/backend/venv/lib/python3.7/site-packages/flask/_compat.py new file mode 100644 index 0000000..dfbaae9 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/_compat.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +""" + flask._compat + ~~~~~~~~~~~~~ + + Some py2/py3 compatibility support based on a stripped down + version of six so we don't have to depend on a specific version + of it. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import sys + +PY2 = sys.version_info[0] == 2 +_identity = lambda x: x + + +if not PY2: + text_type = str + string_types = (str,) + integer_types = (int,) + + iterkeys = lambda d: iter(d.keys()) + itervalues = lambda d: iter(d.values()) + iteritems = lambda d: iter(d.items()) + + from inspect import getfullargspec as getargspec + from io import StringIO + import collections.abc as collections_abc + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + implements_to_string = _identity + +else: + text_type = unicode + string_types = (str, unicode) + integer_types = (int, long) + + iterkeys = lambda d: d.iterkeys() + itervalues = lambda d: d.itervalues() + iteritems = lambda d: d.iteritems() + + from inspect import getargspec + from cStringIO import StringIO + import collections as collections_abc + + exec('def reraise(tp, value, tb=None):\n raise tp, value, tb') + + def implements_to_string(cls): + cls.__unicode__ = cls.__str__ + cls.__str__ = lambda x: x.__unicode__().encode('utf-8') + return cls + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a + # dummy metaclass for one level of class instantiation that replaces + # itself with the actual metaclass. + class metaclass(type): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +# Certain versions of pypy have a bug where clearing the exception stack +# breaks the __exit__ function in a very peculiar way. The second level of +# exception blocks is necessary because pypy seems to forget to check if an +# exception happened until the next bytecode instruction? +# +# Relevant PyPy bugfix commit: +# https://bitbucket.org/pypy/pypy/commits/77ecf91c635a287e88e60d8ddb0f4e9df4003301 +# According to ronan on #pypy IRC, it is released in PyPy2 2.3 and later +# versions. +# +# Ubuntu 14.04 has PyPy 2.2.1, which does exhibit this bug. +BROKEN_PYPY_CTXMGR_EXIT = False +if hasattr(sys, 'pypy_version_info'): + class _Mgr(object): + def __enter__(self): + return self + def __exit__(self, *args): + if hasattr(sys, 'exc_clear'): + # Python 3 (PyPy3) doesn't have exc_clear + sys.exc_clear() + try: + try: + with _Mgr(): + raise AssertionError() + except: + raise + except TypeError: + BROKEN_PYPY_CTXMGR_EXIT = True + except AssertionError: + pass diff --git a/backend/venv/lib/python3.7/site-packages/flask/app.py b/backend/venv/lib/python3.7/site-packages/flask/app.py new file mode 100644 index 0000000..c570a95 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/app.py @@ -0,0 +1,2334 @@ +# -*- coding: utf-8 -*- +""" + flask.app + ~~~~~~~~~ + + This module implements the central WSGI application object. + + :copyright: © 2010 by the Pallets team. + :license: BSD, see LICENSE for more details. +""" + +import os +import sys +import warnings +from datetime import timedelta +from functools import update_wrapper +from itertools import chain +from threading import Lock + +from werkzeug.datastructures import Headers, ImmutableDict +from werkzeug.exceptions import BadRequest, BadRequestKeyError, HTTPException, \ + InternalServerError, MethodNotAllowed, default_exceptions +from werkzeug.routing import BuildError, Map, RequestRedirect, \ + RoutingException, Rule + +from . import cli, json +from ._compat import integer_types, reraise, string_types, text_type +from .config import Config, ConfigAttribute +from .ctx import AppContext, RequestContext, _AppCtxGlobals +from .globals import _request_ctx_stack, g, request, session +from .helpers import ( + _PackageBoundObject, + _endpoint_from_view_func, find_package, get_env, get_debug_flag, + get_flashed_messages, locked_cached_property, url_for, get_load_dotenv +) +from .logging import create_logger +from .sessions import SecureCookieSessionInterface +from .signals import appcontext_tearing_down, got_request_exception, \ + request_finished, request_started, request_tearing_down +from .templating import DispatchingJinjaLoader, Environment, \ + _default_template_ctx_processor +from .wrappers import Request, Response + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +def _make_timedelta(value): + if not isinstance(value, timedelta): + return timedelta(seconds=value) + return value + + +def setupmethod(f): + """Wraps a method so that it performs a check in debug mode if the + first request was already handled. + """ + def wrapper_func(self, *args, **kwargs): + if self.debug and self._got_first_request: + raise AssertionError('A setup function was called after the ' + 'first request was handled. This usually indicates a bug ' + 'in the application where a module was not imported ' + 'and decorators or other functionality was called too late.\n' + 'To fix this make sure to import all your view modules, ' + 'database models and everything related at a central place ' + 'before the application starts serving requests.') + return f(self, *args, **kwargs) + return update_wrapper(wrapper_func, f) + + +class Flask(_PackageBoundObject): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: the folder with static files that should be served + at `static_url_path`. Defaults to the ``'static'`` + folder in the root path of the application. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: Flask by default will automatically calculate the path + to the root of the application. In certain situations + this cannot be achieved (for instance if the package + is a Python 3 namespace package) and needs to be + manually defined. + """ + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class = Response + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute('TESTING') + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute('SECRET_KEY') + + #: The secure cookie uses this for the name of the session cookie. + #: + #: This attribute can also be configured from the config with the + #: ``SESSION_COOKIE_NAME`` configuration key. Defaults to ``'session'`` + session_cookie_name = ConfigAttribute('SESSION_COOKIE_NAME') + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute('PERMANENT_SESSION_LIFETIME', + get_converter=_make_timedelta) + + #: A :class:`~datetime.timedelta` which is used as default cache_timeout + #: for the :func:`send_file` functions. The default is 12 hours. + #: + #: This attribute can also be configured from the config with the + #: ``SEND_FILE_MAX_AGE_DEFAULT`` configuration key. This configuration + #: variable can also be set with an integer value used as seconds. + #: Defaults to ``timedelta(hours=12)`` + send_file_max_age_default = ConfigAttribute('SEND_FILE_MAX_AGE_DEFAULT', + get_converter=_make_timedelta) + + #: Enable this if you want to use the X-Sendfile feature. Keep in + #: mind that the server has to support this. This only affects files + #: sent with the :func:`send_file` method. + #: + #: .. versionadded:: 0.2 + #: + #: This attribute can also be configured from the config with the + #: ``USE_X_SENDFILE`` configuration key. Defaults to ``False``. + use_x_sendfile = ConfigAttribute('USE_X_SENDFILE') + + #: The JSON encoder class to use. Defaults to :class:`~flask.json.JSONEncoder`. + #: + #: .. versionadded:: 0.10 + json_encoder = json.JSONEncoder + + #: The JSON decoder class to use. Defaults to :class:`~flask.json.JSONDecoder`. + #: + #: .. versionadded:: 0.10 + json_decoder = json.JSONDecoder + + #: Options that are passed directly to the Jinja2 environment. + jinja_options = ImmutableDict( + extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_'] + ) + + #: Default configuration parameters. + default_config = ImmutableDict({ + 'ENV': None, + 'DEBUG': None, + 'TESTING': False, + 'PROPAGATE_EXCEPTIONS': None, + 'PRESERVE_CONTEXT_ON_EXCEPTION': None, + 'SECRET_KEY': None, + 'PERMANENT_SESSION_LIFETIME': timedelta(days=31), + 'USE_X_SENDFILE': False, + 'SERVER_NAME': None, + 'APPLICATION_ROOT': '/', + 'SESSION_COOKIE_NAME': 'session', + 'SESSION_COOKIE_DOMAIN': None, + 'SESSION_COOKIE_PATH': None, + 'SESSION_COOKIE_HTTPONLY': True, + 'SESSION_COOKIE_SECURE': False, + 'SESSION_COOKIE_SAMESITE': None, + 'SESSION_REFRESH_EACH_REQUEST': True, + 'MAX_CONTENT_LENGTH': None, + 'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12), + 'TRAP_BAD_REQUEST_ERRORS': None, + 'TRAP_HTTP_EXCEPTIONS': False, + 'EXPLAIN_TEMPLATE_LOADING': False, + 'PREFERRED_URL_SCHEME': 'http', + 'JSON_AS_ASCII': True, + 'JSON_SORT_KEYS': True, + 'JSONIFY_PRETTYPRINT_REGULAR': False, + 'JSONIFY_MIMETYPE': 'application/json', + 'TEMPLATES_AUTO_RELOAD': None, + 'MAX_COOKIE_SIZE': 4093, + }) + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: the test client that is used with when `test_client` is used. + #: + #: .. versionadded:: 0.7 + test_client_class = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class = None + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface = SecureCookieSessionInterface() + + # 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, + import_name, + static_url_path=None, + static_folder='static', + static_host=None, + host_matching=False, + subdomain_matching=False, + template_folder='templates', + instance_path=None, + instance_relative_config=False, + root_path=None + ): + _PackageBoundObject.__init__( + self, + import_name, + template_folder=template_folder, + root_path=root_path + ) + + if static_url_path is not None: + self.static_url_path = static_url_path + + if static_folder is not None: + self.static_folder = static_folder + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + 'If an instance path is provided it must be absolute.' + ' A relative path was given instead.' + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: A dictionary of all view functions registered. The keys will + #: be function names which are also used to generate URLs and + #: the values are the function objects themselves. + #: To register a view function, use the :meth:`route` decorator. + self.view_functions = {} + + #: A dictionary of all registered error handlers. The key is ``None`` + #: for error handlers active on the application, otherwise the key is + #: the name of the blueprint. Each key points to another dictionary + #: where the key is the status code of the http exception. The + #: special key ``None`` points to a list of tuples where the first item + #: is the class for the instance check and the second the error handler + #: function. + #: + #: To register an error handler, use the :meth:`errorhandler` + #: decorator. + self.error_handler_spec = {} + + #: A list of functions that are called when :meth:`url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function registered here + #: is called with `error`, `endpoint` and `values`. If a function + #: returns ``None`` or raises a :exc:`BuildError` the next function is + #: tried. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers = [] + + #: A dictionary with lists of functions that will be called at the + #: beginning of each request. The key of the dictionary is the name of + #: the blueprint this function is active for, or ``None`` for all + #: requests. To register a function, use the :meth:`before_request` + #: decorator. + self.before_request_funcs = {} + + #: A list of functions that will be called at the beginning of the + #: first request to this instance. To register a function, use the + #: :meth:`before_first_request` decorator. + #: + #: .. versionadded:: 0.8 + self.before_first_request_funcs = [] + + #: A dictionary with lists of functions that should be called after + #: each request. The key of the dictionary is the name of the blueprint + #: this function is active for, ``None`` for all requests. This can for + #: example be used to close database connections. To register a function + #: here, use the :meth:`after_request` decorator. + self.after_request_funcs = {} + + #: A dictionary with lists of functions that are called after + #: each request, even if an exception has occurred. The key of the + #: dictionary is the name of the blueprint this function is active for, + #: ``None`` for all requests. These functions are not allowed to modify + #: the request, and their return values are ignored. If an exception + #: occurred while processing the request, it gets passed to each + #: teardown_request function. To register a function here, use the + #: :meth:`teardown_request` decorator. + #: + #: .. versionadded:: 0.7 + self.teardown_request_funcs = {} + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs = [] + + #: A dictionary with lists of functions that are called before the + #: :attr:`before_request_funcs` functions. The key of the dictionary is + #: the name of the blueprint this function is active for, or ``None`` + #: for all requests. To register a function, use + #: :meth:`url_value_preprocessor`. + #: + #: .. versionadded:: 0.7 + self.url_value_preprocessors = {} + + #: A dictionary with lists of functions that can be used as URL value + #: preprocessors. The key ``None`` here is used for application wide + #: callbacks, otherwise the key is the name of the blueprint. + #: Each of these functions has the chance to modify the dictionary + #: of URL values before they are used as the keyword arguments of the + #: view function. For each function registered this one should also + #: provide a :meth:`url_defaults` function that adds the parameters + #: automatically again that were removed that way. + #: + #: .. versionadded:: 0.7 + self.url_default_functions = {} + + #: A dictionary with list of functions that are called without argument + #: to populate the template context. The key of the dictionary is the + #: name of the blueprint this function is active for, ``None`` for all + #: requests. Each returns a dictionary that the template context is + #: updated with. To register a function here, use the + #: :meth:`context_processor` decorator. + self.template_context_processors = { + None: [_default_template_ctx_processor] + } + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors = [] + + #: all the attached blueprints in a dictionary by name. Blueprints + #: can be attached multiple times so this dictionary does not tell + #: you how often they got attached. + #: + #: .. versionadded:: 0.7 + self.blueprints = {} + self._blueprint_order = [] + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. For backwards compatibility extensions should register + #: themselves like this:: + #: + #: if not hasattr(app, 'extensions'): + #: app.extensions = {} + #: app.extensions['extensionname'] = SomeObject() + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = Map() + + self.url_map.host_matching = host_matching + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + self._before_request_lock = Lock() + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert bool(static_host) == host_matching, 'Invalid static_host/host_matching combination' + self.add_url_rule( + self.static_url_path + '/', + 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. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPExcpetion`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. 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 + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + 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 is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded 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 + 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. + + if isinstance(e, BadRequestKeyError): + if self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"]: + # Werkzeug < 0.15 doesn't add the KeyError to the 400 + # message, add it in manually. + description = e.get_description() + + if e.args[0] not in description: + e.description = "KeyError: '{}'".format(*e.args) + else: + # Werkzeug >= 0.15 does add it, remove it in production + 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/backend/venv/lib/python3.7/site-packages/flask/blueprints.py b/backend/venv/lib/python3.7/site-packages/flask/blueprints.py new file mode 100644 index 0000000..c2158fe --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/blueprints.py @@ -0,0 +1,447 @@ +# -*- 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 .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/backend/venv/lib/python3.7/site-packages/flask/cli.py b/backend/venv/lib/python3.7/site-packages/flask/cli.py new file mode 100644 index 0000000..3eb93b3 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/cli.py @@ -0,0 +1,910 @@ +# -*- 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 platform +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 + import werkzeug + message = ( + 'Python %(python)s\n' + 'Flask %(flask)s\n' + 'Werkzeug %(werkzeug)s' + ) + click.echo(message % { + 'python': platform.python_version(), + 'flask': __version__, + 'werkzeug': werkzeug.__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): + """Helper 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, + set_debug_flag=True): + #: 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.set_debug_flag = set_debug_flag + 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 = (re.split(r':(?![\\/])', self.app_import_path, 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.' + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + 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. + :param set_debug_flag: Set the app's debug flag based on the active + environment + + .. 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, + set_debug_flag=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 + self.set_debug_flag = set_debug_flag + + 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, + set_debug_flag=self.set_debug_flag) + + 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: This is a development server. ' + 'Do not use it in a production deployment.', 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, 9): + 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, 9): + 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='Run 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='Run a shell in the app context.') +@with_appcontext +def shell_command(): + """Run 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/backend/venv/lib/python3.7/site-packages/flask/config.py b/backend/venv/lib/python3.7/site-packages/flask/config.py new file mode 100644 index 0000000..a5475ed --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/config.py @@ -0,0 +1,269 @@ +# -*- 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) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + 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/backend/venv/lib/python3.7/site-packages/flask/ctx.py b/backend/venv/lib/python3.7/site-packages/flask/ctx.py new file mode 100644 index 0000000..ec8e787 --- /dev/null +++ b/backend/venv/lib/python3.7/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/backend/venv/lib/python3.7/site-packages/flask/debughelpers.py b/backend/venv/lib/python3.7/site-packages/flask/debughelpers.py new file mode 100644 index 0000000..e9765f2 --- /dev/null +++ b/backend/venv/lib/python3.7/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/backend/venv/lib/python3.7/site-packages/flask/globals.py b/backend/venv/lib/python3.7/site-packages/flask/globals.py new file mode 100644 index 0000000..7d50a6f --- /dev/null +++ b/backend/venv/lib/python3.7/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/backend/venv/lib/python3.7/site-packages/flask/helpers.py b/backend/venv/lib/python3.7/site-packages/flask/helpers.py new file mode 100644 index 0000000..158edc5 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/helpers.py @@ -0,0 +1,1051 @@ +# -*- 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 + falls back to the `Host` header, then to the IP and port of the request. + :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 + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + :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') + + if not isinstance(attachment_filename, text_type): + attachment_filename = attachment_filename.decode('utf-8') + + try: + attachment_filename = attachment_filename.encode('ascii') + except UnicodeEncodeError: + filenames = { + 'filename': unicodedata.normalize( + 'NFKD', attachment_filename).encode('ascii', '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/backend/venv/lib/python3.7/site-packages/flask/json/__init__.py b/backend/venv/lib/python3.7/site-packages/flask/json/__init__.py new file mode 100644 index 0000000..c24286c --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/flask/json/__init__.py @@ -0,0 +1,357 @@ +# -*- 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, app=None): + """Inject default arguments for dump functions.""" + if app is None: + app = current_app + + if app: + bp = app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', bp.json_encoder if bp and bp.json_encoder else app.json_encoder + ) + + if not app.config['JSON_AS_ASCII']: + kwargs.setdefault('ensure_ascii', False) + + kwargs.setdefault('sort_keys', app.config['JSON_SORT_KEYS']) + else: + kwargs.setdefault('sort_keys', True) + kwargs.setdefault('cls', JSONEncoder) + + +def _load_arg_defaults(kwargs, app=None): + """Inject default arguments for load functions.""" + if app is None: + app = current_app + + if app: + bp = app.blueprints.get(request.blueprint) if request else None + kwargs.setdefault( + 'cls', + bp.json_decoder if bp and bp.json_decoder + else 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, app=None, **kwargs): + """Serialize ``obj`` to a JSON-formatted string. If there is an + app context pushed, use the current app's configured encoder + (:attr:`~flask.Flask.json_encoder`), or fall back to the default + :class:`JSONEncoder`. + + Takes the same arguments as the built-in :func:`json.dumps`, and + does some extra configuration based on the application. If the + simplejson package is installed, it is preferred. + + :param obj: Object to serialize to JSON. + :param app: App instance to use to configure the JSON encoder. + Uses ``current_app`` if not given, and falls back to the default + encoder when not in an app context. + :param kwargs: Extra arguments passed to :func:`json.dumps`. + + .. versionchanged:: 1.0.3 + + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + _dump_arg_defaults(kwargs, app=app) + 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, app=None, **kwargs): + """Like :func:`dumps` but writes into a file object.""" + _dump_arg_defaults(kwargs, app=app) + 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, app=None, **kwargs): + """Deserialize an object from a JSON-formatted string ``s``. If + there is an app context pushed, use the current app's configured + decoder (:attr:`~flask.Flask.json_decoder`), or fall back to the + default :class:`JSONDecoder`. + + Takes the same arguments as the built-in :func:`json.loads`, and + does some extra configuration based on the application. If the + simplejson package is installed, it is preferred. + + :param s: JSON string to deserialize. + :param app: App instance to use to configure the JSON decoder. + Uses ``current_app`` if not given, and falls back to the default + encoder when not in an app context. + :param kwargs: Extra arguments passed to :func:`json.dumps`. + + .. versionchanged:: 1.0.3 + + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + _load_arg_defaults(kwargs, app=app) + 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, app=None, **kwargs): + """Like :func:`loads` but reads from a file object.""" + _load_arg_defaults(kwargs, app=app) + 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 ``') + # => <script> do_nasty_stuff() </script> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/backend/venv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('